in tools/dev/benchmarks/suite1/benchmark.py [0:0]
def perform_run(batch, run_kind,
svn_bin, svnadmin_bin, verbose):
run = Run(batch, run_kind)
def create_tree(in_dir, _levels, _spread):
try:
os.mkdir(in_dir)
except:
pass
for i in range(_spread):
# files
fn = j(in_dir, next_unique_basename('file'))
f = open(fn, 'w')
f.write('This is %s\n' % fn)
f.close()
# dirs
if (_levels > 1):
dn = j(in_dir, next_unique_basename('dir'))
create_tree(dn, _levels - 1, _spread)
def svn(*args):
name = args[0]
cmd = [ svn_bin ]
cmd.extend( list(args) )
if verbose:
print('svn cmd:', ' '.join(cmd))
stdin = None
if stdin:
stdin_arg = subprocess.PIPE
else:
stdin_arg = None
run.tic(name)
try:
p = subprocess.Popen(cmd,
stdin=stdin_arg,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=False)
stdout,stderr = p.communicate(input=stdin)
except OSError:
stdout = stderr = None
finally:
run.toc()
if verbose:
if (stdout):
print("STDOUT: [[[\n%s]]]" % ''.join(stdout))
if (stderr):
print("STDERR: [[[\n%s]]]" % ''.join(stderr))
return stdout,stderr
def add(*args):
return svn('add', *args)
def ci(*args):
return svn('commit', '-mm', *args)
def up(*args):
return svn('update', *args)
def st(*args):
return svn('status', *args)
def info(*args):
return svn('info', *args)
_chars = [chr(x) for x in range(ord('a'), ord('z') +1)]
def randstr(len=8):
return ''.join( [random.choice(_chars) for i in range(len)] )
def _copy(path):
dest = next_unique_basename(path + '_copied')
svn('copy', path, dest)
def _move(path):
dest = path + '_moved'
svn('move', path, dest)
def _propmod(path):
so, se = svn('proplist', path)
propnames = [line.strip() for line in so.strip().split('\n')[1:]]
# modify?
if len(propnames):
svn('ps', propnames[len(propnames) / 2], randstr(), path)
# del?
if len(propnames) > 1:
svn('propdel', propnames[len(propnames) / 2], path)
def _propadd(path):
# set a new one.
svn('propset', randstr(), randstr(), path)
def _mod(path):
if os.path.isdir(path):
_propmod(path)
return
f = open(path, 'a')
f.write('\n%s\n' % randstr())
f.close()
def _add(path):
if os.path.isfile(path):
return _mod(path)
if random.choice((True, False)):
# create a dir
svn('mkdir', j(path, next_unique_basename('new_dir')))
else:
# create a file
new_path = j(path, next_unique_basename('new_file'))
f = open(new_path, 'w')
f.write(randstr())
f.close()
svn('add', new_path)
def _del(path):
svn('delete', path)
_mod_funcs = (_mod, _add, _propmod, _propadd, )#_copy,) # _move, _del)
def modify_tree(in_dir, fraction):
child_names = os.listdir(in_dir)
for child_name in child_names:
if child_name[0] == '.':
continue
if random.random() < fraction:
path = j(in_dir, child_name)
random.choice(_mod_funcs)(path)
for child_name in child_names:
if child_name[0] == '.': continue
path = j(in_dir, child_name)
if os.path.isdir(path):
modify_tree(path, fraction)
def propadd_tree(in_dir, fraction):
for child_name in os.listdir(in_dir):
if child_name[0] == '.': continue
path = j(in_dir, child_name)
if random.random() < fraction:
_propadd(path)
if os.path.isdir(path):
propadd_tree(path, fraction)
def rmtree_onerror(func, path, exc_info):
"""Error handler for ``shutil.rmtree``.
If the error is due to an access error (read only file)
it attempts to add write permission and then retries.
If the error is for another reason it re-raises the error.
Usage : ``shutil.rmtree(path, onerror=onerror)``
"""
if not os.access(path, os.W_OK):
# Is the error an access error ?
os.chmod(path, stat.S_IWUSR)
func(path)
else:
raise
base = tempfile.mkdtemp()
# ensure identical modifications for every run
random.seed(0)
aborted = True
try:
repos = j(base, 'repos')
repos = repos.replace('\\', '/')
wc = j(base, 'wc')
wc2 = j(base, 'wc2')
if repos.startswith('/'):
file_url = 'file://%s' % repos
else:
file_url = 'file:///%s' % repos
print('\nRunning svn benchmark in', base)
print('dir levels: %s; new files and dirs per leaf: %s' %(
run_kind.levels, run_kind.spread))
started = datetime.datetime.now()
try:
run_cmd([svnadmin_bin, 'create', repos])
svn('checkout', file_url, wc)
trunk = j(wc, 'trunk')
create_tree(trunk, run_kind.levels, run_kind.spread)
add(trunk)
st(wc)
ci(wc)
up(wc)
propadd_tree(trunk, 0.05)
ci(wc)
up(wc)
st(wc)
info('-R', wc)
trunk_url = file_url + '/trunk'
branch_url = file_url + '/branch'
svn('copy', '-mm', trunk_url, branch_url)
st(wc)
up(wc)
st(wc)
info('-R', wc)
svn('checkout', trunk_url, wc2)
st(wc2)
modify_tree(wc2, 0.5)
st(wc2)
ci(wc2)
up(wc2)
up(wc)
svn('switch', branch_url, wc2)
modify_tree(wc2, 0.5)
st(wc2)
info('-R', wc2)
ci(wc2)
up(wc2)
up(wc)
modify_tree(trunk, 0.5)
st(wc)
ci(wc)
up(wc2)
up(wc)
svn('merge', '--accept=postpone', trunk_url, wc2)
st(wc2)
info('-R', wc2)
svn('resolve', '--accept=mine-conflict', wc2)
st(wc2)
svn('resolved', '-R', wc2)
st(wc2)
info('-R', wc2)
ci(wc2)
up(wc2)
up(wc)
svn('merge', '--accept=postpone', '--reintegrate', branch_url, trunk)
st(wc)
svn('resolve', '--accept=mine-conflict', wc)
st(wc)
svn('resolved', '-R', wc)
st(wc)
ci(wc)
up(wc2)
up(wc)
svn('delete', j(wc, 'branch'))
ci(wc)
up(wc)
aborted = False
finally:
stopped = datetime.datetime.now()
print('\nDone with svn benchmark in', (stopped - started))
run.remember_timing(TOTAL_RUN,
timedelta_to_seconds(stopped - started))
finally:
run.done(aborted)
run.submit_timings()
shutil.rmtree(base, onerror=rmtree_onerror)
return aborted