svnrdump_sim.py 2 KB
Newer Older
1 2 3 4 5 6 7
#!/usr/bin/python
"""
Simulates svnrdump by replaying an existing dump from a file, taking care
of the specified revision range.
To simulate incremental imports the environment variable SVNRMAX can be set
to the highest revision that should be available.
"""
Kai Sforza's avatar
Kai Sforza committed
8 9
import sys
import os
10

11
if sys.hexversion < 0x02040000:
Kai Sforza's avatar
Kai Sforza committed
12 13 14 15
    # The limiter is the ValueError() calls. This may be too conservative
    sys.stderr.write("svnrdump-sim.py: requires Python 2.4 or later.\n")
    sys.exit(1)

16 17

def getrevlimit():
Kai Sforza's avatar
Kai Sforza committed
18 19 20 21 22
    var = 'SVNRMAX'
    if var in os.environ:
        return os.environ[var]
    return None

23 24

def writedump(url, lower, upper):
Kai Sforza's avatar
Kai Sforza committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
    if url.startswith('sim://'):
        filename = url[6:]
        if filename[-1] == '/':
            filename = filename[:-1]  # remove terminating slash
    else:
        raise ValueError('sim:// url required')
    f = open(filename, 'r')
    state = 'header'
    wroterev = False
    while(True):
        l = f.readline()
        if l == '':
            break
        if state == 'header' and l.startswith('Revision-number: '):
            state = 'prefix'
        if state == 'prefix' and l == 'Revision-number: %s\n' % lower:
            state = 'selection'
        if not upper == 'HEAD' and state == 'selection' and \
                l == 'Revision-number: %s\n' % upper:
            break
45

Kai Sforza's avatar
Kai Sforza committed
46 47 48 49 50
        if state == 'header' or state == 'selection':
            if state == 'selection':
                wroterev = True
            sys.stdout.write(l)
    return wroterev
51 52

if __name__ == "__main__":
Kai Sforza's avatar
Kai Sforza committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    if not (len(sys.argv) in (3, 4, 5)):
        print("usage: %s dump URL -rLOWER:UPPER")
        sys.exit(1)
    if not sys.argv[1] == 'dump':
        raise NotImplementedError('only "dump" is suppported.')
    url = sys.argv[2]
    r = ('0', 'HEAD')
    if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r':
        r = sys.argv[3][2:].lstrip().split(':')
    if not getrevlimit() is None:
        r[1] = getrevlimit()
    if writedump(url, r[0], r[1]):
        ret = 0
    else:
        ret = 1
    sys.exit(ret)