comparison hgsubversion/svnwrap/subvertpy_wrapper.py @ 1457:019c3e194fba

tests: optimise creating repositories and loading dumps Previously, we'd use svnadmin for creating repositories and loading dumps. That tends to be a bit slow, as it forks a new process and loads the Subversion libraries into it. Instead, we extend our existing Subversion wrappers and load the dumps using the API. This is a noticable speedup. The only downside is that we rely on Subversion and Subvertpy to correctly close all file descriptors; an assumption which hasn't always held in the past. I ran some benchmarks on my relatively slow Mac with $TMPDIR on a ramdisk, and they showed a significant change: I compared ten runs of each with Subvertpy: min: -18.8% (299.1s -> 243.0s) median: -20.0% (307.1s -> 245.6s) ...and three runs of each with SWIG: min: -22.8% (368.7s -> 284.7s) median: -25.7% (384.4s -> 285.5s) (Since the timing measures wall clock time, the minimum time is likely to be the most accurate and useful measurement.)
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Tue, 07 Jun 2016 09:15:53 +0200
parents 63a29df4f661
children b95fa72c74ae
comparison
equal deleted inserted replaced
1456:77da55e0baa4 1457:019c3e194fba
20 try: 20 try:
21 from subvertpy import client 21 from subvertpy import client
22 from subvertpy import delta 22 from subvertpy import delta
23 from subvertpy import properties 23 from subvertpy import properties
24 from subvertpy import ra 24 from subvertpy import ra
25 from subvertpy import repos
25 import subvertpy 26 import subvertpy
26 except ImportError: 27 except ImportError:
27 raise ImportError('Subvertpy %d.%d.%d or later required, but not found' 28 raise ImportError('Subvertpy %d.%d.%d or later required, but not found'
28 % subvertpy_required) 29 % subvertpy_required)
29 30
48 def version(): 49 def version():
49 svnvers = _versionstr(subversion_version[:3]) 50 svnvers = _versionstr(subversion_version[:3])
50 if subversion_version[3]: 51 if subversion_version[3]:
51 svnvers += '-' + subversion_version[3] 52 svnvers += '-' + subversion_version[3]
52 return (svnvers, 'Subvertpy ' + _versionstr(subvertpy.__version__)) 53 return (svnvers, 'Subvertpy ' + _versionstr(subvertpy.__version__))
54
55 def create_and_load(repopath, dumpfd):
56 ''' create a new repository at repopath and load the given dump into it '''
57 repo = repos.create(repopath)
58
59 nullfd = open(os.devnull, 'w')
60
61 try:
62 repo.load_fs(dumpfd, nullfd, repos.LOAD_UUID_FORCE)
63 finally:
64 dumpfd.close()
65 nullfd.close()
53 66
54 # exported values 67 # exported values
55 ERR_FS_ALREADY_EXISTS = subvertpy.ERR_FS_ALREADY_EXISTS 68 ERR_FS_ALREADY_EXISTS = subvertpy.ERR_FS_ALREADY_EXISTS
56 ERR_FS_CONFLICT = subvertpy.ERR_FS_CONFLICT 69 ERR_FS_CONFLICT = subvertpy.ERR_FS_CONFLICT
57 ERR_FS_NOT_FOUND = subvertpy.ERR_FS_NOT_FOUND 70 ERR_FS_NOT_FOUND = subvertpy.ERR_FS_NOT_FOUND