##// END OF EJS Templates
contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal -
r28564:6d7da090 default
parent child Browse files
Show More
@@ -1,325 +1,334 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2
2
3 # Measure the performance of a list of revsets against multiple revisions
3 # Measure the performance of a list of revsets against multiple revisions
4 # defined by parameter. Checkout one by one and run perfrevset with every
4 # defined by parameter. Checkout one by one and run perfrevset with every
5 # revset in the list to benchmark its performance.
5 # revset in the list to benchmark its performance.
6 #
6 #
7 # You should run this from the root of your mercurial repository.
7 # You should run this from the root of your mercurial repository.
8 #
8 #
9 # call with --help for details
9 # call with --help for details
10
10
11 import sys
11 from __future__ import absolute_import, print_function
12 import math
12 import os
13 import os
13 import re
14 import re
14 import math
15 import sys
15 from subprocess import check_call, Popen, CalledProcessError, STDOUT, PIPE
16 from subprocess import (
17 CalledProcessError,
18 check_call,
19 PIPE,
20 Popen,
21 STDOUT,
22 )
16 # cannot use argparse, python 2.7 only
23 # cannot use argparse, python 2.7 only
17 from optparse import OptionParser
24 from optparse import (
25 OptionParser,
26 )
18
27
19 DEFAULTVARIANTS = ['plain', 'min', 'max', 'first', 'last',
28 DEFAULTVARIANTS = ['plain', 'min', 'max', 'first', 'last',
20 'reverse', 'reverse+first', 'reverse+last',
29 'reverse', 'reverse+first', 'reverse+last',
21 'sort', 'sort+first', 'sort+last']
30 'sort', 'sort+first', 'sort+last']
22
31
23 def check_output(*args, **kwargs):
32 def check_output(*args, **kwargs):
24 kwargs.setdefault('stderr', PIPE)
33 kwargs.setdefault('stderr', PIPE)
25 kwargs.setdefault('stdout', PIPE)
34 kwargs.setdefault('stdout', PIPE)
26 proc = Popen(*args, **kwargs)
35 proc = Popen(*args, **kwargs)
27 output, error = proc.communicate()
36 output, error = proc.communicate()
28 if proc.returncode != 0:
37 if proc.returncode != 0:
29 raise CalledProcessError(proc.returncode, ' '.join(args[0]))
38 raise CalledProcessError(proc.returncode, ' '.join(args[0]))
30 return output
39 return output
31
40
32 def update(rev):
41 def update(rev):
33 """update the repo to a revision"""
42 """update the repo to a revision"""
34 try:
43 try:
35 check_call(['hg', 'update', '--quiet', '--check', str(rev)])
44 check_call(['hg', 'update', '--quiet', '--check', str(rev)])
36 check_output(['make', 'local'],
45 check_output(['make', 'local'],
37 stderr=None) # suppress output except for error/warning
46 stderr=None) # suppress output except for error/warning
38 except CalledProcessError as exc:
47 except CalledProcessError as exc:
39 print >> sys.stderr, 'update to revision %s failed, aborting' % rev
48 print('update to revision %s failed, aborting'%rev, file=sys.stderr)
40 sys.exit(exc.returncode)
49 sys.exit(exc.returncode)
41
50
42
51
43 def hg(cmd, repo=None):
52 def hg(cmd, repo=None):
44 """run a mercurial command
53 """run a mercurial command
45
54
46 <cmd> is the list of command + argument,
55 <cmd> is the list of command + argument,
47 <repo> is an optional repository path to run this command in."""
56 <repo> is an optional repository path to run this command in."""
48 fullcmd = ['./hg']
57 fullcmd = ['./hg']
49 if repo is not None:
58 if repo is not None:
50 fullcmd += ['-R', repo]
59 fullcmd += ['-R', repo]
51 fullcmd += ['--config',
60 fullcmd += ['--config',
52 'extensions.perf=' + os.path.join(contribdir, 'perf.py')]
61 'extensions.perf=' + os.path.join(contribdir, 'perf.py')]
53 fullcmd += cmd
62 fullcmd += cmd
54 return check_output(fullcmd, stderr=STDOUT)
63 return check_output(fullcmd, stderr=STDOUT)
55
64
56 def perf(revset, target=None, contexts=False):
65 def perf(revset, target=None, contexts=False):
57 """run benchmark for this very revset"""
66 """run benchmark for this very revset"""
58 try:
67 try:
59 args = ['perfrevset', revset]
68 args = ['perfrevset', revset]
60 if contexts:
69 if contexts:
61 args.append('--contexts')
70 args.append('--contexts')
62 output = hg(args, repo=target)
71 output = hg(args, repo=target)
63 return parseoutput(output)
72 return parseoutput(output)
64 except CalledProcessError as exc:
73 except CalledProcessError as exc:
65 print >> sys.stderr, 'abort: cannot run revset benchmark: %s' % exc.cmd
74 print('abort: cannot run revset benchmark: %s'%exc.cmd, file=sys.stderr)
66 if getattr(exc, 'output', None) is None: # no output before 2.7
75 if getattr(exc, 'output', None) is None: # no output before 2.7
67 print >> sys.stderr, '(no output)'
76 print('(no output)', file=sys.stderr)
68 else:
77 else:
69 print >> sys.stderr, exc.output
78 print(exc.output, file=sys.stderr)
70 return None
79 return None
71
80
72 outputre = re.compile(r'! wall (\d+.\d+) comb (\d+.\d+) user (\d+.\d+) '
81 outputre = re.compile(r'! wall (\d+.\d+) comb (\d+.\d+) user (\d+.\d+) '
73 'sys (\d+.\d+) \(best of (\d+)\)')
82 'sys (\d+.\d+) \(best of (\d+)\)')
74
83
75 def parseoutput(output):
84 def parseoutput(output):
76 """parse a textual output into a dict
85 """parse a textual output into a dict
77
86
78 We cannot just use json because we want to compare with old
87 We cannot just use json because we want to compare with old
79 versions of Mercurial that may not support json output.
88 versions of Mercurial that may not support json output.
80 """
89 """
81 match = outputre.search(output)
90 match = outputre.search(output)
82 if not match:
91 if not match:
83 print >> sys.stderr, 'abort: invalid output:'
92 print('abort: invalid output:', file=sys.stderr)
84 print >> sys.stderr, output
93 print(output, file=sys.stderr)
85 sys.exit(1)
94 sys.exit(1)
86 return {'comb': float(match.group(2)),
95 return {'comb': float(match.group(2)),
87 'count': int(match.group(5)),
96 'count': int(match.group(5)),
88 'sys': float(match.group(3)),
97 'sys': float(match.group(3)),
89 'user': float(match.group(4)),
98 'user': float(match.group(4)),
90 'wall': float(match.group(1)),
99 'wall': float(match.group(1)),
91 }
100 }
92
101
93 def printrevision(rev):
102 def printrevision(rev):
94 """print data about a revision"""
103 """print data about a revision"""
95 sys.stdout.write("Revision ")
104 sys.stdout.write("Revision ")
96 sys.stdout.flush()
105 sys.stdout.flush()
97 check_call(['hg', 'log', '--rev', str(rev), '--template',
106 check_call(['hg', 'log', '--rev', str(rev), '--template',
98 '{if(tags, " ({tags})")} '
107 '{if(tags, " ({tags})")} '
99 '{rev}:{node|short}: {desc|firstline}\n'])
108 '{rev}:{node|short}: {desc|firstline}\n'])
100
109
101 def idxwidth(nbidx):
110 def idxwidth(nbidx):
102 """return the max width of number used for index
111 """return the max width of number used for index
103
112
104 This is similar to log10(nbidx), but we use custom code here
113 This is similar to log10(nbidx), but we use custom code here
105 because we start with zero and we'd rather not deal with all the
114 because we start with zero and we'd rather not deal with all the
106 extra rounding business that log10 would imply.
115 extra rounding business that log10 would imply.
107 """
116 """
108 nbidx -= 1 # starts at 0
117 nbidx -= 1 # starts at 0
109 idxwidth = 0
118 idxwidth = 0
110 while nbidx:
119 while nbidx:
111 idxwidth += 1
120 idxwidth += 1
112 nbidx //= 10
121 nbidx //= 10
113 if not idxwidth:
122 if not idxwidth:
114 idxwidth = 1
123 idxwidth = 1
115 return idxwidth
124 return idxwidth
116
125
117 def getfactor(main, other, field, sensitivity=0.05):
126 def getfactor(main, other, field, sensitivity=0.05):
118 """return the relative factor between values for 'field' in main and other
127 """return the relative factor between values for 'field' in main and other
119
128
120 Return None if the factor is insignificant (less than <sensitivity>
129 Return None if the factor is insignificant (less than <sensitivity>
121 variation)."""
130 variation)."""
122 factor = 1
131 factor = 1
123 if main is not None:
132 if main is not None:
124 factor = other[field] / main[field]
133 factor = other[field] / main[field]
125 low, high = 1 - sensitivity, 1 + sensitivity
134 low, high = 1 - sensitivity, 1 + sensitivity
126 if (low < factor < high):
135 if (low < factor < high):
127 return None
136 return None
128 return factor
137 return factor
129
138
130 def formatfactor(factor):
139 def formatfactor(factor):
131 """format a factor into a 4 char string
140 """format a factor into a 4 char string
132
141
133 22%
142 22%
134 156%
143 156%
135 x2.4
144 x2.4
136 x23
145 x23
137 x789
146 x789
138 x1e4
147 x1e4
139 x5x7
148 x5x7
140
149
141 """
150 """
142 if factor is None:
151 if factor is None:
143 return ' '
152 return ' '
144 elif factor < 2:
153 elif factor < 2:
145 return '%3i%%' % (factor * 100)
154 return '%3i%%' % (factor * 100)
146 elif factor < 10:
155 elif factor < 10:
147 return 'x%3.1f' % factor
156 return 'x%3.1f' % factor
148 elif factor < 1000:
157 elif factor < 1000:
149 return '%4s' % ('x%i' % factor)
158 return '%4s' % ('x%i' % factor)
150 else:
159 else:
151 order = int(math.log(factor)) + 1
160 order = int(math.log(factor)) + 1
152 while 1 < math.log(factor):
161 while 1 < math.log(factor):
153 factor //= 0
162 factor //= 0
154 return 'x%ix%i' % (factor, order)
163 return 'x%ix%i' % (factor, order)
155
164
156 def formattiming(value):
165 def formattiming(value):
157 """format a value to strictly 8 char, dropping some precision if needed"""
166 """format a value to strictly 8 char, dropping some precision if needed"""
158 if value < 10**7:
167 if value < 10**7:
159 return ('%.6f' % value)[:8]
168 return ('%.6f' % value)[:8]
160 else:
169 else:
161 # value is HUGE very unlikely to happen (4+ month run)
170 # value is HUGE very unlikely to happen (4+ month run)
162 return '%i' % value
171 return '%i' % value
163
172
164 _marker = object()
173 _marker = object()
165 def printresult(variants, idx, data, maxidx, verbose=False, reference=_marker):
174 def printresult(variants, idx, data, maxidx, verbose=False, reference=_marker):
166 """print a line of result to stdout"""
175 """print a line of result to stdout"""
167 mask = '%%0%ii) %%s' % idxwidth(maxidx)
176 mask = '%%0%ii) %%s' % idxwidth(maxidx)
168
177
169 out = []
178 out = []
170 for var in variants:
179 for var in variants:
171 if data[var] is None:
180 if data[var] is None:
172 out.append('error ')
181 out.append('error ')
173 out.append(' ' * 4)
182 out.append(' ' * 4)
174 continue
183 continue
175 out.append(formattiming(data[var]['wall']))
184 out.append(formattiming(data[var]['wall']))
176 if reference is not _marker:
185 if reference is not _marker:
177 factor = None
186 factor = None
178 if reference is not None:
187 if reference is not None:
179 factor = getfactor(reference[var], data[var], 'wall')
188 factor = getfactor(reference[var], data[var], 'wall')
180 out.append(formatfactor(factor))
189 out.append(formatfactor(factor))
181 if verbose:
190 if verbose:
182 out.append(formattiming(data[var]['comb']))
191 out.append(formattiming(data[var]['comb']))
183 out.append(formattiming(data[var]['user']))
192 out.append(formattiming(data[var]['user']))
184 out.append(formattiming(data[var]['sys']))
193 out.append(formattiming(data[var]['sys']))
185 out.append('%6d' % data[var]['count'])
194 out.append('%6d' % data[var]['count'])
186 print mask % (idx, ' '.join(out))
195 print(mask % (idx, ' '.join(out)))
187
196
188 def printheader(variants, maxidx, verbose=False, relative=False):
197 def printheader(variants, maxidx, verbose=False, relative=False):
189 header = [' ' * (idxwidth(maxidx) + 1)]
198 header = [' ' * (idxwidth(maxidx) + 1)]
190 for var in variants:
199 for var in variants:
191 if not var:
200 if not var:
192 var = 'iter'
201 var = 'iter'
193 if 8 < len(var):
202 if 8 < len(var):
194 var = var[:3] + '..' + var[-3:]
203 var = var[:3] + '..' + var[-3:]
195 header.append('%-8s' % var)
204 header.append('%-8s' % var)
196 if relative:
205 if relative:
197 header.append(' ')
206 header.append(' ')
198 if verbose:
207 if verbose:
199 header.append('%-8s' % 'comb')
208 header.append('%-8s' % 'comb')
200 header.append('%-8s' % 'user')
209 header.append('%-8s' % 'user')
201 header.append('%-8s' % 'sys')
210 header.append('%-8s' % 'sys')
202 header.append('%6s' % 'count')
211 header.append('%6s' % 'count')
203 print ' '.join(header)
212 print(' '.join(header))
204
213
205 def getrevs(spec):
214 def getrevs(spec):
206 """get the list of rev matched by a revset"""
215 """get the list of rev matched by a revset"""
207 try:
216 try:
208 out = check_output(['hg', 'log', '--template={rev}\n', '--rev', spec])
217 out = check_output(['hg', 'log', '--template={rev}\n', '--rev', spec])
209 except CalledProcessError as exc:
218 except CalledProcessError as exc:
210 print >> sys.stderr, "abort, can't get revision from %s" % spec
219 print("abort, can't get revision from %s"%spec, file=sys.stderr)
211 sys.exit(exc.returncode)
220 sys.exit(exc.returncode)
212 return [r for r in out.split() if r]
221 return [r for r in out.split() if r]
213
222
214
223
215 def applyvariants(revset, variant):
224 def applyvariants(revset, variant):
216 if variant == 'plain':
225 if variant == 'plain':
217 return revset
226 return revset
218 for var in variant.split('+'):
227 for var in variant.split('+'):
219 revset = '%s(%s)' % (var, revset)
228 revset = '%s(%s)' % (var, revset)
220 return revset
229 return revset
221
230
222 helptext="""This script will run multiple variants of provided revsets using
231 helptext="""This script will run multiple variants of provided revsets using
223 different revisions in your mercurial repository. After the benchmark are run
232 different revisions in your mercurial repository. After the benchmark are run
224 summary output is provided. Use it to demonstrate speed improvements or pin
233 summary output is provided. Use it to demonstrate speed improvements or pin
225 point regressions. Revsets to run are specified in a file (or from stdin), one
234 point regressions. Revsets to run are specified in a file (or from stdin), one
226 revsets per line. Line starting with '#' will be ignored, allowing insertion of
235 revsets per line. Line starting with '#' will be ignored, allowing insertion of
227 comments."""
236 comments."""
228 parser = OptionParser(usage="usage: %prog [options] <revs>",
237 parser = OptionParser(usage="usage: %prog [options] <revs>",
229 description=helptext)
238 description=helptext)
230 parser.add_option("-f", "--file",
239 parser.add_option("-f", "--file",
231 help="read revset from FILE (stdin if omitted)",
240 help="read revset from FILE (stdin if omitted)",
232 metavar="FILE")
241 metavar="FILE")
233 parser.add_option("-R", "--repo",
242 parser.add_option("-R", "--repo",
234 help="run benchmark on REPO", metavar="REPO")
243 help="run benchmark on REPO", metavar="REPO")
235
244
236 parser.add_option("-v", "--verbose",
245 parser.add_option("-v", "--verbose",
237 action='store_true',
246 action='store_true',
238 help="display all timing data (not just best total time)")
247 help="display all timing data (not just best total time)")
239
248
240 parser.add_option("", "--variants",
249 parser.add_option("", "--variants",
241 default=','.join(DEFAULTVARIANTS),
250 default=','.join(DEFAULTVARIANTS),
242 help="comma separated list of variant to test "
251 help="comma separated list of variant to test "
243 "(eg: plain,min,sorted) (plain = no modification)")
252 "(eg: plain,min,sorted) (plain = no modification)")
244 parser.add_option('', '--contexts',
253 parser.add_option('', '--contexts',
245 action='store_true',
254 action='store_true',
246 help='obtain changectx from results instead of integer revs')
255 help='obtain changectx from results instead of integer revs')
247
256
248 (options, args) = parser.parse_args()
257 (options, args) = parser.parse_args()
249
258
250 if not args:
259 if not args:
251 parser.print_help()
260 parser.print_help()
252 sys.exit(255)
261 sys.exit(255)
253
262
254 # the directory where both this script and the perf.py extension live.
263 # the directory where both this script and the perf.py extension live.
255 contribdir = os.path.dirname(__file__)
264 contribdir = os.path.dirname(__file__)
256
265
257 revsetsfile = sys.stdin
266 revsetsfile = sys.stdin
258 if options.file:
267 if options.file:
259 revsetsfile = open(options.file)
268 revsetsfile = open(options.file)
260
269
261 revsets = [l.strip() for l in revsetsfile if not l.startswith('#')]
270 revsets = [l.strip() for l in revsetsfile if not l.startswith('#')]
262 revsets = [l for l in revsets if l]
271 revsets = [l for l in revsets if l]
263
272
264 print "Revsets to benchmark"
273 print("Revsets to benchmark")
265 print "----------------------------"
274 print("----------------------------")
266
275
267 for idx, rset in enumerate(revsets):
276 for idx, rset in enumerate(revsets):
268 print "%i) %s" % (idx, rset)
277 print("%i) %s" % (idx, rset))
269
278
270 print "----------------------------"
279 print("----------------------------")
271 print
280 print()
272
281
273 revs = []
282 revs = []
274 for a in args:
283 for a in args:
275 revs.extend(getrevs(a))
284 revs.extend(getrevs(a))
276
285
277 variants = options.variants.split(',')
286 variants = options.variants.split(',')
278
287
279 results = []
288 results = []
280 for r in revs:
289 for r in revs:
281 print "----------------------------"
290 print("----------------------------")
282 printrevision(r)
291 printrevision(r)
283 print "----------------------------"
292 print("----------------------------")
284 update(r)
293 update(r)
285 res = []
294 res = []
286 results.append(res)
295 results.append(res)
287 printheader(variants, len(revsets), verbose=options.verbose)
296 printheader(variants, len(revsets), verbose=options.verbose)
288 for idx, rset in enumerate(revsets):
297 for idx, rset in enumerate(revsets):
289 varres = {}
298 varres = {}
290 for var in variants:
299 for var in variants:
291 varrset = applyvariants(rset, var)
300 varrset = applyvariants(rset, var)
292 data = perf(varrset, target=options.repo, contexts=options.contexts)
301 data = perf(varrset, target=options.repo, contexts=options.contexts)
293 varres[var] = data
302 varres[var] = data
294 res.append(varres)
303 res.append(varres)
295 printresult(variants, idx, varres, len(revsets),
304 printresult(variants, idx, varres, len(revsets),
296 verbose=options.verbose)
305 verbose=options.verbose)
297 sys.stdout.flush()
306 sys.stdout.flush()
298 print "----------------------------"
307 print("----------------------------")
299
308
300
309
301 print """
310 print("""
302
311
303 Result by revset
312 Result by revset
304 ================
313 ================
305 """
314 """)
306
315
307 print 'Revision:'
316 print('Revision:')
308 for idx, rev in enumerate(revs):
317 for idx, rev in enumerate(revs):
309 sys.stdout.write('%i) ' % idx)
318 sys.stdout.write('%i) ' % idx)
310 sys.stdout.flush()
319 sys.stdout.flush()
311 printrevision(rev)
320 printrevision(rev)
312
321
313 print
322 print()
314 print
323 print()
315
324
316 for ridx, rset in enumerate(revsets):
325 for ridx, rset in enumerate(revsets):
317
326
318 print "revset #%i: %s" % (ridx, rset)
327 print("revset #%i: %s" % (ridx, rset))
319 printheader(variants, len(results), verbose=options.verbose, relative=True)
328 printheader(variants, len(results), verbose=options.verbose, relative=True)
320 ref = None
329 ref = None
321 for idx, data in enumerate(results):
330 for idx, data in enumerate(results):
322 printresult(variants, idx, data[ridx], len(results),
331 printresult(variants, idx, data[ridx], len(results),
323 verbose=options.verbose, reference=ref)
332 verbose=options.verbose, reference=ref)
324 ref = data[ridx]
333 ref = data[ridx]
325 print
334 print()
@@ -1,122 +1,120 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/import-checker.py not using absolute_import
6 contrib/import-checker.py not using absolute_import
7 contrib/import-checker.py requires print_function
7 contrib/import-checker.py requires print_function
8 contrib/revsetbenchmarks.py not using absolute_import
9 contrib/revsetbenchmarks.py requires print_function
10 doc/check-seclevel.py not using absolute_import
8 doc/check-seclevel.py not using absolute_import
11 doc/gendoc.py not using absolute_import
9 doc/gendoc.py not using absolute_import
12 doc/hgmanpage.py not using absolute_import
10 doc/hgmanpage.py not using absolute_import
13 hgext/color.py not using absolute_import
11 hgext/color.py not using absolute_import
14 hgext/eol.py not using absolute_import
12 hgext/eol.py not using absolute_import
15 hgext/extdiff.py not using absolute_import
13 hgext/extdiff.py not using absolute_import
16 hgext/factotum.py not using absolute_import
14 hgext/factotum.py not using absolute_import
17 hgext/fetch.py not using absolute_import
15 hgext/fetch.py not using absolute_import
18 hgext/fsmonitor/pywatchman/__init__.py not using absolute_import
16 hgext/fsmonitor/pywatchman/__init__.py not using absolute_import
19 hgext/fsmonitor/pywatchman/__init__.py requires print_function
17 hgext/fsmonitor/pywatchman/__init__.py requires print_function
20 hgext/fsmonitor/pywatchman/capabilities.py not using absolute_import
18 hgext/fsmonitor/pywatchman/capabilities.py not using absolute_import
21 hgext/fsmonitor/pywatchman/pybser.py not using absolute_import
19 hgext/fsmonitor/pywatchman/pybser.py not using absolute_import
22 hgext/gpg.py not using absolute_import
20 hgext/gpg.py not using absolute_import
23 hgext/graphlog.py not using absolute_import
21 hgext/graphlog.py not using absolute_import
24 hgext/hgcia.py not using absolute_import
22 hgext/hgcia.py not using absolute_import
25 hgext/hgk.py not using absolute_import
23 hgext/hgk.py not using absolute_import
26 hgext/highlight/__init__.py not using absolute_import
24 hgext/highlight/__init__.py not using absolute_import
27 hgext/highlight/highlight.py not using absolute_import
25 hgext/highlight/highlight.py not using absolute_import
28 hgext/histedit.py not using absolute_import
26 hgext/histedit.py not using absolute_import
29 hgext/largefiles/__init__.py not using absolute_import
27 hgext/largefiles/__init__.py not using absolute_import
30 hgext/largefiles/basestore.py not using absolute_import
28 hgext/largefiles/basestore.py not using absolute_import
31 hgext/largefiles/lfcommands.py not using absolute_import
29 hgext/largefiles/lfcommands.py not using absolute_import
32 hgext/largefiles/lfutil.py not using absolute_import
30 hgext/largefiles/lfutil.py not using absolute_import
33 hgext/largefiles/localstore.py not using absolute_import
31 hgext/largefiles/localstore.py not using absolute_import
34 hgext/largefiles/overrides.py not using absolute_import
32 hgext/largefiles/overrides.py not using absolute_import
35 hgext/largefiles/proto.py not using absolute_import
33 hgext/largefiles/proto.py not using absolute_import
36 hgext/largefiles/remotestore.py not using absolute_import
34 hgext/largefiles/remotestore.py not using absolute_import
37 hgext/largefiles/reposetup.py not using absolute_import
35 hgext/largefiles/reposetup.py not using absolute_import
38 hgext/largefiles/uisetup.py not using absolute_import
36 hgext/largefiles/uisetup.py not using absolute_import
39 hgext/largefiles/wirestore.py not using absolute_import
37 hgext/largefiles/wirestore.py not using absolute_import
40 hgext/mq.py not using absolute_import
38 hgext/mq.py not using absolute_import
41 hgext/rebase.py not using absolute_import
39 hgext/rebase.py not using absolute_import
42 hgext/share.py not using absolute_import
40 hgext/share.py not using absolute_import
43 hgext/win32text.py not using absolute_import
41 hgext/win32text.py not using absolute_import
44 i18n/check-translation.py not using absolute_import
42 i18n/check-translation.py not using absolute_import
45 i18n/polib.py not using absolute_import
43 i18n/polib.py not using absolute_import
46 setup.py not using absolute_import
44 setup.py not using absolute_import
47 tests/filterpyflakes.py requires print_function
45 tests/filterpyflakes.py requires print_function
48 tests/generate-working-copy-states.py requires print_function
46 tests/generate-working-copy-states.py requires print_function
49 tests/get-with-headers.py requires print_function
47 tests/get-with-headers.py requires print_function
50 tests/heredoctest.py requires print_function
48 tests/heredoctest.py requires print_function
51 tests/hypothesishelpers.py not using absolute_import
49 tests/hypothesishelpers.py not using absolute_import
52 tests/hypothesishelpers.py requires print_function
50 tests/hypothesishelpers.py requires print_function
53 tests/killdaemons.py not using absolute_import
51 tests/killdaemons.py not using absolute_import
54 tests/md5sum.py not using absolute_import
52 tests/md5sum.py not using absolute_import
55 tests/mockblackbox.py not using absolute_import
53 tests/mockblackbox.py not using absolute_import
56 tests/printenv.py not using absolute_import
54 tests/printenv.py not using absolute_import
57 tests/readlink.py not using absolute_import
55 tests/readlink.py not using absolute_import
58 tests/readlink.py requires print_function
56 tests/readlink.py requires print_function
59 tests/revlog-formatv0.py not using absolute_import
57 tests/revlog-formatv0.py not using absolute_import
60 tests/run-tests.py not using absolute_import
58 tests/run-tests.py not using absolute_import
61 tests/seq.py not using absolute_import
59 tests/seq.py not using absolute_import
62 tests/seq.py requires print_function
60 tests/seq.py requires print_function
63 tests/silenttestrunner.py not using absolute_import
61 tests/silenttestrunner.py not using absolute_import
64 tests/silenttestrunner.py requires print_function
62 tests/silenttestrunner.py requires print_function
65 tests/sitecustomize.py not using absolute_import
63 tests/sitecustomize.py not using absolute_import
66 tests/svn-safe-append.py not using absolute_import
64 tests/svn-safe-append.py not using absolute_import
67 tests/svnxml.py not using absolute_import
65 tests/svnxml.py not using absolute_import
68 tests/test-ancestor.py requires print_function
66 tests/test-ancestor.py requires print_function
69 tests/test-atomictempfile.py not using absolute_import
67 tests/test-atomictempfile.py not using absolute_import
70 tests/test-batching.py not using absolute_import
68 tests/test-batching.py not using absolute_import
71 tests/test-batching.py requires print_function
69 tests/test-batching.py requires print_function
72 tests/test-bdiff.py not using absolute_import
70 tests/test-bdiff.py not using absolute_import
73 tests/test-bdiff.py requires print_function
71 tests/test-bdiff.py requires print_function
74 tests/test-context.py not using absolute_import
72 tests/test-context.py not using absolute_import
75 tests/test-context.py requires print_function
73 tests/test-context.py requires print_function
76 tests/test-demandimport.py not using absolute_import
74 tests/test-demandimport.py not using absolute_import
77 tests/test-demandimport.py requires print_function
75 tests/test-demandimport.py requires print_function
78 tests/test-doctest.py not using absolute_import
76 tests/test-doctest.py not using absolute_import
79 tests/test-duplicateoptions.py not using absolute_import
77 tests/test-duplicateoptions.py not using absolute_import
80 tests/test-duplicateoptions.py requires print_function
78 tests/test-duplicateoptions.py requires print_function
81 tests/test-filecache.py not using absolute_import
79 tests/test-filecache.py not using absolute_import
82 tests/test-filecache.py requires print_function
80 tests/test-filecache.py requires print_function
83 tests/test-filelog.py not using absolute_import
81 tests/test-filelog.py not using absolute_import
84 tests/test-filelog.py requires print_function
82 tests/test-filelog.py requires print_function
85 tests/test-hg-parseurl.py not using absolute_import
83 tests/test-hg-parseurl.py not using absolute_import
86 tests/test-hg-parseurl.py requires print_function
84 tests/test-hg-parseurl.py requires print_function
87 tests/test-hgweb-auth.py not using absolute_import
85 tests/test-hgweb-auth.py not using absolute_import
88 tests/test-hgweb-auth.py requires print_function
86 tests/test-hgweb-auth.py requires print_function
89 tests/test-hgwebdir-paths.py not using absolute_import
87 tests/test-hgwebdir-paths.py not using absolute_import
90 tests/test-hybridencode.py not using absolute_import
88 tests/test-hybridencode.py not using absolute_import
91 tests/test-hybridencode.py requires print_function
89 tests/test-hybridencode.py requires print_function
92 tests/test-lrucachedict.py not using absolute_import
90 tests/test-lrucachedict.py not using absolute_import
93 tests/test-lrucachedict.py requires print_function
91 tests/test-lrucachedict.py requires print_function
94 tests/test-manifest.py not using absolute_import
92 tests/test-manifest.py not using absolute_import
95 tests/test-minirst.py not using absolute_import
93 tests/test-minirst.py not using absolute_import
96 tests/test-minirst.py requires print_function
94 tests/test-minirst.py requires print_function
97 tests/test-parseindex2.py not using absolute_import
95 tests/test-parseindex2.py not using absolute_import
98 tests/test-parseindex2.py requires print_function
96 tests/test-parseindex2.py requires print_function
99 tests/test-pathencode.py not using absolute_import
97 tests/test-pathencode.py not using absolute_import
100 tests/test-pathencode.py requires print_function
98 tests/test-pathencode.py requires print_function
101 tests/test-propertycache.py not using absolute_import
99 tests/test-propertycache.py not using absolute_import
102 tests/test-propertycache.py requires print_function
100 tests/test-propertycache.py requires print_function
103 tests/test-revlog-ancestry.py not using absolute_import
101 tests/test-revlog-ancestry.py not using absolute_import
104 tests/test-revlog-ancestry.py requires print_function
102 tests/test-revlog-ancestry.py requires print_function
105 tests/test-run-tests.py not using absolute_import
103 tests/test-run-tests.py not using absolute_import
106 tests/test-simplemerge.py not using absolute_import
104 tests/test-simplemerge.py not using absolute_import
107 tests/test-status-inprocess.py not using absolute_import
105 tests/test-status-inprocess.py not using absolute_import
108 tests/test-status-inprocess.py requires print_function
106 tests/test-status-inprocess.py requires print_function
109 tests/test-symlink-os-yes-fs-no.py not using absolute_import
107 tests/test-symlink-os-yes-fs-no.py not using absolute_import
110 tests/test-trusted.py not using absolute_import
108 tests/test-trusted.py not using absolute_import
111 tests/test-trusted.py requires print_function
109 tests/test-trusted.py requires print_function
112 tests/test-ui-color.py not using absolute_import
110 tests/test-ui-color.py not using absolute_import
113 tests/test-ui-color.py requires print_function
111 tests/test-ui-color.py requires print_function
114 tests/test-ui-config.py not using absolute_import
112 tests/test-ui-config.py not using absolute_import
115 tests/test-ui-config.py requires print_function
113 tests/test-ui-config.py requires print_function
116 tests/test-ui-verbosity.py not using absolute_import
114 tests/test-ui-verbosity.py not using absolute_import
117 tests/test-ui-verbosity.py requires print_function
115 tests/test-ui-verbosity.py requires print_function
118 tests/test-url.py not using absolute_import
116 tests/test-url.py not using absolute_import
119 tests/test-url.py requires print_function
117 tests/test-url.py requires print_function
120 tests/test-walkrepo.py requires print_function
118 tests/test-walkrepo.py requires print_function
121 tests/test-wireproto.py requires print_function
119 tests/test-wireproto.py requires print_function
122 tests/tinyproxy.py requires print_function
120 tests/tinyproxy.py requires print_function
General Comments 0
You need to be logged in to leave comments. Login now