Show More
@@ -23,14 +23,15 b' def maketemplater(ui, repo, tmpl):' | |||
|
23 | 23 | return t |
|
24 | 24 | |
|
25 | 25 | def changedlines(ui, repo, ctx1, ctx2, fns): |
|
26 | lines = 0 | |
|
26 | added, removed = 0, 0 | |
|
27 | 27 | fmatch = cmdutil.matchfiles(repo, fns) |
|
28 | 28 | diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node(), fmatch)) |
|
29 | 29 | for l in diff.split('\n'): |
|
30 |
if |
|
|
31 | l.startswith("-") and not l.startswith("--- ")): | |
|
32 | lines += 1 | |
|
33 | return lines | |
|
30 | if l.startswith("+") and not l.startswith("+++ "): | |
|
31 | added += 1 | |
|
32 | elif l.startswith("-") and not l.startswith("--- "): | |
|
33 | removed += 1 | |
|
34 | return (added, removed) | |
|
34 | 35 | |
|
35 | 36 | def countrate(ui, repo, amap, *pats, **opts): |
|
36 | 37 | """Calculate stats""" |
@@ -71,7 +72,7 b' def countrate(ui, repo, amap, *pats, **o' | |||
|
71 | 72 | |
|
72 | 73 | ctx1 = parents[0] |
|
73 | 74 | lines = changedlines(ui, repo, ctx1, ctx, fns) |
|
74 |
rate[key] = rate.get(key, 0) |
|
|
75 | rate[key] = [r + l for r, l in zip(rate.get(key, (0, 0)), lines)] | |
|
75 | 76 | |
|
76 | 77 | if opts.get('progress'): |
|
77 | 78 | count += 1 |
@@ -143,20 +144,35 b' def churn(ui, repo, *pats, **opts):' | |||
|
143 | 144 | if not rate: |
|
144 | 145 | return |
|
145 | 146 | |
|
146 | sortkey = ((not opts.get('sort')) and (lambda x: -x[1]) or None) | |
|
147 | sortkey = ((not opts.get('sort')) and (lambda x: -sum(x[1])) or None) | |
|
147 | 148 | rate.sort(key=sortkey) |
|
148 | 149 | |
|
149 | 150 | # Be careful not to have a zero maxcount (issue833) |
|
150 | maxcount = float(max(v for k, v in rate)) or 1.0 | |
|
151 | maxcount = float(max(sum(v) for k, v in rate)) or 1.0 | |
|
151 | 152 | maxname = max(len(k) for k, v in rate) |
|
152 | 153 | |
|
153 | 154 | ttywidth = util.termwidth() |
|
154 | 155 | ui.debug("assuming %i character terminal\n" % ttywidth) |
|
155 |
width = ttywidth - maxname - 2 - |
|
|
156 | width = ttywidth - maxname - 2 - 2 - 2 | |
|
156 | 157 | |
|
157 | for date, count in rate: | |
|
158 | print "%s %6d %s" % (pad(date, maxname), count, | |
|
159 | "*" * int(count * width / maxcount)) | |
|
158 | if opts.get('diffstat'): | |
|
159 | width -= 15 | |
|
160 | def format(name, (added, removed)): | |
|
161 | return "%s %15s %s%s\n" % (pad(name, maxname), | |
|
162 | '+%d/-%d' % (added, removed), | |
|
163 | '+' * charnum(added), | |
|
164 | '-' * charnum(removed)) | |
|
165 | else: | |
|
166 | width -= 6 | |
|
167 | def format(name, count): | |
|
168 | return "%s %6d %s\n" % (pad(name, maxname), sum(count), | |
|
169 | '*' * charnum(sum(count))) | |
|
170 | ||
|
171 | def charnum(count): | |
|
172 | return int(round(count*width/maxcount)) | |
|
173 | ||
|
174 | for name, count in rate: | |
|
175 | ui.write(format(name, count)) | |
|
160 | 176 | |
|
161 | 177 | |
|
162 | 178 | cmdtable = { |
@@ -169,6 +185,7 b' cmdtable = {' | |||
|
169 | 185 | _('strftime-compatible format for grouping by date')), |
|
170 | 186 | ('c', 'changesets', False, _('count rate by number of changesets')), |
|
171 | 187 | ('s', 'sort', False, _('sort by key (default: sort by count)')), |
|
188 | ('', 'diffstat', False, _('display added/removed lines separately')), | |
|
172 | 189 | ('', 'aliases', '', _('file with email aliases')), |
|
173 | 190 | ('', 'progress', None, _('show progress'))], |
|
174 | 191 | _("hg churn [-d DATE] [-r REV] [--aliases FILE] [--progress] [FILE]")), |
@@ -50,6 +50,11 b' COLUMNS=40 hg churn' | |||
|
50 | 50 | echo % churn by hour |
|
51 | 51 | hg churn -f '%H' -s |
|
52 | 52 | |
|
53 | echo % churn with separated added/removed lines | |
|
54 | hg rm d/g/f2.txt | |
|
55 | hg ci -Am "removed d/g/f2.txt" -u user1 -d 14:00 d/g/f2.txt | |
|
56 | hg churn --diffstat | |
|
57 | ||
|
53 | 58 | cd .. |
|
54 | 59 | |
|
55 | 60 | # issue 833: ZeroDivisionError |
@@ -10,7 +10,7 b' user1 3 ***************************' | |||
|
10 | 10 | user2 2 ****************************************** |
|
11 | 11 | % churn up to rev 2 |
|
12 | 12 | user2 2 *************************************************************** |
|
13 | user1 1 ******************************* | |
|
13 | user1 1 ******************************** | |
|
14 | 14 | % churn with aliases |
|
15 | 15 | alias3 3 ************************************************************** |
|
16 | 16 | alias1 3 ************************************************************** |
@@ -24,9 +24,13 b' user3 3 ***********************' | |||
|
24 | 24 | user1 3 *********************** |
|
25 | 25 | user2 2 *************** |
|
26 | 26 | % churn by hour |
|
27 | 06 1 **************** | |
|
27 | 06 1 ***************** | |
|
28 | 28 | 09 2 ********************************* |
|
29 | 29 | 12 4 ****************************************************************** |
|
30 | 13 1 **************** | |
|
30 | 13 1 ***************** | |
|
31 | % churn with separated added/removed lines | |
|
32 | user1 +3/-1 +++++++++++++++++++++++++++++++++++++++++-------------- | |
|
33 | user3 +3/-0 +++++++++++++++++++++++++++++++++++++++++ | |
|
34 | user2 +2/-0 +++++++++++++++++++++++++++ | |
|
31 | 35 | adding foo |
|
32 | 36 | test 0 |
General Comments 0
You need to be logged in to leave comments.
Login now