Skip to content

Commit

Permalink
Add a svnrdump-simulator replaying a dump file for testing
Browse files Browse the repository at this point in the history
To ease testing without depending on a reachable svn server, this
compact python script mimics parts of svnrdumps behaviour.  It
requires the remote url to start with sim://.

Start and end revisions are evaluated.  If the requested revision
doesn't exist, as it is the case with incremental imports, if no new
commit was added, it returns 1 (like svnrdump).

To allow using the same dump file for simulating multiple incremental
imports, the highest revision can be limited by setting the environment
variable SVNRMAX to that value. This simulates the situation where
higher revs don't exist yet.

Signed-off-by: Florian Achleitner <[email protected]>
Acked-by: David Michael Barr <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
flyingflo authored and gitster committed Oct 7, 2012
1 parent 8e43a1d commit 16a7185
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions contrib/svn-fe/svnrdump_sim.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/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.
"""
import sys, os


def getrevlimit():
var = 'SVNRMAX'
if os.environ.has_key(var):
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 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)

0 comments on commit 16a7185

Please sign in to comment.