1 import datetime
, os
, os
.path
, subprocess
, sys
5 return 86400*d
.days
+ d
.seconds
+ 1e-6*d
.microseconds
11 def __logfile(self
, cmd
):
12 fn
= os
.path
.join(os
.getcwd(), '%04d.log' %
len(self
.__log
))
14 f
.write(' '.join(cmd
) + '\n' + '-'*70 + '\n\n')
17 def __call__(self
, *cmd
, **args
):
18 env
= dict(os
.environ
)
19 env
['STGIT_SUBPROCESS_LOG'] = 'profile:' + self
.__logfile(cmd
)
20 kwargs
= { 'cwd': self
.__cwd
, 'env': env
}
21 if args
.get('capture_stdout', False):
22 kwargs
['stdout'] = subprocess
.PIPE
23 start
= datetime
.datetime
.now()
24 p
= subprocess
.Popen(cmd
, **kwargs
)
25 (out
, err
) = p
.communicate()
26 stop
= datetime
.datetime
.now()
27 self
.__log
.append((cmd
, duration(start
, stop
)))
32 def pcmd(c
): return ' '.join(c
)
33 def ptime(t
): return '%.3f' % t
34 (cs
, times
) = zip(*self
.__log
)
36 cl
= max(len(pcmd(c
)) for c
in cs
)
37 tl
= max(len(ptime(t
)) for t
in list(times
) + [ttime
])
38 for (c
, t
) in self
.__log
:
39 print '%*s %*s' %
(tl
, ptime(t
), -cl
, pcmd(c
))
40 print '%*s' %
(tl
, ptime(ttime
))
44 def perftest(desc
, name
= None):
50 perftests
[name
or f
.__name__
] = g
51 perftestdesc
[name
or f
.__name__
] = desc
55 def copy_testdir(dir):
58 r('rsync', '-a', '--delete', dir + '.orig/', tmp
)
61 def new_rebase(r
, ref
):
62 top
= r('stg', 'top', capture_stdout
= True)
64 r('git', 'reset', '--hard', ref
)
65 r('stg', 'goto', top
.strip())
67 def old_rebase(r
, ref
):
68 r('stg', 'rebase', ref
)
70 def def_rebasetest(rebase
, dir, tag
):
71 @perftest('%s rebase onto %s in %s' %
(rebase
, tag
, dir),
72 'rebase-%srebase-%s-%s' %
(rebase
, tag
, dir))
74 r
.cd(copy_testdir(dir))
77 r('stg', 'uncommit', '-n', '500')
79 r('stg', 'uncommit', '-x', '-t', 'bomb-base')
84 for rebase
in ['old', 'new']:
85 for (dir, tag
) in [('synt', 'add-file'),
86 ('synt', 'modify-all'),
87 ('linux', 'add-file')]:
88 def_rebasetest(rebase
, dir, tag
)
92 for (fun
, desc
) in sorted(perftestdesc
.iteritems()):
93 print '%s: %s' %
(fun
, desc
)