comparison hgext/churn.py @ 3050:dd1a142988d3

[churn] progress meter
author Josef "Jeff" Sipek <jeffpc@josefsipek.net>
date Sun, 03 Sep 2006 16:30:07 -0400
parents 461573aa02ef
children 7ffaf5aba4d8
comparison
equal deleted inserted replaced
3049:461573aa02ef 3050:dd1a142988d3
68 for f in unknown: 68 for f in unknown:
69 lines += dirtywork(f, mmap1, mmap2) 69 lines += dirtywork(f, mmap1, mmap2)
70 70
71 return (who, lines) 71 return (who, lines)
72 72
73 def gather_stats(ui, repo, amap, revs=None): 73 def gather_stats(ui, repo, amap, revs=None, progress=False):
74 stats = {} 74 stats = {}
75 75
76 cl = repo.changelog 76 cl = repo.changelog
77 77
78 if not revs: 78 if not revs:
79 revs = range(0, cl.count()) 79 revs = range(0, cl.count())
80 80
81 nr_revs = len(revs)
82 cur_rev = 0
83
81 for rev in revs: 84 for rev in revs:
82 node2 = cl.node(rev) 85 node2 = cl.node(rev)
83 node1 = cl.parents(node2)[0] 86 node1 = cl.parents(node2)[0]
84 87
85 if cl.parents(node2)[1] != node.nullid: 88 if cl.parents(node2)[1] != node.nullid:
86 ui.note(_('Revision %d is a merge, ignoring...\n') % (rev,)) 89 ui.note(_('Revision %d is a merge, ignoring...\n') % (rev,))
87 continue 90 continue
88 91
89 who, lines = __gather(ui, repo, node1, node2) 92 who, lines = __gather(ui, repo, node1, node2)
90 93
91 # remap the owner if possible 94 # remap the owner if possible
92 if amap.has_key(who): 95 if amap.has_key(who):
96 if not stats.has_key(who): 99 if not stats.has_key(who):
97 stats[who] = 0 100 stats[who] = 0
98 stats[who] += lines 101 stats[who] += lines
99 102
100 ui.note("rev %d: %d lines by %s\n" % (rev, lines, who)) 103 ui.note("rev %d: %d lines by %s\n" % (rev, lines, who))
104
105 cur_rev += 1
106 if progress:
107 if int(100.0*(cur_rev - 1)/nr_revs) < int(100.0*cur_rev/nr_revs):
108 ui.write("%d%%.." % (int(100.0*cur_rev/nr_revs),))
109 sys.stdout.flush()
110
111 if progress:
112 ui.write("done\n")
113 sys.stdout.flush()
101 114
102 return stats 115 return stats
103 116
104 def churn(ui, repo, **opts): 117 def churn(ui, repo, **opts):
105 "Graphs the number of lines changed" 118 "Graphs the number of lines changed"
136 amap = get_aliases(f) 149 amap = get_aliases(f)
137 f.close() 150 f.close()
138 151
139 revs = [int(r) for r in commands.revrange(ui, repo, opts['rev'])] 152 revs = [int(r) for r in commands.revrange(ui, repo, opts['rev'])]
140 revs.sort() 153 revs.sort()
141 stats = gather_stats(ui, repo, amap, revs) 154 stats = gather_stats(ui, repo, amap, revs, opts.get('progress'))
142 155
143 # make a list of tuples (name, lines) and sort it in descending order 156 # make a list of tuples (name, lines) and sort it in descending order
144 ordered = stats.items() 157 ordered = stats.items()
145 ordered.sort(cmp=lambda x, y: cmp(y[1], x[1])) 158 ordered.sort(cmp=lambda x, y: cmp(y[1], x[1]))
146 159
157 170
158 cmdtable = { 171 cmdtable = {
159 "churn": 172 "churn":
160 (churn, 173 (churn,
161 [('r', 'rev', [], _('limit statistics to the specified revisions')), 174 [('r', 'rev', [], _('limit statistics to the specified revisions')),
162 ('', 'aliases', '', _('file with email aliases'))], 175 ('', 'aliases', '', _('file with email aliases')),
163 'hg churn [-r revision range] [-a file]'), 176 ('', 'progress', None, _('show progress'))],
177 'hg churn [-r revision range] [-a file] [--progress]'),
164 } 178 }