##// END OF EJS Templates
blackbox: use absolute_import
Gregory Szorc -
r28090:8113c88b default
parent child Browse files
Show More
@@ -1,165 +1,172 b''
1 # blackbox.py - log repository events to a file for post-mortem debugging
1 # blackbox.py - log repository events to a file for post-mortem debugging
2 #
2 #
3 # Copyright 2010 Nicolas Dumazet
3 # Copyright 2010 Nicolas Dumazet
4 # Copyright 2013 Facebook, Inc.
4 # Copyright 2013 Facebook, Inc.
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 """log repository events to a blackbox for debugging
9 """log repository events to a blackbox for debugging
10
10
11 Logs event information to .hg/blackbox.log to help debug and diagnose problems.
11 Logs event information to .hg/blackbox.log to help debug and diagnose problems.
12 The events that get logged can be configured via the blackbox.track config key.
12 The events that get logged can be configured via the blackbox.track config key.
13 Examples::
13 Examples::
14
14
15 [blackbox]
15 [blackbox]
16 track = *
16 track = *
17
17
18 [blackbox]
18 [blackbox]
19 track = command, commandfinish, commandexception, exthook, pythonhook
19 track = command, commandfinish, commandexception, exthook, pythonhook
20
20
21 [blackbox]
21 [blackbox]
22 track = incoming
22 track = incoming
23
23
24 [blackbox]
24 [blackbox]
25 # limit the size of a log file
25 # limit the size of a log file
26 maxsize = 1.5 MB
26 maxsize = 1.5 MB
27 # rotate up to N log files when the current one gets too big
27 # rotate up to N log files when the current one gets too big
28 maxfiles = 3
28 maxfiles = 3
29
29
30 """
30 """
31
31
32 from mercurial import util, cmdutil
32 from __future__ import absolute_import
33
34 import errno
35 import re
36
33 from mercurial.i18n import _
37 from mercurial.i18n import _
34 import errno, re
38 from mercurial import (
39 cmdutil,
40 util,
41 )
35
42
36 cmdtable = {}
43 cmdtable = {}
37 command = cmdutil.command(cmdtable)
44 command = cmdutil.command(cmdtable)
38 # Note for extension authors: ONLY specify testedwith = 'internal' for
45 # Note for extension authors: ONLY specify testedwith = 'internal' for
39 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
46 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
40 # be specifying the version(s) of Mercurial they are tested with, or
47 # be specifying the version(s) of Mercurial they are tested with, or
41 # leave the attribute unspecified.
48 # leave the attribute unspecified.
42 testedwith = 'internal'
49 testedwith = 'internal'
43 lastblackbox = None
50 lastblackbox = None
44
51
45 def wrapui(ui):
52 def wrapui(ui):
46 class blackboxui(ui.__class__):
53 class blackboxui(ui.__class__):
47 @util.propertycache
54 @util.propertycache
48 def track(self):
55 def track(self):
49 return self.configlist('blackbox', 'track', ['*'])
56 return self.configlist('blackbox', 'track', ['*'])
50
57
51 def _openlogfile(self):
58 def _openlogfile(self):
52 def rotate(oldpath, newpath):
59 def rotate(oldpath, newpath):
53 try:
60 try:
54 self._bbvfs.unlink(newpath)
61 self._bbvfs.unlink(newpath)
55 except OSError as err:
62 except OSError as err:
56 if err.errno != errno.ENOENT:
63 if err.errno != errno.ENOENT:
57 self.debug("warning: cannot remove '%s': %s\n" %
64 self.debug("warning: cannot remove '%s': %s\n" %
58 (newpath, err.strerror))
65 (newpath, err.strerror))
59 try:
66 try:
60 if newpath:
67 if newpath:
61 self._bbvfs.rename(oldpath, newpath)
68 self._bbvfs.rename(oldpath, newpath)
62 except OSError as err:
69 except OSError as err:
63 if err.errno != errno.ENOENT:
70 if err.errno != errno.ENOENT:
64 self.debug("warning: cannot rename '%s' to '%s': %s\n" %
71 self.debug("warning: cannot rename '%s' to '%s': %s\n" %
65 (newpath, oldpath, err.strerror))
72 (newpath, oldpath, err.strerror))
66
73
67 fp = self._bbvfs('blackbox.log', 'a')
74 fp = self._bbvfs('blackbox.log', 'a')
68 maxsize = self.configbytes('blackbox', 'maxsize', 1048576)
75 maxsize = self.configbytes('blackbox', 'maxsize', 1048576)
69 if maxsize > 0:
76 if maxsize > 0:
70 st = self._bbvfs.fstat(fp)
77 st = self._bbvfs.fstat(fp)
71 if st.st_size >= maxsize:
78 if st.st_size >= maxsize:
72 path = fp.name
79 path = fp.name
73 fp.close()
80 fp.close()
74 maxfiles = self.configint('blackbox', 'maxfiles', 7)
81 maxfiles = self.configint('blackbox', 'maxfiles', 7)
75 for i in xrange(maxfiles - 1, 1, -1):
82 for i in xrange(maxfiles - 1, 1, -1):
76 rotate(oldpath='%s.%d' % (path, i - 1),
83 rotate(oldpath='%s.%d' % (path, i - 1),
77 newpath='%s.%d' % (path, i))
84 newpath='%s.%d' % (path, i))
78 rotate(oldpath=path,
85 rotate(oldpath=path,
79 newpath=maxfiles > 0 and path + '.1')
86 newpath=maxfiles > 0 and path + '.1')
80 fp = self._bbvfs('blackbox.log', 'a')
87 fp = self._bbvfs('blackbox.log', 'a')
81 return fp
88 return fp
82
89
83 def log(self, event, *msg, **opts):
90 def log(self, event, *msg, **opts):
84 global lastblackbox
91 global lastblackbox
85 super(blackboxui, self).log(event, *msg, **opts)
92 super(blackboxui, self).log(event, *msg, **opts)
86
93
87 if not '*' in self.track and not event in self.track:
94 if not '*' in self.track and not event in self.track:
88 return
95 return
89
96
90 if util.safehasattr(self, '_blackbox'):
97 if util.safehasattr(self, '_blackbox'):
91 blackbox = self._blackbox
98 blackbox = self._blackbox
92 elif util.safehasattr(self, '_bbvfs'):
99 elif util.safehasattr(self, '_bbvfs'):
93 try:
100 try:
94 self._blackbox = self._openlogfile()
101 self._blackbox = self._openlogfile()
95 except (IOError, OSError) as err:
102 except (IOError, OSError) as err:
96 self.debug('warning: cannot write to blackbox.log: %s\n' %
103 self.debug('warning: cannot write to blackbox.log: %s\n' %
97 err.strerror)
104 err.strerror)
98 del self._bbvfs
105 del self._bbvfs
99 self._blackbox = None
106 self._blackbox = None
100 blackbox = self._blackbox
107 blackbox = self._blackbox
101 else:
108 else:
102 # certain ui instances exist outside the context of
109 # certain ui instances exist outside the context of
103 # a repo, so just default to the last blackbox that
110 # a repo, so just default to the last blackbox that
104 # was seen.
111 # was seen.
105 blackbox = lastblackbox
112 blackbox = lastblackbox
106
113
107 if blackbox:
114 if blackbox:
108 date = util.datestr(None, '%Y/%m/%d %H:%M:%S')
115 date = util.datestr(None, '%Y/%m/%d %H:%M:%S')
109 user = util.getuser()
116 user = util.getuser()
110 pid = str(util.getpid())
117 pid = str(util.getpid())
111 formattedmsg = msg[0] % msg[1:]
118 formattedmsg = msg[0] % msg[1:]
112 try:
119 try:
113 blackbox.write('%s %s (%s)> %s' %
120 blackbox.write('%s %s (%s)> %s' %
114 (date, user, pid, formattedmsg))
121 (date, user, pid, formattedmsg))
115 blackbox.flush()
122 blackbox.flush()
116 except IOError as err:
123 except IOError as err:
117 self.debug('warning: cannot write to blackbox.log: %s\n' %
124 self.debug('warning: cannot write to blackbox.log: %s\n' %
118 err.strerror)
125 err.strerror)
119 lastblackbox = blackbox
126 lastblackbox = blackbox
120
127
121 def setrepo(self, repo):
128 def setrepo(self, repo):
122 self._bbvfs = repo.vfs
129 self._bbvfs = repo.vfs
123
130
124 ui.__class__ = blackboxui
131 ui.__class__ = blackboxui
125
132
126 def uisetup(ui):
133 def uisetup(ui):
127 wrapui(ui)
134 wrapui(ui)
128
135
129 def reposetup(ui, repo):
136 def reposetup(ui, repo):
130 # During 'hg pull' a httppeer repo is created to represent the remote repo.
137 # During 'hg pull' a httppeer repo is created to represent the remote repo.
131 # It doesn't have a .hg directory to put a blackbox in, so we don't do
138 # It doesn't have a .hg directory to put a blackbox in, so we don't do
132 # the blackbox setup for it.
139 # the blackbox setup for it.
133 if not repo.local():
140 if not repo.local():
134 return
141 return
135
142
136 if util.safehasattr(ui, 'setrepo'):
143 if util.safehasattr(ui, 'setrepo'):
137 ui.setrepo(repo)
144 ui.setrepo(repo)
138
145
139 @command('^blackbox',
146 @command('^blackbox',
140 [('l', 'limit', 10, _('the number of events to show')),
147 [('l', 'limit', 10, _('the number of events to show')),
141 ],
148 ],
142 _('hg blackbox [OPTION]...'))
149 _('hg blackbox [OPTION]...'))
143 def blackbox(ui, repo, *revs, **opts):
150 def blackbox(ui, repo, *revs, **opts):
144 '''view the recent repository events
151 '''view the recent repository events
145 '''
152 '''
146
153
147 if not repo.vfs.exists('blackbox.log'):
154 if not repo.vfs.exists('blackbox.log'):
148 return
155 return
149
156
150 limit = opts.get('limit')
157 limit = opts.get('limit')
151 blackbox = repo.vfs('blackbox.log', 'r')
158 blackbox = repo.vfs('blackbox.log', 'r')
152 lines = blackbox.read().split('\n')
159 lines = blackbox.read().split('\n')
153
160
154 count = 0
161 count = 0
155 output = []
162 output = []
156 for line in reversed(lines):
163 for line in reversed(lines):
157 if count >= limit:
164 if count >= limit:
158 break
165 break
159
166
160 # count the commands by matching lines like: 2013/01/23 19:13:36 root>
167 # count the commands by matching lines like: 2013/01/23 19:13:36 root>
161 if re.match('^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} .*> .*', line):
168 if re.match('^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} .*> .*', line):
162 count += 1
169 count += 1
163 output.append(line)
170 output.append(line)
164
171
165 ui.status('\n'.join(reversed(output)))
172 ui.status('\n'.join(reversed(output)))
@@ -1,180 +1,179 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/blackbox.py not using absolute_import
36 hgext/bugzilla.py not using absolute_import
35 hgext/bugzilla.py not using absolute_import
37 hgext/censor.py not using absolute_import
36 hgext/censor.py not using absolute_import
38 hgext/children.py not using absolute_import
37 hgext/children.py not using absolute_import
39 hgext/churn.py not using absolute_import
38 hgext/churn.py not using absolute_import
40 hgext/clonebundles.py not using absolute_import
39 hgext/clonebundles.py not using absolute_import
41 hgext/color.py not using absolute_import
40 hgext/color.py not using absolute_import
42 hgext/convert/__init__.py not using absolute_import
41 hgext/convert/__init__.py not using absolute_import
43 hgext/convert/bzr.py not using absolute_import
42 hgext/convert/bzr.py not using absolute_import
44 hgext/convert/common.py not using absolute_import
43 hgext/convert/common.py not using absolute_import
45 hgext/convert/convcmd.py not using absolute_import
44 hgext/convert/convcmd.py not using absolute_import
46 hgext/convert/cvs.py not using absolute_import
45 hgext/convert/cvs.py not using absolute_import
47 hgext/convert/cvsps.py not using absolute_import
46 hgext/convert/cvsps.py not using absolute_import
48 hgext/convert/darcs.py not using absolute_import
47 hgext/convert/darcs.py not using absolute_import
49 hgext/convert/filemap.py not using absolute_import
48 hgext/convert/filemap.py not using absolute_import
50 hgext/convert/git.py not using absolute_import
49 hgext/convert/git.py not using absolute_import
51 hgext/convert/gnuarch.py not using absolute_import
50 hgext/convert/gnuarch.py not using absolute_import
52 hgext/convert/hg.py not using absolute_import
51 hgext/convert/hg.py not using absolute_import
53 hgext/convert/monotone.py not using absolute_import
52 hgext/convert/monotone.py not using absolute_import
54 hgext/convert/p4.py not using absolute_import
53 hgext/convert/p4.py not using absolute_import
55 hgext/convert/subversion.py not using absolute_import
54 hgext/convert/subversion.py not using absolute_import
56 hgext/convert/transport.py not using absolute_import
55 hgext/convert/transport.py not using absolute_import
57 hgext/eol.py not using absolute_import
56 hgext/eol.py not using absolute_import
58 hgext/extdiff.py not using absolute_import
57 hgext/extdiff.py not using absolute_import
59 hgext/factotum.py not using absolute_import
58 hgext/factotum.py not using absolute_import
60 hgext/fetch.py not using absolute_import
59 hgext/fetch.py not using absolute_import
61 hgext/gpg.py not using absolute_import
60 hgext/gpg.py not using absolute_import
62 hgext/graphlog.py not using absolute_import
61 hgext/graphlog.py not using absolute_import
63 hgext/hgcia.py not using absolute_import
62 hgext/hgcia.py not using absolute_import
64 hgext/hgk.py not using absolute_import
63 hgext/hgk.py not using absolute_import
65 hgext/highlight/__init__.py not using absolute_import
64 hgext/highlight/__init__.py not using absolute_import
66 hgext/highlight/highlight.py not using absolute_import
65 hgext/highlight/highlight.py not using absolute_import
67 hgext/histedit.py not using absolute_import
66 hgext/histedit.py not using absolute_import
68 hgext/keyword.py not using absolute_import
67 hgext/keyword.py not using absolute_import
69 hgext/largefiles/__init__.py not using absolute_import
68 hgext/largefiles/__init__.py not using absolute_import
70 hgext/largefiles/basestore.py not using absolute_import
69 hgext/largefiles/basestore.py not using absolute_import
71 hgext/largefiles/lfcommands.py not using absolute_import
70 hgext/largefiles/lfcommands.py not using absolute_import
72 hgext/largefiles/lfutil.py not using absolute_import
71 hgext/largefiles/lfutil.py not using absolute_import
73 hgext/largefiles/localstore.py not using absolute_import
72 hgext/largefiles/localstore.py not using absolute_import
74 hgext/largefiles/overrides.py not using absolute_import
73 hgext/largefiles/overrides.py not using absolute_import
75 hgext/largefiles/proto.py not using absolute_import
74 hgext/largefiles/proto.py not using absolute_import
76 hgext/largefiles/remotestore.py not using absolute_import
75 hgext/largefiles/remotestore.py not using absolute_import
77 hgext/largefiles/reposetup.py not using absolute_import
76 hgext/largefiles/reposetup.py not using absolute_import
78 hgext/largefiles/uisetup.py not using absolute_import
77 hgext/largefiles/uisetup.py not using absolute_import
79 hgext/largefiles/wirestore.py not using absolute_import
78 hgext/largefiles/wirestore.py not using absolute_import
80 hgext/mq.py not using absolute_import
79 hgext/mq.py not using absolute_import
81 hgext/notify.py not using absolute_import
80 hgext/notify.py not using absolute_import
82 hgext/pager.py not using absolute_import
81 hgext/pager.py not using absolute_import
83 hgext/patchbomb.py not using absolute_import
82 hgext/patchbomb.py not using absolute_import
84 hgext/purge.py not using absolute_import
83 hgext/purge.py not using absolute_import
85 hgext/rebase.py not using absolute_import
84 hgext/rebase.py not using absolute_import
86 hgext/record.py not using absolute_import
85 hgext/record.py not using absolute_import
87 hgext/relink.py not using absolute_import
86 hgext/relink.py not using absolute_import
88 hgext/schemes.py not using absolute_import
87 hgext/schemes.py not using absolute_import
89 hgext/share.py not using absolute_import
88 hgext/share.py not using absolute_import
90 hgext/shelve.py not using absolute_import
89 hgext/shelve.py not using absolute_import
91 hgext/strip.py not using absolute_import
90 hgext/strip.py not using absolute_import
92 hgext/transplant.py not using absolute_import
91 hgext/transplant.py not using absolute_import
93 hgext/win32mbcs.py not using absolute_import
92 hgext/win32mbcs.py not using absolute_import
94 hgext/win32text.py not using absolute_import
93 hgext/win32text.py not using absolute_import
95 hgext/zeroconf/Zeroconf.py not using absolute_import
94 hgext/zeroconf/Zeroconf.py not using absolute_import
96 hgext/zeroconf/Zeroconf.py requires print_function
95 hgext/zeroconf/Zeroconf.py requires print_function
97 hgext/zeroconf/__init__.py not using absolute_import
96 hgext/zeroconf/__init__.py not using absolute_import
98 i18n/check-translation.py not using absolute_import
97 i18n/check-translation.py not using absolute_import
99 i18n/polib.py not using absolute_import
98 i18n/polib.py not using absolute_import
100 mercurial/cmdutil.py not using absolute_import
99 mercurial/cmdutil.py not using absolute_import
101 mercurial/commands.py not using absolute_import
100 mercurial/commands.py not using absolute_import
102 setup.py not using absolute_import
101 setup.py not using absolute_import
103 tests/filterpyflakes.py requires print_function
102 tests/filterpyflakes.py requires print_function
104 tests/generate-working-copy-states.py requires print_function
103 tests/generate-working-copy-states.py requires print_function
105 tests/get-with-headers.py requires print_function
104 tests/get-with-headers.py requires print_function
106 tests/heredoctest.py requires print_function
105 tests/heredoctest.py requires print_function
107 tests/hypothesishelpers.py not using absolute_import
106 tests/hypothesishelpers.py not using absolute_import
108 tests/hypothesishelpers.py requires print_function
107 tests/hypothesishelpers.py requires print_function
109 tests/killdaemons.py not using absolute_import
108 tests/killdaemons.py not using absolute_import
110 tests/md5sum.py not using absolute_import
109 tests/md5sum.py not using absolute_import
111 tests/mockblackbox.py not using absolute_import
110 tests/mockblackbox.py not using absolute_import
112 tests/printenv.py not using absolute_import
111 tests/printenv.py not using absolute_import
113 tests/readlink.py not using absolute_import
112 tests/readlink.py not using absolute_import
114 tests/readlink.py requires print_function
113 tests/readlink.py requires print_function
115 tests/revlog-formatv0.py not using absolute_import
114 tests/revlog-formatv0.py not using absolute_import
116 tests/run-tests.py not using absolute_import
115 tests/run-tests.py not using absolute_import
117 tests/seq.py not using absolute_import
116 tests/seq.py not using absolute_import
118 tests/seq.py requires print_function
117 tests/seq.py requires print_function
119 tests/silenttestrunner.py not using absolute_import
118 tests/silenttestrunner.py not using absolute_import
120 tests/silenttestrunner.py requires print_function
119 tests/silenttestrunner.py requires print_function
121 tests/sitecustomize.py not using absolute_import
120 tests/sitecustomize.py not using absolute_import
122 tests/svn-safe-append.py not using absolute_import
121 tests/svn-safe-append.py not using absolute_import
123 tests/svnxml.py not using absolute_import
122 tests/svnxml.py not using absolute_import
124 tests/test-ancestor.py requires print_function
123 tests/test-ancestor.py requires print_function
125 tests/test-atomictempfile.py not using absolute_import
124 tests/test-atomictempfile.py not using absolute_import
126 tests/test-batching.py not using absolute_import
125 tests/test-batching.py not using absolute_import
127 tests/test-batching.py requires print_function
126 tests/test-batching.py requires print_function
128 tests/test-bdiff.py not using absolute_import
127 tests/test-bdiff.py not using absolute_import
129 tests/test-bdiff.py requires print_function
128 tests/test-bdiff.py requires print_function
130 tests/test-context.py not using absolute_import
129 tests/test-context.py not using absolute_import
131 tests/test-context.py requires print_function
130 tests/test-context.py requires print_function
132 tests/test-demandimport.py not using absolute_import
131 tests/test-demandimport.py not using absolute_import
133 tests/test-demandimport.py requires print_function
132 tests/test-demandimport.py requires print_function
134 tests/test-dispatch.py not using absolute_import
133 tests/test-dispatch.py not using absolute_import
135 tests/test-dispatch.py requires print_function
134 tests/test-dispatch.py requires print_function
136 tests/test-doctest.py not using absolute_import
135 tests/test-doctest.py not using absolute_import
137 tests/test-duplicateoptions.py not using absolute_import
136 tests/test-duplicateoptions.py not using absolute_import
138 tests/test-duplicateoptions.py requires print_function
137 tests/test-duplicateoptions.py requires print_function
139 tests/test-filecache.py not using absolute_import
138 tests/test-filecache.py not using absolute_import
140 tests/test-filecache.py requires print_function
139 tests/test-filecache.py requires print_function
141 tests/test-filelog.py not using absolute_import
140 tests/test-filelog.py not using absolute_import
142 tests/test-filelog.py requires print_function
141 tests/test-filelog.py requires print_function
143 tests/test-hg-parseurl.py not using absolute_import
142 tests/test-hg-parseurl.py not using absolute_import
144 tests/test-hg-parseurl.py requires print_function
143 tests/test-hg-parseurl.py requires print_function
145 tests/test-hgweb-auth.py not using absolute_import
144 tests/test-hgweb-auth.py not using absolute_import
146 tests/test-hgweb-auth.py requires print_function
145 tests/test-hgweb-auth.py requires print_function
147 tests/test-hgwebdir-paths.py not using absolute_import
146 tests/test-hgwebdir-paths.py not using absolute_import
148 tests/test-hybridencode.py not using absolute_import
147 tests/test-hybridencode.py not using absolute_import
149 tests/test-hybridencode.py requires print_function
148 tests/test-hybridencode.py requires print_function
150 tests/test-lrucachedict.py not using absolute_import
149 tests/test-lrucachedict.py not using absolute_import
151 tests/test-lrucachedict.py requires print_function
150 tests/test-lrucachedict.py requires print_function
152 tests/test-manifest.py not using absolute_import
151 tests/test-manifest.py not using absolute_import
153 tests/test-minirst.py not using absolute_import
152 tests/test-minirst.py not using absolute_import
154 tests/test-minirst.py requires print_function
153 tests/test-minirst.py requires print_function
155 tests/test-parseindex2.py not using absolute_import
154 tests/test-parseindex2.py not using absolute_import
156 tests/test-parseindex2.py requires print_function
155 tests/test-parseindex2.py requires print_function
157 tests/test-pathencode.py not using absolute_import
156 tests/test-pathencode.py not using absolute_import
158 tests/test-pathencode.py requires print_function
157 tests/test-pathencode.py requires print_function
159 tests/test-propertycache.py not using absolute_import
158 tests/test-propertycache.py not using absolute_import
160 tests/test-propertycache.py requires print_function
159 tests/test-propertycache.py requires print_function
161 tests/test-revlog-ancestry.py not using absolute_import
160 tests/test-revlog-ancestry.py not using absolute_import
162 tests/test-revlog-ancestry.py requires print_function
161 tests/test-revlog-ancestry.py requires print_function
163 tests/test-run-tests.py not using absolute_import
162 tests/test-run-tests.py not using absolute_import
164 tests/test-simplemerge.py not using absolute_import
163 tests/test-simplemerge.py not using absolute_import
165 tests/test-status-inprocess.py not using absolute_import
164 tests/test-status-inprocess.py not using absolute_import
166 tests/test-status-inprocess.py requires print_function
165 tests/test-status-inprocess.py requires print_function
167 tests/test-symlink-os-yes-fs-no.py not using absolute_import
166 tests/test-symlink-os-yes-fs-no.py not using absolute_import
168 tests/test-trusted.py not using absolute_import
167 tests/test-trusted.py not using absolute_import
169 tests/test-trusted.py requires print_function
168 tests/test-trusted.py requires print_function
170 tests/test-ui-color.py not using absolute_import
169 tests/test-ui-color.py not using absolute_import
171 tests/test-ui-color.py requires print_function
170 tests/test-ui-color.py requires print_function
172 tests/test-ui-config.py not using absolute_import
171 tests/test-ui-config.py not using absolute_import
173 tests/test-ui-config.py requires print_function
172 tests/test-ui-config.py requires print_function
174 tests/test-ui-verbosity.py not using absolute_import
173 tests/test-ui-verbosity.py not using absolute_import
175 tests/test-ui-verbosity.py requires print_function
174 tests/test-ui-verbosity.py requires print_function
176 tests/test-url.py not using absolute_import
175 tests/test-url.py not using absolute_import
177 tests/test-url.py requires print_function
176 tests/test-url.py requires print_function
178 tests/test-walkrepo.py requires print_function
177 tests/test-walkrepo.py requires print_function
179 tests/test-wireproto.py requires print_function
178 tests/test-wireproto.py requires print_function
180 tests/tinyproxy.py requires print_function
179 tests/tinyproxy.py requires print_function
General Comments 0
You need to be logged in to leave comments. Login now