##// END OF EJS Templates
churn: use absolute_import
Gregory Szorc -
r28094:79fc6275 default
parent child Browse files
Show More
@@ -1,205 +1,216 b''
1 # churn.py - create a graph of revisions count grouped by template
1 # churn.py - create a graph of revisions count grouped by template
2 #
2 #
3 # Copyright 2006 Josef "Jeff" Sipek <jeffpc@josefsipek.net>
3 # Copyright 2006 Josef "Jeff" Sipek <jeffpc@josefsipek.net>
4 # Copyright 2008 Alexander Solovyov <piranha@piranha.org.ua>
4 # Copyright 2008 Alexander Solovyov <piranha@piranha.org.ua>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 '''command to display statistics about repository history'''
9 '''command to display statistics about repository history'''
10
10
11 from __future__ import absolute_import
12
13 import datetime
14 import os
15 import time
16
11 from mercurial.i18n import _
17 from mercurial.i18n import _
12 from mercurial import patch, cmdutil, scmutil, util, commands, error
18 from mercurial import (
13 from mercurial import encoding
19 cmdutil,
14 import os
20 commands,
15 import time, datetime
21 encoding,
22 error,
23 patch,
24 scmutil,
25 util,
26 )
16
27
17 cmdtable = {}
28 cmdtable = {}
18 command = cmdutil.command(cmdtable)
29 command = cmdutil.command(cmdtable)
19 # Note for extension authors: ONLY specify testedwith = 'internal' for
30 # Note for extension authors: ONLY specify testedwith = 'internal' for
20 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
31 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
21 # be specifying the version(s) of Mercurial they are tested with, or
32 # be specifying the version(s) of Mercurial they are tested with, or
22 # leave the attribute unspecified.
33 # leave the attribute unspecified.
23 testedwith = 'internal'
34 testedwith = 'internal'
24
35
25 def maketemplater(ui, repo, tmpl):
36 def maketemplater(ui, repo, tmpl):
26 try:
37 try:
27 t = cmdutil.changeset_templater(ui, repo, False, None, tmpl,
38 t = cmdutil.changeset_templater(ui, repo, False, None, tmpl,
28 None, False)
39 None, False)
29 except SyntaxError as inst:
40 except SyntaxError as inst:
30 raise error.Abort(inst.args[0])
41 raise error.Abort(inst.args[0])
31 return t
42 return t
32
43
33 def changedlines(ui, repo, ctx1, ctx2, fns):
44 def changedlines(ui, repo, ctx1, ctx2, fns):
34 added, removed = 0, 0
45 added, removed = 0, 0
35 fmatch = scmutil.matchfiles(repo, fns)
46 fmatch = scmutil.matchfiles(repo, fns)
36 diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node(), fmatch))
47 diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node(), fmatch))
37 for l in diff.split('\n'):
48 for l in diff.split('\n'):
38 if l.startswith("+") and not l.startswith("+++ "):
49 if l.startswith("+") and not l.startswith("+++ "):
39 added += 1
50 added += 1
40 elif l.startswith("-") and not l.startswith("--- "):
51 elif l.startswith("-") and not l.startswith("--- "):
41 removed += 1
52 removed += 1
42 return (added, removed)
53 return (added, removed)
43
54
44 def countrate(ui, repo, amap, *pats, **opts):
55 def countrate(ui, repo, amap, *pats, **opts):
45 """Calculate stats"""
56 """Calculate stats"""
46 if opts.get('dateformat'):
57 if opts.get('dateformat'):
47 def getkey(ctx):
58 def getkey(ctx):
48 t, tz = ctx.date()
59 t, tz = ctx.date()
49 date = datetime.datetime(*time.gmtime(float(t) - tz)[:6])
60 date = datetime.datetime(*time.gmtime(float(t) - tz)[:6])
50 return date.strftime(opts['dateformat'])
61 return date.strftime(opts['dateformat'])
51 else:
62 else:
52 tmpl = opts.get('oldtemplate') or opts.get('template')
63 tmpl = opts.get('oldtemplate') or opts.get('template')
53 tmpl = maketemplater(ui, repo, tmpl)
64 tmpl = maketemplater(ui, repo, tmpl)
54 def getkey(ctx):
65 def getkey(ctx):
55 ui.pushbuffer()
66 ui.pushbuffer()
56 tmpl.show(ctx)
67 tmpl.show(ctx)
57 return ui.popbuffer()
68 return ui.popbuffer()
58
69
59 state = {'count': 0}
70 state = {'count': 0}
60 rate = {}
71 rate = {}
61 df = False
72 df = False
62 if opts.get('date'):
73 if opts.get('date'):
63 df = util.matchdate(opts['date'])
74 df = util.matchdate(opts['date'])
64
75
65 m = scmutil.match(repo[None], pats, opts)
76 m = scmutil.match(repo[None], pats, opts)
66 def prep(ctx, fns):
77 def prep(ctx, fns):
67 rev = ctx.rev()
78 rev = ctx.rev()
68 if df and not df(ctx.date()[0]): # doesn't match date format
79 if df and not df(ctx.date()[0]): # doesn't match date format
69 return
80 return
70
81
71 key = getkey(ctx).strip()
82 key = getkey(ctx).strip()
72 key = amap.get(key, key) # alias remap
83 key = amap.get(key, key) # alias remap
73 if opts.get('changesets'):
84 if opts.get('changesets'):
74 rate[key] = (rate.get(key, (0,))[0] + 1, 0)
85 rate[key] = (rate.get(key, (0,))[0] + 1, 0)
75 else:
86 else:
76 parents = ctx.parents()
87 parents = ctx.parents()
77 if len(parents) > 1:
88 if len(parents) > 1:
78 ui.note(_('revision %d is a merge, ignoring...\n') % (rev,))
89 ui.note(_('revision %d is a merge, ignoring...\n') % (rev,))
79 return
90 return
80
91
81 ctx1 = parents[0]
92 ctx1 = parents[0]
82 lines = changedlines(ui, repo, ctx1, ctx, fns)
93 lines = changedlines(ui, repo, ctx1, ctx, fns)
83 rate[key] = [r + l for r, l in zip(rate.get(key, (0, 0)), lines)]
94 rate[key] = [r + l for r, l in zip(rate.get(key, (0, 0)), lines)]
84
95
85 state['count'] += 1
96 state['count'] += 1
86 ui.progress(_('analyzing'), state['count'], total=len(repo))
97 ui.progress(_('analyzing'), state['count'], total=len(repo))
87
98
88 for ctx in cmdutil.walkchangerevs(repo, m, opts, prep):
99 for ctx in cmdutil.walkchangerevs(repo, m, opts, prep):
89 continue
100 continue
90
101
91 ui.progress(_('analyzing'), None)
102 ui.progress(_('analyzing'), None)
92
103
93 return rate
104 return rate
94
105
95
106
96 @command('churn',
107 @command('churn',
97 [('r', 'rev', [],
108 [('r', 'rev', [],
98 _('count rate for the specified revision or revset'), _('REV')),
109 _('count rate for the specified revision or revset'), _('REV')),
99 ('d', 'date', '',
110 ('d', 'date', '',
100 _('count rate for revisions matching date spec'), _('DATE')),
111 _('count rate for revisions matching date spec'), _('DATE')),
101 ('t', 'oldtemplate', '',
112 ('t', 'oldtemplate', '',
102 _('template to group changesets (DEPRECATED)'), _('TEMPLATE')),
113 _('template to group changesets (DEPRECATED)'), _('TEMPLATE')),
103 ('T', 'template', '{author|email}',
114 ('T', 'template', '{author|email}',
104 _('template to group changesets'), _('TEMPLATE')),
115 _('template to group changesets'), _('TEMPLATE')),
105 ('f', 'dateformat', '',
116 ('f', 'dateformat', '',
106 _('strftime-compatible format for grouping by date'), _('FORMAT')),
117 _('strftime-compatible format for grouping by date'), _('FORMAT')),
107 ('c', 'changesets', False, _('count rate by number of changesets')),
118 ('c', 'changesets', False, _('count rate by number of changesets')),
108 ('s', 'sort', False, _('sort by key (default: sort by count)')),
119 ('s', 'sort', False, _('sort by key (default: sort by count)')),
109 ('', 'diffstat', False, _('display added/removed lines separately')),
120 ('', 'diffstat', False, _('display added/removed lines separately')),
110 ('', 'aliases', '', _('file with email aliases'), _('FILE')),
121 ('', 'aliases', '', _('file with email aliases'), _('FILE')),
111 ] + commands.walkopts,
122 ] + commands.walkopts,
112 _("hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"),
123 _("hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"),
113 inferrepo=True)
124 inferrepo=True)
114 def churn(ui, repo, *pats, **opts):
125 def churn(ui, repo, *pats, **opts):
115 '''histogram of changes to the repository
126 '''histogram of changes to the repository
116
127
117 This command will display a histogram representing the number
128 This command will display a histogram representing the number
118 of changed lines or revisions, grouped according to the given
129 of changed lines or revisions, grouped according to the given
119 template. The default template will group changes by author.
130 template. The default template will group changes by author.
120 The --dateformat option may be used to group the results by
131 The --dateformat option may be used to group the results by
121 date instead.
132 date instead.
122
133
123 Statistics are based on the number of changed lines, or
134 Statistics are based on the number of changed lines, or
124 alternatively the number of matching revisions if the
135 alternatively the number of matching revisions if the
125 --changesets option is specified.
136 --changesets option is specified.
126
137
127 Examples::
138 Examples::
128
139
129 # display count of changed lines for every committer
140 # display count of changed lines for every committer
130 hg churn -t "{author|email}"
141 hg churn -t "{author|email}"
131
142
132 # display daily activity graph
143 # display daily activity graph
133 hg churn -f "%H" -s -c
144 hg churn -f "%H" -s -c
134
145
135 # display activity of developers by month
146 # display activity of developers by month
136 hg churn -f "%Y-%m" -s -c
147 hg churn -f "%Y-%m" -s -c
137
148
138 # display count of lines changed in every year
149 # display count of lines changed in every year
139 hg churn -f "%Y" -s
150 hg churn -f "%Y" -s
140
151
141 It is possible to map alternate email addresses to a main address
152 It is possible to map alternate email addresses to a main address
142 by providing a file using the following format::
153 by providing a file using the following format::
143
154
144 <alias email> = <actual email>
155 <alias email> = <actual email>
145
156
146 Such a file may be specified with the --aliases option, otherwise
157 Such a file may be specified with the --aliases option, otherwise
147 a .hgchurn file will be looked for in the working directory root.
158 a .hgchurn file will be looked for in the working directory root.
148 Aliases will be split from the rightmost "=".
159 Aliases will be split from the rightmost "=".
149 '''
160 '''
150 def pad(s, l):
161 def pad(s, l):
151 return s + " " * (l - encoding.colwidth(s))
162 return s + " " * (l - encoding.colwidth(s))
152
163
153 amap = {}
164 amap = {}
154 aliases = opts.get('aliases')
165 aliases = opts.get('aliases')
155 if not aliases and os.path.exists(repo.wjoin('.hgchurn')):
166 if not aliases and os.path.exists(repo.wjoin('.hgchurn')):
156 aliases = repo.wjoin('.hgchurn')
167 aliases = repo.wjoin('.hgchurn')
157 if aliases:
168 if aliases:
158 for l in open(aliases, "r"):
169 for l in open(aliases, "r"):
159 try:
170 try:
160 alias, actual = l.rsplit('=' in l and '=' or None, 1)
171 alias, actual = l.rsplit('=' in l and '=' or None, 1)
161 amap[alias.strip()] = actual.strip()
172 amap[alias.strip()] = actual.strip()
162 except ValueError:
173 except ValueError:
163 l = l.strip()
174 l = l.strip()
164 if l:
175 if l:
165 ui.warn(_("skipping malformed alias: %s\n") % l)
176 ui.warn(_("skipping malformed alias: %s\n") % l)
166 continue
177 continue
167
178
168 rate = countrate(ui, repo, amap, *pats, **opts).items()
179 rate = countrate(ui, repo, amap, *pats, **opts).items()
169 if not rate:
180 if not rate:
170 return
181 return
171
182
172 if opts.get('sort'):
183 if opts.get('sort'):
173 rate.sort()
184 rate.sort()
174 else:
185 else:
175 rate.sort(key=lambda x: (-sum(x[1]), x))
186 rate.sort(key=lambda x: (-sum(x[1]), x))
176
187
177 # Be careful not to have a zero maxcount (issue833)
188 # Be careful not to have a zero maxcount (issue833)
178 maxcount = float(max(sum(v) for k, v in rate)) or 1.0
189 maxcount = float(max(sum(v) for k, v in rate)) or 1.0
179 maxname = max(len(k) for k, v in rate)
190 maxname = max(len(k) for k, v in rate)
180
191
181 ttywidth = ui.termwidth()
192 ttywidth = ui.termwidth()
182 ui.debug("assuming %i character terminal\n" % ttywidth)
193 ui.debug("assuming %i character terminal\n" % ttywidth)
183 width = ttywidth - maxname - 2 - 2 - 2
194 width = ttywidth - maxname - 2 - 2 - 2
184
195
185 if opts.get('diffstat'):
196 if opts.get('diffstat'):
186 width -= 15
197 width -= 15
187 def format(name, diffstat):
198 def format(name, diffstat):
188 added, removed = diffstat
199 added, removed = diffstat
189 return "%s %15s %s%s\n" % (pad(name, maxname),
200 return "%s %15s %s%s\n" % (pad(name, maxname),
190 '+%d/-%d' % (added, removed),
201 '+%d/-%d' % (added, removed),
191 ui.label('+' * charnum(added),
202 ui.label('+' * charnum(added),
192 'diffstat.inserted'),
203 'diffstat.inserted'),
193 ui.label('-' * charnum(removed),
204 ui.label('-' * charnum(removed),
194 'diffstat.deleted'))
205 'diffstat.deleted'))
195 else:
206 else:
196 width -= 6
207 width -= 6
197 def format(name, count):
208 def format(name, count):
198 return "%s %6d %s\n" % (pad(name, maxname), sum(count),
209 return "%s %6d %s\n" % (pad(name, maxname), sum(count),
199 '*' * charnum(sum(count)))
210 '*' * charnum(sum(count)))
200
211
201 def charnum(count):
212 def charnum(count):
202 return int(round(count * width / maxcount))
213 return int(round(count * width / maxcount))
203
214
204 for name, count in rate:
215 for name, count in rate:
205 ui.write(format(name, count))
216 ui.write(format(name, count))
@@ -1,176 +1,175 b''
1 #require test-repo
1 #require test-repo
2
2
3 $ cd "$TESTDIR"/..
3 $ cd "$TESTDIR"/..
4
4
5 $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs python contrib/check-py3-compat.py
5 $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs python contrib/check-py3-compat.py
6 contrib/casesmash.py not using absolute_import
6 contrib/casesmash.py not using absolute_import
7 contrib/check-code.py not using absolute_import
7 contrib/check-code.py not using absolute_import
8 contrib/check-code.py requires print_function
8 contrib/check-code.py requires print_function
9 contrib/check-config.py not using absolute_import
9 contrib/check-config.py not using absolute_import
10 contrib/check-config.py requires print_function
10 contrib/check-config.py requires print_function
11 contrib/debugcmdserver.py not using absolute_import
11 contrib/debugcmdserver.py not using absolute_import
12 contrib/debugcmdserver.py requires print_function
12 contrib/debugcmdserver.py requires print_function
13 contrib/debugshell.py not using absolute_import
13 contrib/debugshell.py not using absolute_import
14 contrib/fixpax.py not using absolute_import
14 contrib/fixpax.py not using absolute_import
15 contrib/fixpax.py requires print_function
15 contrib/fixpax.py requires print_function
16 contrib/hgclient.py not using absolute_import
16 contrib/hgclient.py not using absolute_import
17 contrib/hgclient.py requires print_function
17 contrib/hgclient.py requires print_function
18 contrib/hgfixes/fix_bytes.py not using absolute_import
18 contrib/hgfixes/fix_bytes.py not using absolute_import
19 contrib/hgfixes/fix_bytesmod.py not using absolute_import
19 contrib/hgfixes/fix_bytesmod.py not using absolute_import
20 contrib/hgfixes/fix_leftover_imports.py not using absolute_import
20 contrib/hgfixes/fix_leftover_imports.py not using absolute_import
21 contrib/import-checker.py not using absolute_import
21 contrib/import-checker.py not using absolute_import
22 contrib/import-checker.py requires print_function
22 contrib/import-checker.py requires print_function
23 contrib/memory.py not using absolute_import
23 contrib/memory.py not using absolute_import
24 contrib/perf.py not using absolute_import
24 contrib/perf.py not using absolute_import
25 contrib/python-hook-examples.py not using absolute_import
25 contrib/python-hook-examples.py not using absolute_import
26 contrib/revsetbenchmarks.py not using absolute_import
26 contrib/revsetbenchmarks.py not using absolute_import
27 contrib/revsetbenchmarks.py requires print_function
27 contrib/revsetbenchmarks.py requires print_function
28 contrib/showstack.py not using absolute_import
28 contrib/showstack.py not using absolute_import
29 contrib/synthrepo.py not using absolute_import
29 contrib/synthrepo.py not using absolute_import
30 contrib/win32/hgwebdir_wsgi.py not using absolute_import
30 contrib/win32/hgwebdir_wsgi.py not using absolute_import
31 doc/check-seclevel.py not using absolute_import
31 doc/check-seclevel.py not using absolute_import
32 doc/gendoc.py not using absolute_import
32 doc/gendoc.py not using absolute_import
33 doc/hgmanpage.py not using absolute_import
33 doc/hgmanpage.py not using absolute_import
34 hgext/__init__.py not using absolute_import
34 hgext/__init__.py not using absolute_import
35 hgext/churn.py not using absolute_import
36 hgext/clonebundles.py not using absolute_import
35 hgext/clonebundles.py not using absolute_import
37 hgext/color.py not using absolute_import
36 hgext/color.py not using absolute_import
38 hgext/convert/__init__.py not using absolute_import
37 hgext/convert/__init__.py not using absolute_import
39 hgext/convert/bzr.py not using absolute_import
38 hgext/convert/bzr.py not using absolute_import
40 hgext/convert/common.py not using absolute_import
39 hgext/convert/common.py not using absolute_import
41 hgext/convert/convcmd.py not using absolute_import
40 hgext/convert/convcmd.py not using absolute_import
42 hgext/convert/cvs.py not using absolute_import
41 hgext/convert/cvs.py not using absolute_import
43 hgext/convert/cvsps.py not using absolute_import
42 hgext/convert/cvsps.py not using absolute_import
44 hgext/convert/darcs.py not using absolute_import
43 hgext/convert/darcs.py not using absolute_import
45 hgext/convert/filemap.py not using absolute_import
44 hgext/convert/filemap.py not using absolute_import
46 hgext/convert/git.py not using absolute_import
45 hgext/convert/git.py not using absolute_import
47 hgext/convert/gnuarch.py not using absolute_import
46 hgext/convert/gnuarch.py not using absolute_import
48 hgext/convert/hg.py not using absolute_import
47 hgext/convert/hg.py not using absolute_import
49 hgext/convert/monotone.py not using absolute_import
48 hgext/convert/monotone.py not using absolute_import
50 hgext/convert/p4.py not using absolute_import
49 hgext/convert/p4.py not using absolute_import
51 hgext/convert/subversion.py not using absolute_import
50 hgext/convert/subversion.py not using absolute_import
52 hgext/convert/transport.py not using absolute_import
51 hgext/convert/transport.py not using absolute_import
53 hgext/eol.py not using absolute_import
52 hgext/eol.py not using absolute_import
54 hgext/extdiff.py not using absolute_import
53 hgext/extdiff.py not using absolute_import
55 hgext/factotum.py not using absolute_import
54 hgext/factotum.py not using absolute_import
56 hgext/fetch.py not using absolute_import
55 hgext/fetch.py not using absolute_import
57 hgext/gpg.py not using absolute_import
56 hgext/gpg.py not using absolute_import
58 hgext/graphlog.py not using absolute_import
57 hgext/graphlog.py not using absolute_import
59 hgext/hgcia.py not using absolute_import
58 hgext/hgcia.py not using absolute_import
60 hgext/hgk.py not using absolute_import
59 hgext/hgk.py not using absolute_import
61 hgext/highlight/__init__.py not using absolute_import
60 hgext/highlight/__init__.py not using absolute_import
62 hgext/highlight/highlight.py not using absolute_import
61 hgext/highlight/highlight.py not using absolute_import
63 hgext/histedit.py not using absolute_import
62 hgext/histedit.py not using absolute_import
64 hgext/keyword.py not using absolute_import
63 hgext/keyword.py not using absolute_import
65 hgext/largefiles/__init__.py not using absolute_import
64 hgext/largefiles/__init__.py not using absolute_import
66 hgext/largefiles/basestore.py not using absolute_import
65 hgext/largefiles/basestore.py not using absolute_import
67 hgext/largefiles/lfcommands.py not using absolute_import
66 hgext/largefiles/lfcommands.py not using absolute_import
68 hgext/largefiles/lfutil.py not using absolute_import
67 hgext/largefiles/lfutil.py not using absolute_import
69 hgext/largefiles/localstore.py not using absolute_import
68 hgext/largefiles/localstore.py not using absolute_import
70 hgext/largefiles/overrides.py not using absolute_import
69 hgext/largefiles/overrides.py not using absolute_import
71 hgext/largefiles/proto.py not using absolute_import
70 hgext/largefiles/proto.py not using absolute_import
72 hgext/largefiles/remotestore.py not using absolute_import
71 hgext/largefiles/remotestore.py not using absolute_import
73 hgext/largefiles/reposetup.py not using absolute_import
72 hgext/largefiles/reposetup.py not using absolute_import
74 hgext/largefiles/uisetup.py not using absolute_import
73 hgext/largefiles/uisetup.py not using absolute_import
75 hgext/largefiles/wirestore.py not using absolute_import
74 hgext/largefiles/wirestore.py not using absolute_import
76 hgext/mq.py not using absolute_import
75 hgext/mq.py not using absolute_import
77 hgext/notify.py not using absolute_import
76 hgext/notify.py not using absolute_import
78 hgext/pager.py not using absolute_import
77 hgext/pager.py not using absolute_import
79 hgext/patchbomb.py not using absolute_import
78 hgext/patchbomb.py not using absolute_import
80 hgext/purge.py not using absolute_import
79 hgext/purge.py not using absolute_import
81 hgext/rebase.py not using absolute_import
80 hgext/rebase.py not using absolute_import
82 hgext/record.py not using absolute_import
81 hgext/record.py not using absolute_import
83 hgext/relink.py not using absolute_import
82 hgext/relink.py not using absolute_import
84 hgext/schemes.py not using absolute_import
83 hgext/schemes.py not using absolute_import
85 hgext/share.py not using absolute_import
84 hgext/share.py not using absolute_import
86 hgext/shelve.py not using absolute_import
85 hgext/shelve.py not using absolute_import
87 hgext/strip.py not using absolute_import
86 hgext/strip.py not using absolute_import
88 hgext/transplant.py not using absolute_import
87 hgext/transplant.py not using absolute_import
89 hgext/win32mbcs.py not using absolute_import
88 hgext/win32mbcs.py not using absolute_import
90 hgext/win32text.py not using absolute_import
89 hgext/win32text.py not using absolute_import
91 hgext/zeroconf/Zeroconf.py not using absolute_import
90 hgext/zeroconf/Zeroconf.py not using absolute_import
92 hgext/zeroconf/Zeroconf.py requires print_function
91 hgext/zeroconf/Zeroconf.py requires print_function
93 hgext/zeroconf/__init__.py not using absolute_import
92 hgext/zeroconf/__init__.py not using absolute_import
94 i18n/check-translation.py not using absolute_import
93 i18n/check-translation.py not using absolute_import
95 i18n/polib.py not using absolute_import
94 i18n/polib.py not using absolute_import
96 mercurial/cmdutil.py not using absolute_import
95 mercurial/cmdutil.py not using absolute_import
97 mercurial/commands.py not using absolute_import
96 mercurial/commands.py not using absolute_import
98 setup.py not using absolute_import
97 setup.py not using absolute_import
99 tests/filterpyflakes.py requires print_function
98 tests/filterpyflakes.py requires print_function
100 tests/generate-working-copy-states.py requires print_function
99 tests/generate-working-copy-states.py requires print_function
101 tests/get-with-headers.py requires print_function
100 tests/get-with-headers.py requires print_function
102 tests/heredoctest.py requires print_function
101 tests/heredoctest.py requires print_function
103 tests/hypothesishelpers.py not using absolute_import
102 tests/hypothesishelpers.py not using absolute_import
104 tests/hypothesishelpers.py requires print_function
103 tests/hypothesishelpers.py requires print_function
105 tests/killdaemons.py not using absolute_import
104 tests/killdaemons.py not using absolute_import
106 tests/md5sum.py not using absolute_import
105 tests/md5sum.py not using absolute_import
107 tests/mockblackbox.py not using absolute_import
106 tests/mockblackbox.py not using absolute_import
108 tests/printenv.py not using absolute_import
107 tests/printenv.py not using absolute_import
109 tests/readlink.py not using absolute_import
108 tests/readlink.py not using absolute_import
110 tests/readlink.py requires print_function
109 tests/readlink.py requires print_function
111 tests/revlog-formatv0.py not using absolute_import
110 tests/revlog-formatv0.py not using absolute_import
112 tests/run-tests.py not using absolute_import
111 tests/run-tests.py not using absolute_import
113 tests/seq.py not using absolute_import
112 tests/seq.py not using absolute_import
114 tests/seq.py requires print_function
113 tests/seq.py requires print_function
115 tests/silenttestrunner.py not using absolute_import
114 tests/silenttestrunner.py not using absolute_import
116 tests/silenttestrunner.py requires print_function
115 tests/silenttestrunner.py requires print_function
117 tests/sitecustomize.py not using absolute_import
116 tests/sitecustomize.py not using absolute_import
118 tests/svn-safe-append.py not using absolute_import
117 tests/svn-safe-append.py not using absolute_import
119 tests/svnxml.py not using absolute_import
118 tests/svnxml.py not using absolute_import
120 tests/test-ancestor.py requires print_function
119 tests/test-ancestor.py requires print_function
121 tests/test-atomictempfile.py not using absolute_import
120 tests/test-atomictempfile.py not using absolute_import
122 tests/test-batching.py not using absolute_import
121 tests/test-batching.py not using absolute_import
123 tests/test-batching.py requires print_function
122 tests/test-batching.py requires print_function
124 tests/test-bdiff.py not using absolute_import
123 tests/test-bdiff.py not using absolute_import
125 tests/test-bdiff.py requires print_function
124 tests/test-bdiff.py requires print_function
126 tests/test-context.py not using absolute_import
125 tests/test-context.py not using absolute_import
127 tests/test-context.py requires print_function
126 tests/test-context.py requires print_function
128 tests/test-demandimport.py not using absolute_import
127 tests/test-demandimport.py not using absolute_import
129 tests/test-demandimport.py requires print_function
128 tests/test-demandimport.py requires print_function
130 tests/test-dispatch.py not using absolute_import
129 tests/test-dispatch.py not using absolute_import
131 tests/test-dispatch.py requires print_function
130 tests/test-dispatch.py requires print_function
132 tests/test-doctest.py not using absolute_import
131 tests/test-doctest.py not using absolute_import
133 tests/test-duplicateoptions.py not using absolute_import
132 tests/test-duplicateoptions.py not using absolute_import
134 tests/test-duplicateoptions.py requires print_function
133 tests/test-duplicateoptions.py requires print_function
135 tests/test-filecache.py not using absolute_import
134 tests/test-filecache.py not using absolute_import
136 tests/test-filecache.py requires print_function
135 tests/test-filecache.py requires print_function
137 tests/test-filelog.py not using absolute_import
136 tests/test-filelog.py not using absolute_import
138 tests/test-filelog.py requires print_function
137 tests/test-filelog.py requires print_function
139 tests/test-hg-parseurl.py not using absolute_import
138 tests/test-hg-parseurl.py not using absolute_import
140 tests/test-hg-parseurl.py requires print_function
139 tests/test-hg-parseurl.py requires print_function
141 tests/test-hgweb-auth.py not using absolute_import
140 tests/test-hgweb-auth.py not using absolute_import
142 tests/test-hgweb-auth.py requires print_function
141 tests/test-hgweb-auth.py requires print_function
143 tests/test-hgwebdir-paths.py not using absolute_import
142 tests/test-hgwebdir-paths.py not using absolute_import
144 tests/test-hybridencode.py not using absolute_import
143 tests/test-hybridencode.py not using absolute_import
145 tests/test-hybridencode.py requires print_function
144 tests/test-hybridencode.py requires print_function
146 tests/test-lrucachedict.py not using absolute_import
145 tests/test-lrucachedict.py not using absolute_import
147 tests/test-lrucachedict.py requires print_function
146 tests/test-lrucachedict.py requires print_function
148 tests/test-manifest.py not using absolute_import
147 tests/test-manifest.py not using absolute_import
149 tests/test-minirst.py not using absolute_import
148 tests/test-minirst.py not using absolute_import
150 tests/test-minirst.py requires print_function
149 tests/test-minirst.py requires print_function
151 tests/test-parseindex2.py not using absolute_import
150 tests/test-parseindex2.py not using absolute_import
152 tests/test-parseindex2.py requires print_function
151 tests/test-parseindex2.py requires print_function
153 tests/test-pathencode.py not using absolute_import
152 tests/test-pathencode.py not using absolute_import
154 tests/test-pathencode.py requires print_function
153 tests/test-pathencode.py requires print_function
155 tests/test-propertycache.py not using absolute_import
154 tests/test-propertycache.py not using absolute_import
156 tests/test-propertycache.py requires print_function
155 tests/test-propertycache.py requires print_function
157 tests/test-revlog-ancestry.py not using absolute_import
156 tests/test-revlog-ancestry.py not using absolute_import
158 tests/test-revlog-ancestry.py requires print_function
157 tests/test-revlog-ancestry.py requires print_function
159 tests/test-run-tests.py not using absolute_import
158 tests/test-run-tests.py not using absolute_import
160 tests/test-simplemerge.py not using absolute_import
159 tests/test-simplemerge.py not using absolute_import
161 tests/test-status-inprocess.py not using absolute_import
160 tests/test-status-inprocess.py not using absolute_import
162 tests/test-status-inprocess.py requires print_function
161 tests/test-status-inprocess.py requires print_function
163 tests/test-symlink-os-yes-fs-no.py not using absolute_import
162 tests/test-symlink-os-yes-fs-no.py not using absolute_import
164 tests/test-trusted.py not using absolute_import
163 tests/test-trusted.py not using absolute_import
165 tests/test-trusted.py requires print_function
164 tests/test-trusted.py requires print_function
166 tests/test-ui-color.py not using absolute_import
165 tests/test-ui-color.py not using absolute_import
167 tests/test-ui-color.py requires print_function
166 tests/test-ui-color.py requires print_function
168 tests/test-ui-config.py not using absolute_import
167 tests/test-ui-config.py not using absolute_import
169 tests/test-ui-config.py requires print_function
168 tests/test-ui-config.py requires print_function
170 tests/test-ui-verbosity.py not using absolute_import
169 tests/test-ui-verbosity.py not using absolute_import
171 tests/test-ui-verbosity.py requires print_function
170 tests/test-ui-verbosity.py requires print_function
172 tests/test-url.py not using absolute_import
171 tests/test-url.py not using absolute_import
173 tests/test-url.py requires print_function
172 tests/test-url.py requires print_function
174 tests/test-walkrepo.py requires print_function
173 tests/test-walkrepo.py requires print_function
175 tests/test-wireproto.py requires print_function
174 tests/test-wireproto.py requires print_function
176 tests/tinyproxy.py requires print_function
175 tests/tinyproxy.py requires print_function
General Comments 0
You need to be logged in to leave comments. Login now