annotate hgext/churn.py @ 40379:41506e3b04ee

keepalive: use getattr to avoid AttributeErrors when vcr is in use Fixes test-phabricator.t. Differential Revision: https://phab.mercurial-scm.org/D5160
author Augie Fackler <augie@google.com>
date Fri, 19 Oct 2018 11:45:51 -0400
parents c303d65d2e34
children 2372284d9457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
1 # churn.py - create a graph of revisions count grouped by template
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
2 #
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
3 # Copyright 2006 Josef "Jeff" Sipek <jeffpc@josefsipek.net>
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
4 # Copyright 2008 Alexander Solovyov <piranha@piranha.org.ua>
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
5 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8085
diff changeset
6 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9672
diff changeset
7 # GNU General Public License version 2 or any later version.
8228
eee2319c5895 add blank line after copyright notices and after header
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
8
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
9 '''command to display statistics about repository history'''
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
10
40241
81e4f039a0cd churn: use integer division consistently
Augie Fackler <augie@google.com>
parents: 40240
diff changeset
11 from __future__ import absolute_import, division
28094
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
12
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
13 import datetime
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
14 import os
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
15 import time
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
16
7051
5f201f711932 i18n, churn: mark string for translation
Martin Geisler <mg@daimi.au.dk>
parents: 6955
diff changeset
17 from mercurial.i18n import _
28094
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
18 from mercurial import (
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
19 cmdutil,
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
20 encoding,
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
21 logcmdutil,
28094
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
22 patch,
34974
26ed66ab1e72 py3: handle keyword arguments in hgext/churn.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32837
diff changeset
23 pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32198
diff changeset
24 registrar,
28094
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
25 scmutil,
79fc627578ac churn: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
26 )
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36392
diff changeset
27 from mercurial.utils import dateutil
4955
9bbc0217209b churn: get current terminal width if possible
Christian Ebert <blacktrash@gmx.net>
parents: 3963
diff changeset
28
21245
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
29 cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32198
diff changeset
30 command = registrar.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 28628
diff changeset
31 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
32 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
33 # be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
34 # leave the attribute unspecified.
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 28628
diff changeset
35 testedwith = 'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16231
diff changeset
36
7870
7bcce39e8f07 Returns lines changed for paths specified as arguments correctly.
madhu@madhu
parents: 7762
diff changeset
37 def changedlines(ui, repo, ctx1, ctx2, fns):
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
38 added, removed = 0, 0
14322
a90131b85fd8 scmutil: drop aliases in cmdutil for match functions
Matt Mackall <mpm@selenic.com>
parents: 14040
diff changeset
39 fmatch = scmutil.matchfiles(repo, fns)
7870
7bcce39e8f07 Returns lines changed for paths specified as arguments correctly.
madhu@madhu
parents: 7762
diff changeset
40 diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node(), fmatch))
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
41 for l in diff.split('\n'):
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
42 if l.startswith("+") and not l.startswith("+++ "):
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
43 added += 1
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
44 elif l.startswith("-") and not l.startswith("--- "):
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
45 removed += 1
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
46 return (added, removed)
3050
dd1a142988d3 [churn] progress meter
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 3049
diff changeset
47
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
48 def countrate(ui, repo, amap, *pats, **opts):
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
49 """Calculate stats"""
34974
26ed66ab1e72 py3: handle keyword arguments in hgext/churn.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32837
diff changeset
50 opts = pycompat.byteskwargs(opts)
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
51 if opts.get('dateformat'):
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
52 def getkey(ctx):
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
53 t, tz = ctx.date()
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
54 date = datetime.datetime(*time.gmtime(float(t) - tz)[:6])
40240
6f3e733848ae churn: fix stack traces on Python 3
Augie Fackler <augie@google.com>
parents: 38401
diff changeset
55 return encoding.strtolocal(
6f3e733848ae churn: fix stack traces on Python 3
Augie Fackler <augie@google.com>
parents: 38401
diff changeset
56 date.strftime(encoding.strfromlocal(opts['dateformat'])))
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
57 else:
24139
73b3218bb078 churn: deprecate -t option in favour of -T
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23091
diff changeset
58 tmpl = opts.get('oldtemplate') or opts.get('template')
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34974
diff changeset
59 tmpl = logcmdutil.maketemplater(ui, repo, tmpl)
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
60 def getkey(ctx):
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
61 ui.pushbuffer()
7369
87158be081b8 cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7308
diff changeset
62 tmpl.show(ctx)
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
63 return ui.popbuffer()
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
64
38401
5c0f06a8b497 churn: use progess helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38124
diff changeset
65 progress = ui.makeprogress(_('analyzing'), unit=_('revisions'),
5c0f06a8b497 churn: use progess helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38124
diff changeset
66 total=len(repo))
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
67 rate = {}
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
68 df = False
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
69 if opts.get('date'):
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36392
diff changeset
70 df = dateutil.matchdate(opts['date'])
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
71
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14322
diff changeset
72 m = scmutil.match(repo[None], pats, opts)
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9655
diff changeset
73 def prep(ctx, fns):
9654
96fe91be9c1e walkchangerevs: yield contexts
Matt Mackall <mpm@selenic.com>
parents: 9652
diff changeset
74 rev = ctx.rev()
9367
1ef630452e0b cmdutil: use context objects for walkchangerevs()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9321
diff changeset
75 if df and not df(ctx.date()[0]): # doesn't match date format
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9655
diff changeset
76 return
3049
461573aa02ef [churn] Ignore merge csets
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 3048
diff changeset
77
14040
9d2be7e17fc1 churn: strip key earlier to avoid false negative seach in aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 13123
diff changeset
78 key = getkey(ctx).strip()
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
79 key = amap.get(key, key) # alias remap
7070
2627ef59195d churn and stats commands merged
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7065
diff changeset
80 if opts.get('changesets'):
9670
7d56b6ffef72 churn: fix changeset count (broken by 9b127e888640)
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9669
diff changeset
81 rate[key] = (rate.get(key, (0,))[0] + 1, 0)
7070
2627ef59195d churn and stats commands merged
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7065
diff changeset
82 else:
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
83 parents = ctx.parents()
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
84 if len(parents) > 1:
16924
21b12b22c024 churn: lowercase message
Martin Geisler <mg@aragost.com>
parents: 16743
diff changeset
85 ui.note(_('revision %d is a merge, ignoring...\n') % (rev,))
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9655
diff changeset
86 return
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
87
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
88 ctx1 = parents[0]
7870
7bcce39e8f07 Returns lines changed for paths specified as arguments correctly.
madhu@madhu
parents: 7762
diff changeset
89 lines = changedlines(ui, repo, ctx1, ctx, fns)
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
90 rate[key] = [r + l for r, l in zip(rate.get(key, (0, 0)), lines)]
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
91
38401
5c0f06a8b497 churn: use progess helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38124
diff changeset
92 progress.increment()
3050
dd1a142988d3 [churn] progress meter
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 3049
diff changeset
93
9665
1de5ebfa5585 walkchangerevs: drop ui arg
Matt Mackall <mpm@selenic.com>
parents: 9662
diff changeset
94 for ctx in cmdutil.walkchangerevs(repo, m, opts, prep):
9662
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9655
diff changeset
95 continue
f3d60543924f walkchangerevs: move 'add' to callback
Matt Mackall <mpm@selenic.com>
parents: 9655
diff changeset
96
38401
5c0f06a8b497 churn: use progess helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38124
diff changeset
97 progress.complete()
3050
dd1a142988d3 [churn] progress meter
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 3049
diff changeset
98
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
99 return rate
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
100
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
101
21245
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
102 @command('churn',
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
103 [('r', 'rev', [],
23091
8d43c6bb38c0 doc: change 'revision or range' to 'revision or revset'
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21779
diff changeset
104 _('count rate for the specified revision or revset'), _('REV')),
21245
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
105 ('d', 'date', '',
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
106 _('count rate for revisions matching date spec'), _('DATE')),
24139
73b3218bb078 churn: deprecate -t option in favour of -T
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23091
diff changeset
107 ('t', 'oldtemplate', '',
73b3218bb078 churn: deprecate -t option in favour of -T
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23091
diff changeset
108 _('template to group changesets (DEPRECATED)'), _('TEMPLATE')),
73b3218bb078 churn: deprecate -t option in favour of -T
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23091
diff changeset
109 ('T', 'template', '{author|email}',
21245
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
110 _('template to group changesets'), _('TEMPLATE')),
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
111 ('f', 'dateformat', '',
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
112 _('strftime-compatible format for grouping by date'), _('FORMAT')),
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
113 ('c', 'changesets', False, _('count rate by number of changesets')),
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
114 ('s', 'sort', False, _('sort by key (default: sort by count)')),
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
115 ('', 'diffstat', False, _('display added/removed lines separately')),
75c8720092ba churn: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21163
diff changeset
116 ('', 'aliases', '', _('file with email aliases'), _('FILE')),
32375
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
117 ] + cmdutil.walkopts,
21779
a57deb45c744 churn: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21245
diff changeset
118 _("hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"),
40293
c303d65d2e34 help: assigning categories to existing commands
rdamazio@google.com
parents: 40264
diff changeset
119 helpcategory=command.CATEGORY_MAINTENANCE,
21779
a57deb45c744 churn: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21245
diff changeset
120 inferrepo=True)
7070
2627ef59195d churn and stats commands merged
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7065
diff changeset
121 def churn(ui, repo, *pats, **opts):
8823
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
122 '''histogram of changes to the repository
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
123
8823
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
124 This command will display a histogram representing the number
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
125 of changed lines or revisions, grouped according to the given
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
126 template. The default template will group changes by author.
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
127 The --dateformat option may be used to group the results by
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
128 date instead.
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
129
8823
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
130 Statistics are based on the number of changed lines, or
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
131 alternatively the number of matching revisions if the
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
132 --changesets option is specified.
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
133
9205
83132980e9cd churn: use reST syntax for literal blocks
Martin Geisler <mg@lazybytes.net>
parents: 9056
diff changeset
134 Examples::
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6598
diff changeset
135
7070
2627ef59195d churn and stats commands merged
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7065
diff changeset
136 # display count of changed lines for every committer
32198
a0e46f6b248b churn: use the non-deprecated template option in the examples
Matt Harbison <matt_harbison@yahoo.com>
parents: 29841
diff changeset
137 hg churn -T "{author|email}"
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
138
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
139 # display daily activity graph
19959
9ef92384415c doc: use double quotation mark to quote arguments in examples for Windows users
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19464
diff changeset
140 hg churn -f "%H" -s -c
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6598
diff changeset
141
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
142 # display activity of developers by month
19959
9ef92384415c doc: use double quotation mark to quote arguments in examples for Windows users
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19464
diff changeset
143 hg churn -f "%Y-%m" -s -c
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3090
diff changeset
144
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
145 # display count of lines changed in every year
19959
9ef92384415c doc: use double quotation mark to quote arguments in examples for Windows users
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19464
diff changeset
146 hg churn -f "%Y" -s
7070
2627ef59195d churn and stats commands merged
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7065
diff changeset
147
8823
d9f4c182aeca churn: improve description
Cédric Duval <cedricduval@free.fr>
parents: 8254
diff changeset
148 It is possible to map alternate email addresses to a main address
9254
db13255617b3 churn: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9205
diff changeset
149 by providing a file using the following format::
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8823
diff changeset
150
11264
30c620e48d1c churn: support spaces in aliases (issue2222)
Alexander Solovyov <piranha@piranha.org.ua>
parents: 10905
diff changeset
151 <alias email> = <actual email>
8254
f108e89400d8 churn: use .hgchurn in repo root as default map file
Martin Geisler <mg@lazybytes.net>
parents: 8228
diff changeset
152
9254
db13255617b3 churn: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9205
diff changeset
153 Such a file may be specified with the --aliases option, otherwise
db13255617b3 churn: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9205
diff changeset
154 a .hgchurn file will be looked for in the working directory root.
19464
68f7129af6a8 churn: split email aliases from the right
Matthew Turk <matthewturk@gmail.com>
parents: 18369
diff changeset
155 Aliases will be split from the rightmost "=".
8254
f108e89400d8 churn: use .hgchurn in repo root as default map file
Martin Geisler <mg@lazybytes.net>
parents: 8228
diff changeset
156 '''
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
157 def pad(s, l):
21163
9846b40d01e7 churn: compute padding with unicode strings
Isaac Jurado <diptongo@gmail.com>
parents: 20667
diff changeset
158 return s + " " * (l - encoding.colwidth(s))
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3090
diff changeset
159
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
160 amap = {}
34974
26ed66ab1e72 py3: handle keyword arguments in hgext/churn.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32837
diff changeset
161 aliases = opts.get(r'aliases')
8254
f108e89400d8 churn: use .hgchurn in repo root as default map file
Martin Geisler <mg@lazybytes.net>
parents: 8228
diff changeset
162 if not aliases and os.path.exists(repo.wjoin('.hgchurn')):
f108e89400d8 churn: use .hgchurn in repo root as default map file
Martin Geisler <mg@lazybytes.net>
parents: 8228
diff changeset
163 aliases = repo.wjoin('.hgchurn')
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
164 if aliases:
38082
1978abdb216c py3: make sure we open files in bytes mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38066
diff changeset
165 for l in open(aliases, "rb"):
12069
7c3c44413bc1 churn: do not crash on malformed lines in alias file
Martin Geisler <mg@lazybytes.net>
parents: 12068
diff changeset
166 try:
19464
68f7129af6a8 churn: split email aliases from the right
Matthew Turk <matthewturk@gmail.com>
parents: 18369
diff changeset
167 alias, actual = l.rsplit('=' in l and '=' or None, 1)
12069
7c3c44413bc1 churn: do not crash on malformed lines in alias file
Martin Geisler <mg@lazybytes.net>
parents: 12068
diff changeset
168 amap[alias.strip()] = actual.strip()
7c3c44413bc1 churn: do not crash on malformed lines in alias file
Martin Geisler <mg@lazybytes.net>
parents: 12068
diff changeset
169 except ValueError:
7c3c44413bc1 churn: do not crash on malformed lines in alias file
Martin Geisler <mg@lazybytes.net>
parents: 12068
diff changeset
170 l = l.strip()
7c3c44413bc1 churn: do not crash on malformed lines in alias file
Martin Geisler <mg@lazybytes.net>
parents: 12068
diff changeset
171 if l:
16231
ce292f1379ba i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents: 14671
diff changeset
172 ui.warn(_("skipping malformed alias: %s\n") % l)
12068
2e7647d25458 churn: do not crash on empty lines in alias file
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 11321
diff changeset
173 continue
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
174
36392
e9bcc2efb7e8 py3: convert dict.items() to list explicitly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35888
diff changeset
175 rate = list(countrate(ui, repo, amap, *pats, **opts).items())
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
176 if not rate:
5588
083b6e3142a2 churn: avoid division by zero
Matt Mackall <mpm@selenic.com>
parents: 5482
diff changeset
177 return
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
178
34974
26ed66ab1e72 py3: handle keyword arguments in hgext/churn.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32837
diff changeset
179 if opts.get(r'sort'):
18369
2150e70c0ee1 churn: sort users with same churn by name
Mads Kiilerich <mads@kiilerich.com>
parents: 17773
diff changeset
180 rate.sort()
2150e70c0ee1 churn: sort users with same churn by name
Mads Kiilerich <mads@kiilerich.com>
parents: 17773
diff changeset
181 else:
2150e70c0ee1 churn: sort users with same churn by name
Mads Kiilerich <mads@kiilerich.com>
parents: 17773
diff changeset
182 rate.sort(key=lambda x: (-sum(x[1]), x))
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
183
9388
f7968bba2307 churn: issue833 was reintroduced in 9bc46d069a76, correct it and add a test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8934
diff changeset
184 # Be careful not to have a zero maxcount (issue833)
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
185 maxcount = float(max(sum(v) for k, v in rate)) or 1.0
9390
637f2726ec7f churn: use genexps now that we dropped 2.3 compatibility
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9389
diff changeset
186 maxname = max(len(k) for k, v in rate)
3040
f74077473b36 Churn extension
Josef "Jeff" Sipek <jeff@josefsipek.net>
parents:
diff changeset
187
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12070
diff changeset
188 ttywidth = ui.termwidth()
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9390
diff changeset
189 ui.debug("assuming %i character terminal\n" % ttywidth)
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
190 width = ttywidth - maxname - 2 - 2 - 2
7065
9bc46d069a76 churn: generalisation, now it is possible to see statistics grouped by custom template
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7051
diff changeset
191
34974
26ed66ab1e72 py3: handle keyword arguments in hgext/churn.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32837
diff changeset
192 if opts.get(r'diffstat'):
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
193 width -= 15
11501
deb5d02ae91c churn: remove tuple parameter unpacking (deprecated in py3k)
Renato Cunha <renatoc@gmail.com>
parents: 11321
diff changeset
194 def format(name, diffstat):
deb5d02ae91c churn: remove tuple parameter unpacking (deprecated in py3k)
Renato Cunha <renatoc@gmail.com>
parents: 11321
diff changeset
195 added, removed = diffstat
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
196 return "%s %15s %s%s\n" % (pad(name, maxname),
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
197 '+%d/-%d' % (added, removed),
10821
a6ac91c313af churn: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10700
diff changeset
198 ui.label('+' * charnum(added),
a6ac91c313af churn: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10700
diff changeset
199 'diffstat.inserted'),
a6ac91c313af churn: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10700
diff changeset
200 ui.label('-' * charnum(removed),
a6ac91c313af churn: make use of output labeling
Brodie Rao <brodie@bitheap.org>
parents: 10700
diff changeset
201 'diffstat.deleted'))
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
202 else:
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
203 width -= 6
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
204 def format(name, count):
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
205 return "%s %6d %s\n" % (pad(name, maxname), sum(count),
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
206 '*' * charnum(sum(count)))
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
207
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
208 def charnum(count):
40264
12e2e5cd5777 churn: remove redundant round()
Augie Fackler <augie@google.com>
parents: 40241
diff changeset
209 return int(count * width // maxcount)
9669
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
210
9b127e888640 churn: ability to display added/removed lines separately
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9665
diff changeset
211 for name, count in rate:
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
212 ui.write(format(name, count))