##// END OF EJS Templates
convert: p4 use absolute_import
timeless -
r28371:630f5f04 default
parent child Browse files
Show More
@@ -1,290 +1,296 b''
1 # Perforce source for convert extension.
1 # Perforce source for convert extension.
2 #
2 #
3 # Copyright 2009, Frank Kingswood <frank@kingswood-consulting.co.uk>
3 # Copyright 2009, Frank Kingswood <frank@kingswood-consulting.co.uk>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7 from __future__ import absolute_import
7
8
8 from mercurial import util, error
9 import marshal
10 import re
11
12 from mercurial import (
13 error,
14 util,
15 )
9 from mercurial.i18n import _
16 from mercurial.i18n import _
10
17
11 from common import commit, converter_source, checktool, NoRepo
18 from . import common
12 import marshal
13 import re
14
19
15 def loaditer(f):
20 def loaditer(f):
16 "Yield the dictionary objects generated by p4"
21 "Yield the dictionary objects generated by p4"
17 try:
22 try:
18 while True:
23 while True:
19 d = marshal.load(f)
24 d = marshal.load(f)
20 if not d:
25 if not d:
21 break
26 break
22 yield d
27 yield d
23 except EOFError:
28 except EOFError:
24 pass
29 pass
25
30
26 def decodefilename(filename):
31 def decodefilename(filename):
27 """Perforce escapes special characters @, #, *, or %
32 """Perforce escapes special characters @, #, *, or %
28 with %40, %23, %2A, or %25 respectively
33 with %40, %23, %2A, or %25 respectively
29
34
30 >>> decodefilename('portable-net45%252Bnetcore45%252Bwp8%252BMonoAndroid')
35 >>> decodefilename('portable-net45%252Bnetcore45%252Bwp8%252BMonoAndroid')
31 'portable-net45%2Bnetcore45%2Bwp8%2BMonoAndroid'
36 'portable-net45%2Bnetcore45%2Bwp8%2BMonoAndroid'
32 >>> decodefilename('//Depot/Directory/%2525/%2523/%23%40.%2A')
37 >>> decodefilename('//Depot/Directory/%2525/%2523/%23%40.%2A')
33 '//Depot/Directory/%25/%23/#@.*'
38 '//Depot/Directory/%25/%23/#@.*'
34 """
39 """
35 replacements = [('%2A', '*'), ('%23', '#'), ('%40', '@'), ('%25', '%')]
40 replacements = [('%2A', '*'), ('%23', '#'), ('%40', '@'), ('%25', '%')]
36 for k, v in replacements:
41 for k, v in replacements:
37 filename = filename.replace(k, v)
42 filename = filename.replace(k, v)
38 return filename
43 return filename
39
44
40 class p4_source(converter_source):
45 class p4_source(common.converter_source):
41 def __init__(self, ui, path, revs=None):
46 def __init__(self, ui, path, revs=None):
42 # avoid import cycle
47 # avoid import cycle
43 import convcmd
48 from . import convcmd
44
49
45 super(p4_source, self).__init__(ui, path, revs=revs)
50 super(p4_source, self).__init__(ui, path, revs=revs)
46
51
47 if "/" in path and not path.startswith('//'):
52 if "/" in path and not path.startswith('//'):
48 raise NoRepo(_('%s does not look like a P4 repository') % path)
53 raise common.NoRepo(_('%s does not look like a P4 repository') %
54 path)
49
55
50 checktool('p4', abort=False)
56 common.checktool('p4', abort=False)
51
57
52 self.p4changes = {}
58 self.p4changes = {}
53 self.heads = {}
59 self.heads = {}
54 self.changeset = {}
60 self.changeset = {}
55 self.files = {}
61 self.files = {}
56 self.copies = {}
62 self.copies = {}
57 self.tags = {}
63 self.tags = {}
58 self.lastbranch = {}
64 self.lastbranch = {}
59 self.parent = {}
65 self.parent = {}
60 self.encoding = self.ui.config('convert', 'p4.encoding',
66 self.encoding = self.ui.config('convert', 'p4.encoding',
61 default=convcmd.orig_encoding)
67 default=convcmd.orig_encoding)
62 self.depotname = {} # mapping from local name to depot name
68 self.depotname = {} # mapping from local name to depot name
63 self.localname = {} # mapping from depot name to local name
69 self.localname = {} # mapping from depot name to local name
64 self.re_type = re.compile(
70 self.re_type = re.compile(
65 "([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)"
71 "([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)"
66 "(\+\w+)?$")
72 "(\+\w+)?$")
67 self.re_keywords = re.compile(
73 self.re_keywords = re.compile(
68 r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)"
74 r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)"
69 r":[^$\n]*\$")
75 r":[^$\n]*\$")
70 self.re_keywords_old = re.compile("\$(Id|Header):[^$\n]*\$")
76 self.re_keywords_old = re.compile("\$(Id|Header):[^$\n]*\$")
71
77
72 if revs and len(revs) > 1:
78 if revs and len(revs) > 1:
73 raise error.Abort(_("p4 source does not support specifying "
79 raise error.Abort(_("p4 source does not support specifying "
74 "multiple revisions"))
80 "multiple revisions"))
75 self._parse(ui, path)
81 self._parse(ui, path)
76
82
77 def _parse_view(self, path):
83 def _parse_view(self, path):
78 "Read changes affecting the path"
84 "Read changes affecting the path"
79 cmd = 'p4 -G changes -s submitted %s' % util.shellquote(path)
85 cmd = 'p4 -G changes -s submitted %s' % util.shellquote(path)
80 stdout = util.popen(cmd, mode='rb')
86 stdout = util.popen(cmd, mode='rb')
81 for d in loaditer(stdout):
87 for d in loaditer(stdout):
82 c = d.get("change", None)
88 c = d.get("change", None)
83 if c:
89 if c:
84 self.p4changes[c] = True
90 self.p4changes[c] = True
85
91
86 def _parse(self, ui, path):
92 def _parse(self, ui, path):
87 "Prepare list of P4 filenames and revisions to import"
93 "Prepare list of P4 filenames and revisions to import"
88 ui.status(_('reading p4 views\n'))
94 ui.status(_('reading p4 views\n'))
89
95
90 # read client spec or view
96 # read client spec or view
91 if "/" in path:
97 if "/" in path:
92 self._parse_view(path)
98 self._parse_view(path)
93 if path.startswith("//") and path.endswith("/..."):
99 if path.startswith("//") and path.endswith("/..."):
94 views = {path[:-3]:""}
100 views = {path[:-3]:""}
95 else:
101 else:
96 views = {"//": ""}
102 views = {"//": ""}
97 else:
103 else:
98 cmd = 'p4 -G client -o %s' % util.shellquote(path)
104 cmd = 'p4 -G client -o %s' % util.shellquote(path)
99 clientspec = marshal.load(util.popen(cmd, mode='rb'))
105 clientspec = marshal.load(util.popen(cmd, mode='rb'))
100
106
101 views = {}
107 views = {}
102 for client in clientspec:
108 for client in clientspec:
103 if client.startswith("View"):
109 if client.startswith("View"):
104 sview, cview = clientspec[client].split()
110 sview, cview = clientspec[client].split()
105 self._parse_view(sview)
111 self._parse_view(sview)
106 if sview.endswith("...") and cview.endswith("..."):
112 if sview.endswith("...") and cview.endswith("..."):
107 sview = sview[:-3]
113 sview = sview[:-3]
108 cview = cview[:-3]
114 cview = cview[:-3]
109 cview = cview[2:]
115 cview = cview[2:]
110 cview = cview[cview.find("/") + 1:]
116 cview = cview[cview.find("/") + 1:]
111 views[sview] = cview
117 views[sview] = cview
112
118
113 # list of changes that affect our source files
119 # list of changes that affect our source files
114 self.p4changes = self.p4changes.keys()
120 self.p4changes = self.p4changes.keys()
115 self.p4changes.sort(key=int)
121 self.p4changes.sort(key=int)
116
122
117 # list with depot pathnames, longest first
123 # list with depot pathnames, longest first
118 vieworder = views.keys()
124 vieworder = views.keys()
119 vieworder.sort(key=len, reverse=True)
125 vieworder.sort(key=len, reverse=True)
120
126
121 # handle revision limiting
127 # handle revision limiting
122 startrev = self.ui.config('convert', 'p4.startrev', default=0)
128 startrev = self.ui.config('convert', 'p4.startrev', default=0)
123 self.p4changes = [x for x in self.p4changes
129 self.p4changes = [x for x in self.p4changes
124 if ((not startrev or int(x) >= int(startrev)) and
130 if ((not startrev or int(x) >= int(startrev)) and
125 (not self.revs or int(x) <= int(self.revs[0])))]
131 (not self.revs or int(x) <= int(self.revs[0])))]
126
132
127 # now read the full changelists to get the list of file revisions
133 # now read the full changelists to get the list of file revisions
128 ui.status(_('collecting p4 changelists\n'))
134 ui.status(_('collecting p4 changelists\n'))
129 lastid = None
135 lastid = None
130 for change in self.p4changes:
136 for change in self.p4changes:
131 cmd = "p4 -G describe -s %s" % change
137 cmd = "p4 -G describe -s %s" % change
132 stdout = util.popen(cmd, mode='rb')
138 stdout = util.popen(cmd, mode='rb')
133 d = marshal.load(stdout)
139 d = marshal.load(stdout)
134 desc = self.recode(d.get("desc", ""))
140 desc = self.recode(d.get("desc", ""))
135 shortdesc = desc.split("\n", 1)[0]
141 shortdesc = desc.split("\n", 1)[0]
136 t = '%s %s' % (d["change"], repr(shortdesc)[1:-1])
142 t = '%s %s' % (d["change"], repr(shortdesc)[1:-1])
137 ui.status(util.ellipsis(t, 80) + '\n')
143 ui.status(util.ellipsis(t, 80) + '\n')
138
144
139 if lastid:
145 if lastid:
140 parents = [lastid]
146 parents = [lastid]
141 else:
147 else:
142 parents = []
148 parents = []
143
149
144 date = (int(d["time"]), 0) # timezone not set
150 date = (int(d["time"]), 0) # timezone not set
145 c = commit(author=self.recode(d["user"]),
151 c = common.commit(author=self.recode(d["user"]),
146 date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
152 date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
147 parents=parents, desc=desc, branch=None,
153 parents=parents, desc=desc, branch=None,
148 extra={"p4": change})
154 extra={"p4": change})
149
155
150 files = []
156 files = []
151 copies = {}
157 copies = {}
152 copiedfiles = []
158 copiedfiles = []
153 i = 0
159 i = 0
154 while ("depotFile%d" % i) in d and ("rev%d" % i) in d:
160 while ("depotFile%d" % i) in d and ("rev%d" % i) in d:
155 oldname = d["depotFile%d" % i]
161 oldname = d["depotFile%d" % i]
156 filename = None
162 filename = None
157 for v in vieworder:
163 for v in vieworder:
158 if oldname.lower().startswith(v.lower()):
164 if oldname.lower().startswith(v.lower()):
159 filename = decodefilename(views[v] + oldname[len(v):])
165 filename = decodefilename(views[v] + oldname[len(v):])
160 break
166 break
161 if filename:
167 if filename:
162 files.append((filename, d["rev%d" % i]))
168 files.append((filename, d["rev%d" % i]))
163 self.depotname[filename] = oldname
169 self.depotname[filename] = oldname
164 if (d.get("action%d" % i) == "move/add"):
170 if (d.get("action%d" % i) == "move/add"):
165 copiedfiles.append(filename)
171 copiedfiles.append(filename)
166 self.localname[oldname] = filename
172 self.localname[oldname] = filename
167 i += 1
173 i += 1
168
174
169 # Collect information about copied files
175 # Collect information about copied files
170 for filename in copiedfiles:
176 for filename in copiedfiles:
171 oldname = self.depotname[filename]
177 oldname = self.depotname[filename]
172
178
173 flcmd = 'p4 -G filelog %s' \
179 flcmd = 'p4 -G filelog %s' \
174 % util.shellquote(oldname)
180 % util.shellquote(oldname)
175 flstdout = util.popen(flcmd, mode='rb')
181 flstdout = util.popen(flcmd, mode='rb')
176
182
177 copiedfilename = None
183 copiedfilename = None
178 for d in loaditer(flstdout):
184 for d in loaditer(flstdout):
179 copiedoldname = None
185 copiedoldname = None
180
186
181 i = 0
187 i = 0
182 while ("change%d" % i) in d:
188 while ("change%d" % i) in d:
183 if (d["change%d" % i] == change and
189 if (d["change%d" % i] == change and
184 d["action%d" % i] == "move/add"):
190 d["action%d" % i] == "move/add"):
185 j = 0
191 j = 0
186 while ("file%d,%d" % (i, j)) in d:
192 while ("file%d,%d" % (i, j)) in d:
187 if d["how%d,%d" % (i, j)] == "moved from":
193 if d["how%d,%d" % (i, j)] == "moved from":
188 copiedoldname = d["file%d,%d" % (i, j)]
194 copiedoldname = d["file%d,%d" % (i, j)]
189 break
195 break
190 j += 1
196 j += 1
191 i += 1
197 i += 1
192
198
193 if copiedoldname and copiedoldname in self.localname:
199 if copiedoldname and copiedoldname in self.localname:
194 copiedfilename = self.localname[copiedoldname]
200 copiedfilename = self.localname[copiedoldname]
195 break
201 break
196
202
197 if copiedfilename:
203 if copiedfilename:
198 copies[filename] = copiedfilename
204 copies[filename] = copiedfilename
199 else:
205 else:
200 ui.warn(_("cannot find source for copied file: %s@%s\n")
206 ui.warn(_("cannot find source for copied file: %s@%s\n")
201 % (filename, change))
207 % (filename, change))
202
208
203 self.changeset[change] = c
209 self.changeset[change] = c
204 self.files[change] = files
210 self.files[change] = files
205 self.copies[change] = copies
211 self.copies[change] = copies
206 lastid = change
212 lastid = change
207
213
208 if lastid:
214 if lastid:
209 self.heads = [lastid]
215 self.heads = [lastid]
210
216
211 def getheads(self):
217 def getheads(self):
212 return self.heads
218 return self.heads
213
219
214 def getfile(self, name, rev):
220 def getfile(self, name, rev):
215 cmd = 'p4 -G print %s' \
221 cmd = 'p4 -G print %s' \
216 % util.shellquote("%s#%s" % (self.depotname[name], rev))
222 % util.shellquote("%s#%s" % (self.depotname[name], rev))
217
223
218 lasterror = None
224 lasterror = None
219 while True:
225 while True:
220 stdout = util.popen(cmd, mode='rb')
226 stdout = util.popen(cmd, mode='rb')
221
227
222 mode = None
228 mode = None
223 contents = []
229 contents = []
224 keywords = None
230 keywords = None
225
231
226 for d in loaditer(stdout):
232 for d in loaditer(stdout):
227 code = d["code"]
233 code = d["code"]
228 data = d.get("data")
234 data = d.get("data")
229
235
230 if code == "error":
236 if code == "error":
231 # if this is the first time error happened
237 # if this is the first time error happened
232 # re-attempt getting the file
238 # re-attempt getting the file
233 if not lasterror:
239 if not lasterror:
234 lasterror = IOError(d["generic"], data)
240 lasterror = IOError(d["generic"], data)
235 # this will exit inner-most for-loop
241 # this will exit inner-most for-loop
236 break
242 break
237 else:
243 else:
238 raise lasterror
244 raise lasterror
239
245
240 elif code == "stat":
246 elif code == "stat":
241 action = d.get("action")
247 action = d.get("action")
242 if action in ["purge", "delete", "move/delete"]:
248 if action in ["purge", "delete", "move/delete"]:
243 return None, None
249 return None, None
244 p4type = self.re_type.match(d["type"])
250 p4type = self.re_type.match(d["type"])
245 if p4type:
251 if p4type:
246 mode = ""
252 mode = ""
247 flags = ((p4type.group(1) or "")
253 flags = ((p4type.group(1) or "")
248 + (p4type.group(3) or ""))
254 + (p4type.group(3) or ""))
249 if "x" in flags:
255 if "x" in flags:
250 mode = "x"
256 mode = "x"
251 if p4type.group(2) == "symlink":
257 if p4type.group(2) == "symlink":
252 mode = "l"
258 mode = "l"
253 if "ko" in flags:
259 if "ko" in flags:
254 keywords = self.re_keywords_old
260 keywords = self.re_keywords_old
255 elif "k" in flags:
261 elif "k" in flags:
256 keywords = self.re_keywords
262 keywords = self.re_keywords
257
263
258 elif code == "text" or code == "binary":
264 elif code == "text" or code == "binary":
259 contents.append(data)
265 contents.append(data)
260
266
261 lasterror = None
267 lasterror = None
262
268
263 if not lasterror:
269 if not lasterror:
264 break
270 break
265
271
266 if mode is None:
272 if mode is None:
267 return None, None
273 return None, None
268
274
269 contents = ''.join(contents)
275 contents = ''.join(contents)
270
276
271 if keywords:
277 if keywords:
272 contents = keywords.sub("$\\1$", contents)
278 contents = keywords.sub("$\\1$", contents)
273 if mode == "l" and contents.endswith("\n"):
279 if mode == "l" and contents.endswith("\n"):
274 contents = contents[:-1]
280 contents = contents[:-1]
275
281
276 return contents, mode
282 return contents, mode
277
283
278 def getchanges(self, rev, full):
284 def getchanges(self, rev, full):
279 if full:
285 if full:
280 raise error.Abort(_("convert from p4 does not support --full"))
286 raise error.Abort(_("convert from p4 does not support --full"))
281 return self.files[rev], self.copies[rev], set()
287 return self.files[rev], self.copies[rev], set()
282
288
283 def getcommit(self, rev):
289 def getcommit(self, rev):
284 return self.changeset[rev]
290 return self.changeset[rev]
285
291
286 def gettags(self):
292 def gettags(self):
287 return self.tags
293 return self.tags
288
294
289 def getchangedfiles(self, rev, i):
295 def getchangedfiles(self, rev, i):
290 return sorted([x[0] for x in self.files[rev]])
296 return sorted([x[0] for x in self.files[rev]])
@@ -1,152 +1,151 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/check-code.py not using absolute_import
6 contrib/check-code.py not using absolute_import
7 contrib/check-code.py requires print_function
7 contrib/check-code.py requires print_function
8 contrib/debugshell.py not using absolute_import
8 contrib/debugshell.py not using absolute_import
9 contrib/hgfixes/fix_bytes.py not using absolute_import
9 contrib/hgfixes/fix_bytes.py not using absolute_import
10 contrib/hgfixes/fix_bytesmod.py not using absolute_import
10 contrib/hgfixes/fix_bytesmod.py not using absolute_import
11 contrib/hgfixes/fix_leftover_imports.py not using absolute_import
11 contrib/hgfixes/fix_leftover_imports.py not using absolute_import
12 contrib/import-checker.py not using absolute_import
12 contrib/import-checker.py not using absolute_import
13 contrib/import-checker.py requires print_function
13 contrib/import-checker.py requires print_function
14 contrib/memory.py not using absolute_import
14 contrib/memory.py not using absolute_import
15 contrib/perf.py not using absolute_import
15 contrib/perf.py not using absolute_import
16 contrib/python-hook-examples.py not using absolute_import
16 contrib/python-hook-examples.py not using absolute_import
17 contrib/revsetbenchmarks.py not using absolute_import
17 contrib/revsetbenchmarks.py not using absolute_import
18 contrib/revsetbenchmarks.py requires print_function
18 contrib/revsetbenchmarks.py requires print_function
19 contrib/showstack.py not using absolute_import
19 contrib/showstack.py not using absolute_import
20 contrib/synthrepo.py not using absolute_import
20 contrib/synthrepo.py not using absolute_import
21 contrib/win32/hgwebdir_wsgi.py not using absolute_import
21 contrib/win32/hgwebdir_wsgi.py not using absolute_import
22 doc/check-seclevel.py not using absolute_import
22 doc/check-seclevel.py not using absolute_import
23 doc/gendoc.py not using absolute_import
23 doc/gendoc.py not using absolute_import
24 doc/hgmanpage.py not using absolute_import
24 doc/hgmanpage.py not using absolute_import
25 hgext/__init__.py not using absolute_import
25 hgext/__init__.py not using absolute_import
26 hgext/color.py not using absolute_import
26 hgext/color.py not using absolute_import
27 hgext/convert/__init__.py not using absolute_import
27 hgext/convert/__init__.py not using absolute_import
28 hgext/convert/bzr.py not using absolute_import
28 hgext/convert/bzr.py not using absolute_import
29 hgext/convert/common.py not using absolute_import
29 hgext/convert/common.py not using absolute_import
30 hgext/convert/convcmd.py not using absolute_import
30 hgext/convert/convcmd.py not using absolute_import
31 hgext/convert/cvs.py not using absolute_import
31 hgext/convert/cvs.py not using absolute_import
32 hgext/convert/monotone.py not using absolute_import
32 hgext/convert/monotone.py not using absolute_import
33 hgext/convert/p4.py not using absolute_import
34 hgext/convert/subversion.py not using absolute_import
33 hgext/convert/subversion.py not using absolute_import
35 hgext/convert/transport.py not using absolute_import
34 hgext/convert/transport.py not using absolute_import
36 hgext/eol.py not using absolute_import
35 hgext/eol.py not using absolute_import
37 hgext/extdiff.py not using absolute_import
36 hgext/extdiff.py not using absolute_import
38 hgext/factotum.py not using absolute_import
37 hgext/factotum.py not using absolute_import
39 hgext/fetch.py not using absolute_import
38 hgext/fetch.py not using absolute_import
40 hgext/gpg.py not using absolute_import
39 hgext/gpg.py not using absolute_import
41 hgext/graphlog.py not using absolute_import
40 hgext/graphlog.py not using absolute_import
42 hgext/hgcia.py not using absolute_import
41 hgext/hgcia.py not using absolute_import
43 hgext/hgk.py not using absolute_import
42 hgext/hgk.py not using absolute_import
44 hgext/highlight/__init__.py not using absolute_import
43 hgext/highlight/__init__.py not using absolute_import
45 hgext/highlight/highlight.py not using absolute_import
44 hgext/highlight/highlight.py not using absolute_import
46 hgext/histedit.py not using absolute_import
45 hgext/histedit.py not using absolute_import
47 hgext/largefiles/__init__.py not using absolute_import
46 hgext/largefiles/__init__.py not using absolute_import
48 hgext/largefiles/basestore.py not using absolute_import
47 hgext/largefiles/basestore.py not using absolute_import
49 hgext/largefiles/lfcommands.py not using absolute_import
48 hgext/largefiles/lfcommands.py not using absolute_import
50 hgext/largefiles/lfutil.py not using absolute_import
49 hgext/largefiles/lfutil.py not using absolute_import
51 hgext/largefiles/localstore.py not using absolute_import
50 hgext/largefiles/localstore.py not using absolute_import
52 hgext/largefiles/overrides.py not using absolute_import
51 hgext/largefiles/overrides.py not using absolute_import
53 hgext/largefiles/proto.py not using absolute_import
52 hgext/largefiles/proto.py not using absolute_import
54 hgext/largefiles/remotestore.py not using absolute_import
53 hgext/largefiles/remotestore.py not using absolute_import
55 hgext/largefiles/reposetup.py not using absolute_import
54 hgext/largefiles/reposetup.py not using absolute_import
56 hgext/largefiles/uisetup.py not using absolute_import
55 hgext/largefiles/uisetup.py not using absolute_import
57 hgext/largefiles/wirestore.py not using absolute_import
56 hgext/largefiles/wirestore.py not using absolute_import
58 hgext/mq.py not using absolute_import
57 hgext/mq.py not using absolute_import
59 hgext/notify.py not using absolute_import
58 hgext/notify.py not using absolute_import
60 hgext/patchbomb.py not using absolute_import
59 hgext/patchbomb.py not using absolute_import
61 hgext/purge.py not using absolute_import
60 hgext/purge.py not using absolute_import
62 hgext/rebase.py not using absolute_import
61 hgext/rebase.py not using absolute_import
63 hgext/record.py not using absolute_import
62 hgext/record.py not using absolute_import
64 hgext/relink.py not using absolute_import
63 hgext/relink.py not using absolute_import
65 hgext/schemes.py not using absolute_import
64 hgext/schemes.py not using absolute_import
66 hgext/share.py not using absolute_import
65 hgext/share.py not using absolute_import
67 hgext/shelve.py not using absolute_import
66 hgext/shelve.py not using absolute_import
68 hgext/strip.py not using absolute_import
67 hgext/strip.py not using absolute_import
69 hgext/transplant.py not using absolute_import
68 hgext/transplant.py not using absolute_import
70 hgext/win32mbcs.py not using absolute_import
69 hgext/win32mbcs.py not using absolute_import
71 hgext/win32text.py not using absolute_import
70 hgext/win32text.py not using absolute_import
72 i18n/check-translation.py not using absolute_import
71 i18n/check-translation.py not using absolute_import
73 i18n/polib.py not using absolute_import
72 i18n/polib.py not using absolute_import
74 setup.py not using absolute_import
73 setup.py not using absolute_import
75 tests/filterpyflakes.py requires print_function
74 tests/filterpyflakes.py requires print_function
76 tests/generate-working-copy-states.py requires print_function
75 tests/generate-working-copy-states.py requires print_function
77 tests/get-with-headers.py requires print_function
76 tests/get-with-headers.py requires print_function
78 tests/heredoctest.py requires print_function
77 tests/heredoctest.py requires print_function
79 tests/hypothesishelpers.py not using absolute_import
78 tests/hypothesishelpers.py not using absolute_import
80 tests/hypothesishelpers.py requires print_function
79 tests/hypothesishelpers.py requires print_function
81 tests/killdaemons.py not using absolute_import
80 tests/killdaemons.py not using absolute_import
82 tests/md5sum.py not using absolute_import
81 tests/md5sum.py not using absolute_import
83 tests/mockblackbox.py not using absolute_import
82 tests/mockblackbox.py not using absolute_import
84 tests/printenv.py not using absolute_import
83 tests/printenv.py not using absolute_import
85 tests/readlink.py not using absolute_import
84 tests/readlink.py not using absolute_import
86 tests/readlink.py requires print_function
85 tests/readlink.py requires print_function
87 tests/revlog-formatv0.py not using absolute_import
86 tests/revlog-formatv0.py not using absolute_import
88 tests/run-tests.py not using absolute_import
87 tests/run-tests.py not using absolute_import
89 tests/seq.py not using absolute_import
88 tests/seq.py not using absolute_import
90 tests/seq.py requires print_function
89 tests/seq.py requires print_function
91 tests/silenttestrunner.py not using absolute_import
90 tests/silenttestrunner.py not using absolute_import
92 tests/silenttestrunner.py requires print_function
91 tests/silenttestrunner.py requires print_function
93 tests/sitecustomize.py not using absolute_import
92 tests/sitecustomize.py not using absolute_import
94 tests/svn-safe-append.py not using absolute_import
93 tests/svn-safe-append.py not using absolute_import
95 tests/svnxml.py not using absolute_import
94 tests/svnxml.py not using absolute_import
96 tests/test-ancestor.py requires print_function
95 tests/test-ancestor.py requires print_function
97 tests/test-atomictempfile.py not using absolute_import
96 tests/test-atomictempfile.py not using absolute_import
98 tests/test-batching.py not using absolute_import
97 tests/test-batching.py not using absolute_import
99 tests/test-batching.py requires print_function
98 tests/test-batching.py requires print_function
100 tests/test-bdiff.py not using absolute_import
99 tests/test-bdiff.py not using absolute_import
101 tests/test-bdiff.py requires print_function
100 tests/test-bdiff.py requires print_function
102 tests/test-context.py not using absolute_import
101 tests/test-context.py not using absolute_import
103 tests/test-context.py requires print_function
102 tests/test-context.py requires print_function
104 tests/test-demandimport.py not using absolute_import
103 tests/test-demandimport.py not using absolute_import
105 tests/test-demandimport.py requires print_function
104 tests/test-demandimport.py requires print_function
106 tests/test-dispatch.py not using absolute_import
105 tests/test-dispatch.py not using absolute_import
107 tests/test-dispatch.py requires print_function
106 tests/test-dispatch.py requires print_function
108 tests/test-doctest.py not using absolute_import
107 tests/test-doctest.py not using absolute_import
109 tests/test-duplicateoptions.py not using absolute_import
108 tests/test-duplicateoptions.py not using absolute_import
110 tests/test-duplicateoptions.py requires print_function
109 tests/test-duplicateoptions.py requires print_function
111 tests/test-filecache.py not using absolute_import
110 tests/test-filecache.py not using absolute_import
112 tests/test-filecache.py requires print_function
111 tests/test-filecache.py requires print_function
113 tests/test-filelog.py not using absolute_import
112 tests/test-filelog.py not using absolute_import
114 tests/test-filelog.py requires print_function
113 tests/test-filelog.py requires print_function
115 tests/test-hg-parseurl.py not using absolute_import
114 tests/test-hg-parseurl.py not using absolute_import
116 tests/test-hg-parseurl.py requires print_function
115 tests/test-hg-parseurl.py requires print_function
117 tests/test-hgweb-auth.py not using absolute_import
116 tests/test-hgweb-auth.py not using absolute_import
118 tests/test-hgweb-auth.py requires print_function
117 tests/test-hgweb-auth.py requires print_function
119 tests/test-hgwebdir-paths.py not using absolute_import
118 tests/test-hgwebdir-paths.py not using absolute_import
120 tests/test-hybridencode.py not using absolute_import
119 tests/test-hybridencode.py not using absolute_import
121 tests/test-hybridencode.py requires print_function
120 tests/test-hybridencode.py requires print_function
122 tests/test-lrucachedict.py not using absolute_import
121 tests/test-lrucachedict.py not using absolute_import
123 tests/test-lrucachedict.py requires print_function
122 tests/test-lrucachedict.py requires print_function
124 tests/test-manifest.py not using absolute_import
123 tests/test-manifest.py not using absolute_import
125 tests/test-minirst.py not using absolute_import
124 tests/test-minirst.py not using absolute_import
126 tests/test-minirst.py requires print_function
125 tests/test-minirst.py requires print_function
127 tests/test-parseindex2.py not using absolute_import
126 tests/test-parseindex2.py not using absolute_import
128 tests/test-parseindex2.py requires print_function
127 tests/test-parseindex2.py requires print_function
129 tests/test-pathencode.py not using absolute_import
128 tests/test-pathencode.py not using absolute_import
130 tests/test-pathencode.py requires print_function
129 tests/test-pathencode.py requires print_function
131 tests/test-propertycache.py not using absolute_import
130 tests/test-propertycache.py not using absolute_import
132 tests/test-propertycache.py requires print_function
131 tests/test-propertycache.py requires print_function
133 tests/test-revlog-ancestry.py not using absolute_import
132 tests/test-revlog-ancestry.py not using absolute_import
134 tests/test-revlog-ancestry.py requires print_function
133 tests/test-revlog-ancestry.py requires print_function
135 tests/test-run-tests.py not using absolute_import
134 tests/test-run-tests.py not using absolute_import
136 tests/test-simplemerge.py not using absolute_import
135 tests/test-simplemerge.py not using absolute_import
137 tests/test-status-inprocess.py not using absolute_import
136 tests/test-status-inprocess.py not using absolute_import
138 tests/test-status-inprocess.py requires print_function
137 tests/test-status-inprocess.py requires print_function
139 tests/test-symlink-os-yes-fs-no.py not using absolute_import
138 tests/test-symlink-os-yes-fs-no.py not using absolute_import
140 tests/test-trusted.py not using absolute_import
139 tests/test-trusted.py not using absolute_import
141 tests/test-trusted.py requires print_function
140 tests/test-trusted.py requires print_function
142 tests/test-ui-color.py not using absolute_import
141 tests/test-ui-color.py not using absolute_import
143 tests/test-ui-color.py requires print_function
142 tests/test-ui-color.py requires print_function
144 tests/test-ui-config.py not using absolute_import
143 tests/test-ui-config.py not using absolute_import
145 tests/test-ui-config.py requires print_function
144 tests/test-ui-config.py requires print_function
146 tests/test-ui-verbosity.py not using absolute_import
145 tests/test-ui-verbosity.py not using absolute_import
147 tests/test-ui-verbosity.py requires print_function
146 tests/test-ui-verbosity.py requires print_function
148 tests/test-url.py not using absolute_import
147 tests/test-url.py not using absolute_import
149 tests/test-url.py requires print_function
148 tests/test-url.py requires print_function
150 tests/test-walkrepo.py requires print_function
149 tests/test-walkrepo.py requires print_function
151 tests/test-wireproto.py requires print_function
150 tests/test-wireproto.py requires print_function
152 tests/tinyproxy.py requires print_function
151 tests/tinyproxy.py requires print_function
General Comments 0
You need to be logged in to leave comments. Login now