blob: e5ed04bf9cce08a2033342727109dcec7526b99c [file] [log] [blame]
import datetime, os, os.path, subprocess, sys
def duration(t1, t2):
d = t2 - t1
return 86400*d.days + d.seconds + 1e-6*d.microseconds
class Run(object):
def __init__(self):
self.__cwd = None
self.__log = []
def __logfile(self, cmd):
fn = os.path.join(os.getcwd(), '%04d.log' % len(self.__log))
f = open(fn, 'w')
f.write(' '.join(cmd) + '\n' + '-'*70 + '\n\n')
f.close()
return fn
def __call__(self, *cmd, **args):
env = dict(os.environ)
env['STGIT_SUBPROCESS_LOG'] = 'profile:' + self.__logfile(cmd)
kwargs = { 'cwd': self.__cwd, 'env': env }
if args.get('capture_stdout', False):
kwargs['stdout'] = subprocess.PIPE
start = datetime.datetime.now()
p = subprocess.Popen(cmd, **kwargs)
(out, err) = p.communicate()
stop = datetime.datetime.now()
self.__log.append((cmd, duration(start, stop)))
return out
def cd(self, dir):
self.__cwd = dir
def summary(self):
def pcmd(c): return ' '.join(c)
def ptime(t): return '%.3f' % t
(cs, times) = zip(*self.__log)
ttime = sum(times)
cl = max(len(pcmd(c)) for c in cs)
tl = max(len(ptime(t)) for t in list(times) + [ttime])
for (c, t) in self.__log:
print '%*s %*s' % (tl, ptime(t), -cl, pcmd(c))
print '%*s' % (tl, ptime(ttime))
perftests = {}
perftestdesc = {}
def perftest(desc, name = None):
def decorator(f):
def g():
r = Run()
f(r)
r.summary()
perftests[name or f.__name__] = g
perftestdesc[name or f.__name__] = desc
return g
return decorator
def copy_testdir(dir):
tmp = dir + '.trash'
r = Run()
r('rsync', '-a', '--delete', dir + '.orig/', tmp)
return tmp
def new_rebase(r, ref):
top = r('stg', 'top', capture_stdout = True)
r('stg', 'pop', '-a')
r('git', 'reset', '--hard', ref)
r('stg', 'goto', top.strip())
def old_rebase(r, ref):
r('stg', 'rebase', ref)
def def_rebasetest(rebase, dir, tag):
@perftest('%s rebase onto %s in %s' % (rebase, tag, dir),
'rebase-%srebase-%s-%s' % (rebase, tag, dir))
def rebasetest(r):
r.cd(copy_testdir(dir))
r('stg', 'init')
if dir == 'synt':
r('stg', 'uncommit', '-n', '500')
else:
r('stg', 'uncommit', '-x', '-t', 'bomb-base')
if rebase == 'new':
new_rebase(r, tag)
else:
old_rebase(r, tag)
for rebase in ['old', 'new']:
for (dir, tag) in [('synt', 'add-file'),
('synt', 'modify-all'),
('linux', 'add-file')]:
def_rebasetest(rebase, dir, tag)
args = sys.argv[1:]
if len(args) == 0:
for (fun, desc) in sorted(perftestdesc.iteritems()):
print '%s: %s' % (fun, desc)
else:
for test in args:
perftests[test]()