1 import datetime, subprocess, sys
5 return 86400*d.days + d.seconds + 1e-6*d.microseconds
11 def __call__(self, *cmd, **args):
12 kwargs = { 'cwd': self.__cwd }
13 if args.get('capture_stdout', False):
14 kwargs['stdout'] = subprocess.PIPE
15 start = datetime.datetime.now()
16 p = subprocess.Popen(cmd, **kwargs)
17 (out, err) = p.communicate()
18 stop = datetime.datetime.now()
19 self.__log.append((cmd, duration(start, stop)))
24 def pcmd(c): return ' '.join(c)
25 def ptime(t): return '%.3f' % t
26 (cs, times) = zip(*self.__log)
28 cl = max(len(pcmd(c)) for c in cs)
29 tl = max(len(ptime(t)) for t in list(times) + [ttime])
30 for (c, t) in self.__log:
31 print '%*s %*s' % (tl, ptime(t), -cl, pcmd(c))
32 print '%*s' % (tl, ptime(ttime))
36 def perftest(desc, name = None):
42 perftests[name or f.__name__] = g
43 perftestdesc[name or f.__name__] = desc
47 def copy_testdir(dir):
50 r('rsync', '-a', '--delete', dir + '.orig/', tmp)
53 def new_rebase(r, ref):
54 top = r('stg', 'top', capture_stdout = True)
56 r('git', 'reset', '--hard', ref)
57 r('stg', 'goto', top.strip())
59 def old_rebase(r, ref):
60 r('stg', 'rebase', ref)
62 def def_rebasetest(rebase, dir, tag):
63 @perftest('%s rebase onto %s in %s' % (rebase, tag, dir),
64 'rebase-%srebase-%s-%s' % (rebase, tag, dir))
66 r.cd(copy_testdir(dir))
69 r('stg', 'uncommit', '-n', '500')
71 r('stg', 'uncommit', '-x', '-t', 'bomb-base')
76 for rebase in ['old', 'new']:
77 for (dir, tag) in [('synt', 'add-file'),
78 ('synt', 'modify-all'),
79 ('linux', 'add-file')]:
80 def_rebasetest(rebase, dir, tag)
84 for (fun, desc) in sorted(perftestdesc.iteritems()):
85 print '%s: %s' % (fun, desc)