summaryrefslogtreecommitdiff
path: root/contrib/svn-fe/svnrdump_sim.py
blob: 8a3cee617524a42aed553616a0b9551e5d7310c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env 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.
"""
import sys
import os
 
if sys.hexversion < 0x02040000:
    # 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)
 
 
def getrevlimit():
    var = 'SVNRMAX'
    if var in os.environ:
        return os.environ[var]
    return None
 
 
def writedump(url, lower, upper):
    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
 
        if state == 'header' or state == 'selection':
            if state == 'selection':
                wroterev = True
            sys.stdout.write(l)
    return wroterev
 
if __name__ == "__main__":
    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 supported.')
    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)