Merge branch 'dm/ni-maxhost-may-be-missing' into maint-1.8.1
[git] / contrib / svn-fe / svnrdump_sim.py
1 #!/usr/bin/python
2 """
3 Simulates svnrdump by replaying an existing dump from a file, taking care
4 of the specified revision range.
5 To simulate incremental imports the environment variable SVNRMAX can be set
6 to the highest revision that should be available.
7 """
8 import sys, os
9
10
11 def getrevlimit():
12         var = 'SVNRMAX'
13         if os.environ.has_key(var):
14                 return os.environ[var]
15         return None
16
17 def writedump(url, lower, upper):
18         if url.startswith('sim://'):
19                 filename = url[6:]
20                 if filename[-1] == '/': filename = filename[:-1] #remove terminating slash
21         else:
22                 raise ValueError('sim:// url required')
23         f = open(filename, 'r');
24         state = 'header'
25         wroterev = False
26         while(True):
27                 l = f.readline()
28                 if l == '': break
29                 if state == 'header' and l.startswith('Revision-number: '):
30                         state = 'prefix'
31                 if state == 'prefix' and l == 'Revision-number: %s\n' % lower:
32                         state = 'selection'
33                 if not upper == 'HEAD' and state == 'selection' and l == 'Revision-number: %s\n' % upper:
34                         break;
35
36                 if state == 'header' or state == 'selection':
37                         if state == 'selection': wroterev = True
38                         sys.stdout.write(l)
39         return wroterev
40
41 if __name__ == "__main__":
42         if not (len(sys.argv) in (3, 4, 5)):
43                 print "usage: %s dump URL -rLOWER:UPPER"
44                 sys.exit(1)
45         if not sys.argv[1] == 'dump': raise NotImplementedError('only "dump" is suppported.')
46         url = sys.argv[2]
47         r = ('0', 'HEAD')
48         if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r':
49                 r = sys.argv[3][2:].lstrip().split(':')
50         if not getrevlimit() is None: r[1] = getrevlimit()
51         if writedump(url, r[0], r[1]): ret = 0
52         else: ret = 1
53         sys.exit(ret)