##// END OF EJS Templates
py3: make largefiles/lfcommands.py use absolute_import
liscju -
r29308:8c378a7d default
parent child Browse files
Show More
@@ -1,550 +1,568 b''
1 # Copyright 2009-2010 Gregory P. Ward
1 # Copyright 2009-2010 Gregory P. Ward
2 # Copyright 2009-2010 Intelerad Medical Systems Incorporated
2 # Copyright 2009-2010 Intelerad Medical Systems Incorporated
3 # Copyright 2010-2011 Fog Creek Software
3 # Copyright 2010-2011 Fog Creek Software
4 # Copyright 2010-2011 Unity Technologies
4 # Copyright 2010-2011 Unity Technologies
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 '''High-level command function for lfconvert, plus the cmdtable.'''
9 '''High-level command function for lfconvert, plus the cmdtable.'''
10 from __future__ import absolute_import
10
11
11 import os, errno
12 import errno
13 import os
12 import shutil
14 import shutil
13
15
14 from mercurial import util, match as match_, hg, node, context, error, \
15 cmdutil, scmutil, commands
16 from mercurial.i18n import _
16 from mercurial.i18n import _
17 from mercurial.lock import release
18
17
19 from hgext.convert import convcmd
18 from mercurial import (
20 from hgext.convert import filemap
19 cmdutil,
20 commands,
21 context,
22 error,
23 hg,
24 lock,
25 match as match_,
26 node,
27 scmutil,
28 util,
29 )
21
30
22 import lfutil
31 from ..convert import (
23 import storefactory
32 convcmd,
33 filemap,
34 )
35
36 from . import (
37 lfutil,
38 storefactory
39 )
40
41 release = lock.release
24
42
25 # -- Commands ----------------------------------------------------------
43 # -- Commands ----------------------------------------------------------
26
44
27 cmdtable = {}
45 cmdtable = {}
28 command = cmdutil.command(cmdtable)
46 command = cmdutil.command(cmdtable)
29
47
30 @command('lfconvert',
48 @command('lfconvert',
31 [('s', 'size', '',
49 [('s', 'size', '',
32 _('minimum size (MB) for files to be converted as largefiles'), 'SIZE'),
50 _('minimum size (MB) for files to be converted as largefiles'), 'SIZE'),
33 ('', 'to-normal', False,
51 ('', 'to-normal', False,
34 _('convert from a largefiles repo to a normal repo')),
52 _('convert from a largefiles repo to a normal repo')),
35 ],
53 ],
36 _('hg lfconvert SOURCE DEST [FILE ...]'),
54 _('hg lfconvert SOURCE DEST [FILE ...]'),
37 norepo=True,
55 norepo=True,
38 inferrepo=True)
56 inferrepo=True)
39 def lfconvert(ui, src, dest, *pats, **opts):
57 def lfconvert(ui, src, dest, *pats, **opts):
40 '''convert a normal repository to a largefiles repository
58 '''convert a normal repository to a largefiles repository
41
59
42 Convert repository SOURCE to a new repository DEST, identical to
60 Convert repository SOURCE to a new repository DEST, identical to
43 SOURCE except that certain files will be converted as largefiles:
61 SOURCE except that certain files will be converted as largefiles:
44 specifically, any file that matches any PATTERN *or* whose size is
62 specifically, any file that matches any PATTERN *or* whose size is
45 above the minimum size threshold is converted as a largefile. The
63 above the minimum size threshold is converted as a largefile. The
46 size used to determine whether or not to track a file as a
64 size used to determine whether or not to track a file as a
47 largefile is the size of the first version of the file. The
65 largefile is the size of the first version of the file. The
48 minimum size can be specified either with --size or in
66 minimum size can be specified either with --size or in
49 configuration as ``largefiles.size``.
67 configuration as ``largefiles.size``.
50
68
51 After running this command you will need to make sure that
69 After running this command you will need to make sure that
52 largefiles is enabled anywhere you intend to push the new
70 largefiles is enabled anywhere you intend to push the new
53 repository.
71 repository.
54
72
55 Use --to-normal to convert largefiles back to normal files; after
73 Use --to-normal to convert largefiles back to normal files; after
56 this, the DEST repository can be used without largefiles at all.'''
74 this, the DEST repository can be used without largefiles at all.'''
57
75
58 if opts['to_normal']:
76 if opts['to_normal']:
59 tolfile = False
77 tolfile = False
60 else:
78 else:
61 tolfile = True
79 tolfile = True
62 size = lfutil.getminsize(ui, True, opts.get('size'), default=None)
80 size = lfutil.getminsize(ui, True, opts.get('size'), default=None)
63
81
64 if not hg.islocal(src):
82 if not hg.islocal(src):
65 raise error.Abort(_('%s is not a local Mercurial repo') % src)
83 raise error.Abort(_('%s is not a local Mercurial repo') % src)
66 if not hg.islocal(dest):
84 if not hg.islocal(dest):
67 raise error.Abort(_('%s is not a local Mercurial repo') % dest)
85 raise error.Abort(_('%s is not a local Mercurial repo') % dest)
68
86
69 rsrc = hg.repository(ui, src)
87 rsrc = hg.repository(ui, src)
70 ui.status(_('initializing destination %s\n') % dest)
88 ui.status(_('initializing destination %s\n') % dest)
71 rdst = hg.repository(ui, dest, create=True)
89 rdst = hg.repository(ui, dest, create=True)
72
90
73 success = False
91 success = False
74 dstwlock = dstlock = None
92 dstwlock = dstlock = None
75 try:
93 try:
76 # Get a list of all changesets in the source. The easy way to do this
94 # Get a list of all changesets in the source. The easy way to do this
77 # is to simply walk the changelog, using changelog.nodesbetween().
95 # is to simply walk the changelog, using changelog.nodesbetween().
78 # Take a look at mercurial/revlog.py:639 for more details.
96 # Take a look at mercurial/revlog.py:639 for more details.
79 # Use a generator instead of a list to decrease memory usage
97 # Use a generator instead of a list to decrease memory usage
80 ctxs = (rsrc[ctx] for ctx in rsrc.changelog.nodesbetween(None,
98 ctxs = (rsrc[ctx] for ctx in rsrc.changelog.nodesbetween(None,
81 rsrc.heads())[0])
99 rsrc.heads())[0])
82 revmap = {node.nullid: node.nullid}
100 revmap = {node.nullid: node.nullid}
83 if tolfile:
101 if tolfile:
84 # Lock destination to prevent modification while it is converted to.
102 # Lock destination to prevent modification while it is converted to.
85 # Don't need to lock src because we are just reading from its
103 # Don't need to lock src because we are just reading from its
86 # history which can't change.
104 # history which can't change.
87 dstwlock = rdst.wlock()
105 dstwlock = rdst.wlock()
88 dstlock = rdst.lock()
106 dstlock = rdst.lock()
89
107
90 lfiles = set()
108 lfiles = set()
91 normalfiles = set()
109 normalfiles = set()
92 if not pats:
110 if not pats:
93 pats = ui.configlist(lfutil.longname, 'patterns', default=[])
111 pats = ui.configlist(lfutil.longname, 'patterns', default=[])
94 if pats:
112 if pats:
95 matcher = match_.match(rsrc.root, '', list(pats))
113 matcher = match_.match(rsrc.root, '', list(pats))
96 else:
114 else:
97 matcher = None
115 matcher = None
98
116
99 lfiletohash = {}
117 lfiletohash = {}
100 for ctx in ctxs:
118 for ctx in ctxs:
101 ui.progress(_('converting revisions'), ctx.rev(),
119 ui.progress(_('converting revisions'), ctx.rev(),
102 unit=_('revisions'), total=rsrc['tip'].rev())
120 unit=_('revisions'), total=rsrc['tip'].rev())
103 _lfconvert_addchangeset(rsrc, rdst, ctx, revmap,
121 _lfconvert_addchangeset(rsrc, rdst, ctx, revmap,
104 lfiles, normalfiles, matcher, size, lfiletohash)
122 lfiles, normalfiles, matcher, size, lfiletohash)
105 ui.progress(_('converting revisions'), None)
123 ui.progress(_('converting revisions'), None)
106
124
107 if rdst.wvfs.exists(lfutil.shortname):
125 if rdst.wvfs.exists(lfutil.shortname):
108 rdst.wvfs.rmtree(lfutil.shortname)
126 rdst.wvfs.rmtree(lfutil.shortname)
109
127
110 for f in lfiletohash.keys():
128 for f in lfiletohash.keys():
111 if rdst.wvfs.isfile(f):
129 if rdst.wvfs.isfile(f):
112 rdst.wvfs.unlink(f)
130 rdst.wvfs.unlink(f)
113 try:
131 try:
114 rdst.wvfs.removedirs(rdst.wvfs.dirname(f))
132 rdst.wvfs.removedirs(rdst.wvfs.dirname(f))
115 except OSError:
133 except OSError:
116 pass
134 pass
117
135
118 # If there were any files converted to largefiles, add largefiles
136 # If there were any files converted to largefiles, add largefiles
119 # to the destination repository's requirements.
137 # to the destination repository's requirements.
120 if lfiles:
138 if lfiles:
121 rdst.requirements.add('largefiles')
139 rdst.requirements.add('largefiles')
122 rdst._writerequirements()
140 rdst._writerequirements()
123 else:
141 else:
124 class lfsource(filemap.filemap_source):
142 class lfsource(filemap.filemap_source):
125 def __init__(self, ui, source):
143 def __init__(self, ui, source):
126 super(lfsource, self).__init__(ui, source, None)
144 super(lfsource, self).__init__(ui, source, None)
127 self.filemapper.rename[lfutil.shortname] = '.'
145 self.filemapper.rename[lfutil.shortname] = '.'
128
146
129 def getfile(self, name, rev):
147 def getfile(self, name, rev):
130 realname, realrev = rev
148 realname, realrev = rev
131 f = super(lfsource, self).getfile(name, rev)
149 f = super(lfsource, self).getfile(name, rev)
132
150
133 if (not realname.startswith(lfutil.shortnameslash)
151 if (not realname.startswith(lfutil.shortnameslash)
134 or f[0] is None):
152 or f[0] is None):
135 return f
153 return f
136
154
137 # Substitute in the largefile data for the hash
155 # Substitute in the largefile data for the hash
138 hash = f[0].strip()
156 hash = f[0].strip()
139 path = lfutil.findfile(rsrc, hash)
157 path = lfutil.findfile(rsrc, hash)
140
158
141 if path is None:
159 if path is None:
142 raise error.Abort(_("missing largefile for '%s' in %s")
160 raise error.Abort(_("missing largefile for '%s' in %s")
143 % (realname, realrev))
161 % (realname, realrev))
144 return util.readfile(path), f[1]
162 return util.readfile(path), f[1]
145
163
146 class converter(convcmd.converter):
164 class converter(convcmd.converter):
147 def __init__(self, ui, source, dest, revmapfile, opts):
165 def __init__(self, ui, source, dest, revmapfile, opts):
148 src = lfsource(ui, source)
166 src = lfsource(ui, source)
149
167
150 super(converter, self).__init__(ui, src, dest, revmapfile,
168 super(converter, self).__init__(ui, src, dest, revmapfile,
151 opts)
169 opts)
152
170
153 found, missing = downloadlfiles(ui, rsrc)
171 found, missing = downloadlfiles(ui, rsrc)
154 if missing != 0:
172 if missing != 0:
155 raise error.Abort(_("all largefiles must be present locally"))
173 raise error.Abort(_("all largefiles must be present locally"))
156
174
157 orig = convcmd.converter
175 orig = convcmd.converter
158 convcmd.converter = converter
176 convcmd.converter = converter
159
177
160 try:
178 try:
161 convcmd.convert(ui, src, dest)
179 convcmd.convert(ui, src, dest)
162 finally:
180 finally:
163 convcmd.converter = orig
181 convcmd.converter = orig
164 success = True
182 success = True
165 finally:
183 finally:
166 if tolfile:
184 if tolfile:
167 rdst.dirstate.clear()
185 rdst.dirstate.clear()
168 release(dstlock, dstwlock)
186 release(dstlock, dstwlock)
169 if not success:
187 if not success:
170 # we failed, remove the new directory
188 # we failed, remove the new directory
171 shutil.rmtree(rdst.root)
189 shutil.rmtree(rdst.root)
172
190
173 def _lfconvert_addchangeset(rsrc, rdst, ctx, revmap, lfiles, normalfiles,
191 def _lfconvert_addchangeset(rsrc, rdst, ctx, revmap, lfiles, normalfiles,
174 matcher, size, lfiletohash):
192 matcher, size, lfiletohash):
175 # Convert src parents to dst parents
193 # Convert src parents to dst parents
176 parents = _convertparents(ctx, revmap)
194 parents = _convertparents(ctx, revmap)
177
195
178 # Generate list of changed files
196 # Generate list of changed files
179 files = _getchangedfiles(ctx, parents)
197 files = _getchangedfiles(ctx, parents)
180
198
181 dstfiles = []
199 dstfiles = []
182 for f in files:
200 for f in files:
183 if f not in lfiles and f not in normalfiles:
201 if f not in lfiles and f not in normalfiles:
184 islfile = _islfile(f, ctx, matcher, size)
202 islfile = _islfile(f, ctx, matcher, size)
185 # If this file was renamed or copied then copy
203 # If this file was renamed or copied then copy
186 # the largefile-ness of its predecessor
204 # the largefile-ness of its predecessor
187 if f in ctx.manifest():
205 if f in ctx.manifest():
188 fctx = ctx.filectx(f)
206 fctx = ctx.filectx(f)
189 renamed = fctx.renamed()
207 renamed = fctx.renamed()
190 renamedlfile = renamed and renamed[0] in lfiles
208 renamedlfile = renamed and renamed[0] in lfiles
191 islfile |= renamedlfile
209 islfile |= renamedlfile
192 if 'l' in fctx.flags():
210 if 'l' in fctx.flags():
193 if renamedlfile:
211 if renamedlfile:
194 raise error.Abort(
212 raise error.Abort(
195 _('renamed/copied largefile %s becomes symlink')
213 _('renamed/copied largefile %s becomes symlink')
196 % f)
214 % f)
197 islfile = False
215 islfile = False
198 if islfile:
216 if islfile:
199 lfiles.add(f)
217 lfiles.add(f)
200 else:
218 else:
201 normalfiles.add(f)
219 normalfiles.add(f)
202
220
203 if f in lfiles:
221 if f in lfiles:
204 dstfiles.append(lfutil.standin(f))
222 dstfiles.append(lfutil.standin(f))
205 # largefile in manifest if it has not been removed/renamed
223 # largefile in manifest if it has not been removed/renamed
206 if f in ctx.manifest():
224 if f in ctx.manifest():
207 fctx = ctx.filectx(f)
225 fctx = ctx.filectx(f)
208 if 'l' in fctx.flags():
226 if 'l' in fctx.flags():
209 renamed = fctx.renamed()
227 renamed = fctx.renamed()
210 if renamed and renamed[0] in lfiles:
228 if renamed and renamed[0] in lfiles:
211 raise error.Abort(_('largefile %s becomes symlink') % f)
229 raise error.Abort(_('largefile %s becomes symlink') % f)
212
230
213 # largefile was modified, update standins
231 # largefile was modified, update standins
214 m = util.sha1('')
232 m = util.sha1('')
215 m.update(ctx[f].data())
233 m.update(ctx[f].data())
216 hash = m.hexdigest()
234 hash = m.hexdigest()
217 if f not in lfiletohash or lfiletohash[f] != hash:
235 if f not in lfiletohash or lfiletohash[f] != hash:
218 rdst.wwrite(f, ctx[f].data(), ctx[f].flags())
236 rdst.wwrite(f, ctx[f].data(), ctx[f].flags())
219 executable = 'x' in ctx[f].flags()
237 executable = 'x' in ctx[f].flags()
220 lfutil.writestandin(rdst, lfutil.standin(f), hash,
238 lfutil.writestandin(rdst, lfutil.standin(f), hash,
221 executable)
239 executable)
222 lfiletohash[f] = hash
240 lfiletohash[f] = hash
223 else:
241 else:
224 # normal file
242 # normal file
225 dstfiles.append(f)
243 dstfiles.append(f)
226
244
227 def getfilectx(repo, memctx, f):
245 def getfilectx(repo, memctx, f):
228 if lfutil.isstandin(f):
246 if lfutil.isstandin(f):
229 # if the file isn't in the manifest then it was removed
247 # if the file isn't in the manifest then it was removed
230 # or renamed, raise IOError to indicate this
248 # or renamed, raise IOError to indicate this
231 srcfname = lfutil.splitstandin(f)
249 srcfname = lfutil.splitstandin(f)
232 try:
250 try:
233 fctx = ctx.filectx(srcfname)
251 fctx = ctx.filectx(srcfname)
234 except error.LookupError:
252 except error.LookupError:
235 return None
253 return None
236 renamed = fctx.renamed()
254 renamed = fctx.renamed()
237 if renamed:
255 if renamed:
238 # standin is always a largefile because largefile-ness
256 # standin is always a largefile because largefile-ness
239 # doesn't change after rename or copy
257 # doesn't change after rename or copy
240 renamed = lfutil.standin(renamed[0])
258 renamed = lfutil.standin(renamed[0])
241
259
242 return context.memfilectx(repo, f, lfiletohash[srcfname] + '\n',
260 return context.memfilectx(repo, f, lfiletohash[srcfname] + '\n',
243 'l' in fctx.flags(), 'x' in fctx.flags(),
261 'l' in fctx.flags(), 'x' in fctx.flags(),
244 renamed)
262 renamed)
245 else:
263 else:
246 return _getnormalcontext(repo, ctx, f, revmap)
264 return _getnormalcontext(repo, ctx, f, revmap)
247
265
248 # Commit
266 # Commit
249 _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap)
267 _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap)
250
268
251 def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap):
269 def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap):
252 mctx = context.memctx(rdst, parents, ctx.description(), dstfiles,
270 mctx = context.memctx(rdst, parents, ctx.description(), dstfiles,
253 getfilectx, ctx.user(), ctx.date(), ctx.extra())
271 getfilectx, ctx.user(), ctx.date(), ctx.extra())
254 ret = rdst.commitctx(mctx)
272 ret = rdst.commitctx(mctx)
255 lfutil.copyalltostore(rdst, ret)
273 lfutil.copyalltostore(rdst, ret)
256 rdst.setparents(ret)
274 rdst.setparents(ret)
257 revmap[ctx.node()] = rdst.changelog.tip()
275 revmap[ctx.node()] = rdst.changelog.tip()
258
276
259 # Generate list of changed files
277 # Generate list of changed files
260 def _getchangedfiles(ctx, parents):
278 def _getchangedfiles(ctx, parents):
261 files = set(ctx.files())
279 files = set(ctx.files())
262 if node.nullid not in parents:
280 if node.nullid not in parents:
263 mc = ctx.manifest()
281 mc = ctx.manifest()
264 mp1 = ctx.parents()[0].manifest()
282 mp1 = ctx.parents()[0].manifest()
265 mp2 = ctx.parents()[1].manifest()
283 mp2 = ctx.parents()[1].manifest()
266 files |= (set(mp1) | set(mp2)) - set(mc)
284 files |= (set(mp1) | set(mp2)) - set(mc)
267 for f in mc:
285 for f in mc:
268 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
286 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
269 files.add(f)
287 files.add(f)
270 return files
288 return files
271
289
272 # Convert src parents to dst parents
290 # Convert src parents to dst parents
273 def _convertparents(ctx, revmap):
291 def _convertparents(ctx, revmap):
274 parents = []
292 parents = []
275 for p in ctx.parents():
293 for p in ctx.parents():
276 parents.append(revmap[p.node()])
294 parents.append(revmap[p.node()])
277 while len(parents) < 2:
295 while len(parents) < 2:
278 parents.append(node.nullid)
296 parents.append(node.nullid)
279 return parents
297 return parents
280
298
281 # Get memfilectx for a normal file
299 # Get memfilectx for a normal file
282 def _getnormalcontext(repo, ctx, f, revmap):
300 def _getnormalcontext(repo, ctx, f, revmap):
283 try:
301 try:
284 fctx = ctx.filectx(f)
302 fctx = ctx.filectx(f)
285 except error.LookupError:
303 except error.LookupError:
286 return None
304 return None
287 renamed = fctx.renamed()
305 renamed = fctx.renamed()
288 if renamed:
306 if renamed:
289 renamed = renamed[0]
307 renamed = renamed[0]
290
308
291 data = fctx.data()
309 data = fctx.data()
292 if f == '.hgtags':
310 if f == '.hgtags':
293 data = _converttags (repo.ui, revmap, data)
311 data = _converttags (repo.ui, revmap, data)
294 return context.memfilectx(repo, f, data, 'l' in fctx.flags(),
312 return context.memfilectx(repo, f, data, 'l' in fctx.flags(),
295 'x' in fctx.flags(), renamed)
313 'x' in fctx.flags(), renamed)
296
314
297 # Remap tag data using a revision map
315 # Remap tag data using a revision map
298 def _converttags(ui, revmap, data):
316 def _converttags(ui, revmap, data):
299 newdata = []
317 newdata = []
300 for line in data.splitlines():
318 for line in data.splitlines():
301 try:
319 try:
302 id, name = line.split(' ', 1)
320 id, name = line.split(' ', 1)
303 except ValueError:
321 except ValueError:
304 ui.warn(_('skipping incorrectly formatted tag %s\n')
322 ui.warn(_('skipping incorrectly formatted tag %s\n')
305 % line)
323 % line)
306 continue
324 continue
307 try:
325 try:
308 newid = node.bin(id)
326 newid = node.bin(id)
309 except TypeError:
327 except TypeError:
310 ui.warn(_('skipping incorrectly formatted id %s\n')
328 ui.warn(_('skipping incorrectly formatted id %s\n')
311 % id)
329 % id)
312 continue
330 continue
313 try:
331 try:
314 newdata.append('%s %s\n' % (node.hex(revmap[newid]),
332 newdata.append('%s %s\n' % (node.hex(revmap[newid]),
315 name))
333 name))
316 except KeyError:
334 except KeyError:
317 ui.warn(_('no mapping for id %s\n') % id)
335 ui.warn(_('no mapping for id %s\n') % id)
318 continue
336 continue
319 return ''.join(newdata)
337 return ''.join(newdata)
320
338
321 def _islfile(file, ctx, matcher, size):
339 def _islfile(file, ctx, matcher, size):
322 '''Return true if file should be considered a largefile, i.e.
340 '''Return true if file should be considered a largefile, i.e.
323 matcher matches it or it is larger than size.'''
341 matcher matches it or it is larger than size.'''
324 # never store special .hg* files as largefiles
342 # never store special .hg* files as largefiles
325 if file == '.hgtags' or file == '.hgignore' or file == '.hgsigs':
343 if file == '.hgtags' or file == '.hgignore' or file == '.hgsigs':
326 return False
344 return False
327 if matcher and matcher(file):
345 if matcher and matcher(file):
328 return True
346 return True
329 try:
347 try:
330 return ctx.filectx(file).size() >= size * 1024 * 1024
348 return ctx.filectx(file).size() >= size * 1024 * 1024
331 except error.LookupError:
349 except error.LookupError:
332 return False
350 return False
333
351
334 def uploadlfiles(ui, rsrc, rdst, files):
352 def uploadlfiles(ui, rsrc, rdst, files):
335 '''upload largefiles to the central store'''
353 '''upload largefiles to the central store'''
336
354
337 if not files:
355 if not files:
338 return
356 return
339
357
340 store = storefactory._openstore(rsrc, rdst, put=True)
358 store = storefactory._openstore(rsrc, rdst, put=True)
341
359
342 at = 0
360 at = 0
343 ui.debug("sending statlfile command for %d largefiles\n" % len(files))
361 ui.debug("sending statlfile command for %d largefiles\n" % len(files))
344 retval = store.exists(files)
362 retval = store.exists(files)
345 files = filter(lambda h: not retval[h], files)
363 files = filter(lambda h: not retval[h], files)
346 ui.debug("%d largefiles need to be uploaded\n" % len(files))
364 ui.debug("%d largefiles need to be uploaded\n" % len(files))
347
365
348 for hash in files:
366 for hash in files:
349 ui.progress(_('uploading largefiles'), at, unit=_('files'),
367 ui.progress(_('uploading largefiles'), at, unit=_('files'),
350 total=len(files))
368 total=len(files))
351 source = lfutil.findfile(rsrc, hash)
369 source = lfutil.findfile(rsrc, hash)
352 if not source:
370 if not source:
353 raise error.Abort(_('largefile %s missing from store'
371 raise error.Abort(_('largefile %s missing from store'
354 ' (needs to be uploaded)') % hash)
372 ' (needs to be uploaded)') % hash)
355 # XXX check for errors here
373 # XXX check for errors here
356 store.put(source, hash)
374 store.put(source, hash)
357 at += 1
375 at += 1
358 ui.progress(_('uploading largefiles'), None)
376 ui.progress(_('uploading largefiles'), None)
359
377
360 def verifylfiles(ui, repo, all=False, contents=False):
378 def verifylfiles(ui, repo, all=False, contents=False):
361 '''Verify that every largefile revision in the current changeset
379 '''Verify that every largefile revision in the current changeset
362 exists in the central store. With --contents, also verify that
380 exists in the central store. With --contents, also verify that
363 the contents of each local largefile file revision are correct (SHA-1 hash
381 the contents of each local largefile file revision are correct (SHA-1 hash
364 matches the revision ID). With --all, check every changeset in
382 matches the revision ID). With --all, check every changeset in
365 this repository.'''
383 this repository.'''
366 if all:
384 if all:
367 revs = repo.revs('all()')
385 revs = repo.revs('all()')
368 else:
386 else:
369 revs = ['.']
387 revs = ['.']
370
388
371 store = storefactory._openstore(repo)
389 store = storefactory._openstore(repo)
372 return store.verify(revs, contents=contents)
390 return store.verify(revs, contents=contents)
373
391
374 def cachelfiles(ui, repo, node, filelist=None):
392 def cachelfiles(ui, repo, node, filelist=None):
375 '''cachelfiles ensures that all largefiles needed by the specified revision
393 '''cachelfiles ensures that all largefiles needed by the specified revision
376 are present in the repository's largefile cache.
394 are present in the repository's largefile cache.
377
395
378 returns a tuple (cached, missing). cached is the list of files downloaded
396 returns a tuple (cached, missing). cached is the list of files downloaded
379 by this operation; missing is the list of files that were needed but could
397 by this operation; missing is the list of files that were needed but could
380 not be found.'''
398 not be found.'''
381 lfiles = lfutil.listlfiles(repo, node)
399 lfiles = lfutil.listlfiles(repo, node)
382 if filelist:
400 if filelist:
383 lfiles = set(lfiles) & set(filelist)
401 lfiles = set(lfiles) & set(filelist)
384 toget = []
402 toget = []
385
403
386 for lfile in lfiles:
404 for lfile in lfiles:
387 try:
405 try:
388 expectedhash = repo[node][lfutil.standin(lfile)].data().strip()
406 expectedhash = repo[node][lfutil.standin(lfile)].data().strip()
389 except IOError as err:
407 except IOError as err:
390 if err.errno == errno.ENOENT:
408 if err.errno == errno.ENOENT:
391 continue # node must be None and standin wasn't found in wctx
409 continue # node must be None and standin wasn't found in wctx
392 raise
410 raise
393 if not lfutil.findfile(repo, expectedhash):
411 if not lfutil.findfile(repo, expectedhash):
394 toget.append((lfile, expectedhash))
412 toget.append((lfile, expectedhash))
395
413
396 if toget:
414 if toget:
397 store = storefactory._openstore(repo)
415 store = storefactory._openstore(repo)
398 ret = store.get(toget)
416 ret = store.get(toget)
399 return ret
417 return ret
400
418
401 return ([], [])
419 return ([], [])
402
420
403 def downloadlfiles(ui, repo, rev=None):
421 def downloadlfiles(ui, repo, rev=None):
404 matchfn = scmutil.match(repo[None],
422 matchfn = scmutil.match(repo[None],
405 [repo.wjoin(lfutil.shortname)], {})
423 [repo.wjoin(lfutil.shortname)], {})
406 def prepare(ctx, fns):
424 def prepare(ctx, fns):
407 pass
425 pass
408 totalsuccess = 0
426 totalsuccess = 0
409 totalmissing = 0
427 totalmissing = 0
410 if rev != []: # walkchangerevs on empty list would return all revs
428 if rev != []: # walkchangerevs on empty list would return all revs
411 for ctx in cmdutil.walkchangerevs(repo, matchfn, {'rev' : rev},
429 for ctx in cmdutil.walkchangerevs(repo, matchfn, {'rev' : rev},
412 prepare):
430 prepare):
413 success, missing = cachelfiles(ui, repo, ctx.node())
431 success, missing = cachelfiles(ui, repo, ctx.node())
414 totalsuccess += len(success)
432 totalsuccess += len(success)
415 totalmissing += len(missing)
433 totalmissing += len(missing)
416 ui.status(_("%d additional largefiles cached\n") % totalsuccess)
434 ui.status(_("%d additional largefiles cached\n") % totalsuccess)
417 if totalmissing > 0:
435 if totalmissing > 0:
418 ui.status(_("%d largefiles failed to download\n") % totalmissing)
436 ui.status(_("%d largefiles failed to download\n") % totalmissing)
419 return totalsuccess, totalmissing
437 return totalsuccess, totalmissing
420
438
421 def updatelfiles(ui, repo, filelist=None, printmessage=None,
439 def updatelfiles(ui, repo, filelist=None, printmessage=None,
422 normallookup=False):
440 normallookup=False):
423 '''Update largefiles according to standins in the working directory
441 '''Update largefiles according to standins in the working directory
424
442
425 If ``printmessage`` is other than ``None``, it means "print (or
443 If ``printmessage`` is other than ``None``, it means "print (or
426 ignore, for false) message forcibly".
444 ignore, for false) message forcibly".
427 '''
445 '''
428 statuswriter = lfutil.getstatuswriter(ui, repo, printmessage)
446 statuswriter = lfutil.getstatuswriter(ui, repo, printmessage)
429 with repo.wlock():
447 with repo.wlock():
430 lfdirstate = lfutil.openlfdirstate(ui, repo)
448 lfdirstate = lfutil.openlfdirstate(ui, repo)
431 lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate)
449 lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate)
432
450
433 if filelist is not None:
451 if filelist is not None:
434 filelist = set(filelist)
452 filelist = set(filelist)
435 lfiles = [f for f in lfiles if f in filelist]
453 lfiles = [f for f in lfiles if f in filelist]
436
454
437 update = {}
455 update = {}
438 updated, removed = 0, 0
456 updated, removed = 0, 0
439 wvfs = repo.wvfs
457 wvfs = repo.wvfs
440 for lfile in lfiles:
458 for lfile in lfiles:
441 rellfile = lfile
459 rellfile = lfile
442 rellfileorig = os.path.relpath(
460 rellfileorig = os.path.relpath(
443 scmutil.origpath(ui, repo, wvfs.join(rellfile)),
461 scmutil.origpath(ui, repo, wvfs.join(rellfile)),
444 start=repo.root)
462 start=repo.root)
445 relstandin = lfutil.standin(lfile)
463 relstandin = lfutil.standin(lfile)
446 relstandinorig = os.path.relpath(
464 relstandinorig = os.path.relpath(
447 scmutil.origpath(ui, repo, wvfs.join(relstandin)),
465 scmutil.origpath(ui, repo, wvfs.join(relstandin)),
448 start=repo.root)
466 start=repo.root)
449 if wvfs.exists(relstandin):
467 if wvfs.exists(relstandin):
450 if (wvfs.exists(relstandinorig) and
468 if (wvfs.exists(relstandinorig) and
451 wvfs.exists(rellfile)):
469 wvfs.exists(rellfile)):
452 shutil.copyfile(wvfs.join(rellfile),
470 shutil.copyfile(wvfs.join(rellfile),
453 wvfs.join(rellfileorig))
471 wvfs.join(rellfileorig))
454 wvfs.unlinkpath(relstandinorig)
472 wvfs.unlinkpath(relstandinorig)
455 expecthash = lfutil.readstandin(repo, lfile)
473 expecthash = lfutil.readstandin(repo, lfile)
456 if expecthash != '':
474 if expecthash != '':
457 if lfile not in repo[None]: # not switched to normal file
475 if lfile not in repo[None]: # not switched to normal file
458 wvfs.unlinkpath(rellfile, ignoremissing=True)
476 wvfs.unlinkpath(rellfile, ignoremissing=True)
459 # use normallookup() to allocate an entry in largefiles
477 # use normallookup() to allocate an entry in largefiles
460 # dirstate to prevent lfilesrepo.status() from reporting
478 # dirstate to prevent lfilesrepo.status() from reporting
461 # missing files as removed.
479 # missing files as removed.
462 lfdirstate.normallookup(lfile)
480 lfdirstate.normallookup(lfile)
463 update[lfile] = expecthash
481 update[lfile] = expecthash
464 else:
482 else:
465 # Remove lfiles for which the standin is deleted, unless the
483 # Remove lfiles for which the standin is deleted, unless the
466 # lfile is added to the repository again. This happens when a
484 # lfile is added to the repository again. This happens when a
467 # largefile is converted back to a normal file: the standin
485 # largefile is converted back to a normal file: the standin
468 # disappears, but a new (normal) file appears as the lfile.
486 # disappears, but a new (normal) file appears as the lfile.
469 if (wvfs.exists(rellfile) and
487 if (wvfs.exists(rellfile) and
470 repo.dirstate.normalize(lfile) not in repo[None]):
488 repo.dirstate.normalize(lfile) not in repo[None]):
471 wvfs.unlinkpath(rellfile)
489 wvfs.unlinkpath(rellfile)
472 removed += 1
490 removed += 1
473
491
474 # largefile processing might be slow and be interrupted - be prepared
492 # largefile processing might be slow and be interrupted - be prepared
475 lfdirstate.write()
493 lfdirstate.write()
476
494
477 if lfiles:
495 if lfiles:
478 statuswriter(_('getting changed largefiles\n'))
496 statuswriter(_('getting changed largefiles\n'))
479 cachelfiles(ui, repo, None, lfiles)
497 cachelfiles(ui, repo, None, lfiles)
480
498
481 for lfile in lfiles:
499 for lfile in lfiles:
482 update1 = 0
500 update1 = 0
483
501
484 expecthash = update.get(lfile)
502 expecthash = update.get(lfile)
485 if expecthash:
503 if expecthash:
486 if not lfutil.copyfromcache(repo, expecthash, lfile):
504 if not lfutil.copyfromcache(repo, expecthash, lfile):
487 # failed ... but already removed and set to normallookup
505 # failed ... but already removed and set to normallookup
488 continue
506 continue
489 # Synchronize largefile dirstate to the last modified
507 # Synchronize largefile dirstate to the last modified
490 # time of the file
508 # time of the file
491 lfdirstate.normal(lfile)
509 lfdirstate.normal(lfile)
492 update1 = 1
510 update1 = 1
493
511
494 # copy the state of largefile standin from the repository's
512 # copy the state of largefile standin from the repository's
495 # dirstate to its state in the lfdirstate.
513 # dirstate to its state in the lfdirstate.
496 rellfile = lfile
514 rellfile = lfile
497 relstandin = lfutil.standin(lfile)
515 relstandin = lfutil.standin(lfile)
498 if wvfs.exists(relstandin):
516 if wvfs.exists(relstandin):
499 mode = wvfs.stat(relstandin).st_mode
517 mode = wvfs.stat(relstandin).st_mode
500 if mode != wvfs.stat(rellfile).st_mode:
518 if mode != wvfs.stat(rellfile).st_mode:
501 wvfs.chmod(rellfile, mode)
519 wvfs.chmod(rellfile, mode)
502 update1 = 1
520 update1 = 1
503
521
504 updated += update1
522 updated += update1
505
523
506 lfutil.synclfdirstate(repo, lfdirstate, lfile, normallookup)
524 lfutil.synclfdirstate(repo, lfdirstate, lfile, normallookup)
507
525
508 lfdirstate.write()
526 lfdirstate.write()
509 if lfiles:
527 if lfiles:
510 statuswriter(_('%d largefiles updated, %d removed\n') % (updated,
528 statuswriter(_('%d largefiles updated, %d removed\n') % (updated,
511 removed))
529 removed))
512
530
513 @command('lfpull',
531 @command('lfpull',
514 [('r', 'rev', [], _('pull largefiles for these revisions'))
532 [('r', 'rev', [], _('pull largefiles for these revisions'))
515 ] + commands.remoteopts,
533 ] + commands.remoteopts,
516 _('-r REV... [-e CMD] [--remotecmd CMD] [SOURCE]'))
534 _('-r REV... [-e CMD] [--remotecmd CMD] [SOURCE]'))
517 def lfpull(ui, repo, source="default", **opts):
535 def lfpull(ui, repo, source="default", **opts):
518 """pull largefiles for the specified revisions from the specified source
536 """pull largefiles for the specified revisions from the specified source
519
537
520 Pull largefiles that are referenced from local changesets but missing
538 Pull largefiles that are referenced from local changesets but missing
521 locally, pulling from a remote repository to the local cache.
539 locally, pulling from a remote repository to the local cache.
522
540
523 If SOURCE is omitted, the 'default' path will be used.
541 If SOURCE is omitted, the 'default' path will be used.
524 See :hg:`help urls` for more information.
542 See :hg:`help urls` for more information.
525
543
526 .. container:: verbose
544 .. container:: verbose
527
545
528 Some examples:
546 Some examples:
529
547
530 - pull largefiles for all branch heads::
548 - pull largefiles for all branch heads::
531
549
532 hg lfpull -r "head() and not closed()"
550 hg lfpull -r "head() and not closed()"
533
551
534 - pull largefiles on the default branch::
552 - pull largefiles on the default branch::
535
553
536 hg lfpull -r "branch(default)"
554 hg lfpull -r "branch(default)"
537 """
555 """
538 repo.lfpullsource = source
556 repo.lfpullsource = source
539
557
540 revs = opts.get('rev', [])
558 revs = opts.get('rev', [])
541 if not revs:
559 if not revs:
542 raise error.Abort(_('no revisions specified'))
560 raise error.Abort(_('no revisions specified'))
543 revs = scmutil.revrange(repo, revs)
561 revs = scmutil.revrange(repo, revs)
544
562
545 numcached = 0
563 numcached = 0
546 for rev in revs:
564 for rev in revs:
547 ui.note(_('pulling largefiles for revision %s\n') % rev)
565 ui.note(_('pulling largefiles for revision %s\n') % rev)
548 (cached, missing) = cachelfiles(ui, repo, rev)
566 (cached, missing) = cachelfiles(ui, repo, rev)
549 numcached += len(cached)
567 numcached += len(cached)
550 ui.status(_("%d largefiles cached\n") % numcached)
568 ui.status(_("%d largefiles cached\n") % numcached)
@@ -1,160 +1,159 b''
1 #require test-repo
1 #require test-repo
2
2
3 $ . "$TESTDIR/helpers-testrepo.sh"
3 $ . "$TESTDIR/helpers-testrepo.sh"
4 $ cd "$TESTDIR"/..
4 $ cd "$TESTDIR"/..
5
5
6 $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs python contrib/check-py3-compat.py
6 $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs python contrib/check-py3-compat.py
7 hgext/fsmonitor/pywatchman/__init__.py not using absolute_import
7 hgext/fsmonitor/pywatchman/__init__.py not using absolute_import
8 hgext/fsmonitor/pywatchman/__init__.py requires print_function
8 hgext/fsmonitor/pywatchman/__init__.py requires print_function
9 hgext/fsmonitor/pywatchman/capabilities.py not using absolute_import
9 hgext/fsmonitor/pywatchman/capabilities.py not using absolute_import
10 hgext/fsmonitor/pywatchman/pybser.py not using absolute_import
10 hgext/fsmonitor/pywatchman/pybser.py not using absolute_import
11 hgext/highlight/__init__.py not using absolute_import
11 hgext/highlight/__init__.py not using absolute_import
12 hgext/highlight/highlight.py not using absolute_import
12 hgext/highlight/highlight.py not using absolute_import
13 hgext/largefiles/lfcommands.py not using absolute_import
14 hgext/largefiles/lfutil.py not using absolute_import
13 hgext/largefiles/lfutil.py not using absolute_import
15 hgext/largefiles/localstore.py not using absolute_import
14 hgext/largefiles/localstore.py not using absolute_import
16 hgext/largefiles/overrides.py not using absolute_import
15 hgext/largefiles/overrides.py not using absolute_import
17 hgext/largefiles/proto.py not using absolute_import
16 hgext/largefiles/proto.py not using absolute_import
18 hgext/largefiles/remotestore.py not using absolute_import
17 hgext/largefiles/remotestore.py not using absolute_import
19 hgext/largefiles/reposetup.py not using absolute_import
18 hgext/largefiles/reposetup.py not using absolute_import
20 hgext/largefiles/uisetup.py not using absolute_import
19 hgext/largefiles/uisetup.py not using absolute_import
21 hgext/largefiles/wirestore.py not using absolute_import
20 hgext/largefiles/wirestore.py not using absolute_import
22 hgext/share.py not using absolute_import
21 hgext/share.py not using absolute_import
23 hgext/win32text.py not using absolute_import
22 hgext/win32text.py not using absolute_import
24 i18n/check-translation.py not using absolute_import
23 i18n/check-translation.py not using absolute_import
25 i18n/polib.py not using absolute_import
24 i18n/polib.py not using absolute_import
26 setup.py not using absolute_import
25 setup.py not using absolute_import
27 tests/heredoctest.py requires print_function
26 tests/heredoctest.py requires print_function
28 tests/md5sum.py not using absolute_import
27 tests/md5sum.py not using absolute_import
29 tests/readlink.py not using absolute_import
28 tests/readlink.py not using absolute_import
30 tests/run-tests.py not using absolute_import
29 tests/run-tests.py not using absolute_import
31 tests/test-demandimport.py not using absolute_import
30 tests/test-demandimport.py not using absolute_import
32
31
33 #if py3exe
32 #if py3exe
34 $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs $PYTHON3 contrib/check-py3-compat.py
33 $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs $PYTHON3 contrib/check-py3-compat.py
35 doc/hgmanpage.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
34 doc/hgmanpage.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
36 hgext/automv.py: error importing module: <SyntaxError> invalid syntax (commands.py, line *) (line *) (glob)
35 hgext/automv.py: error importing module: <SyntaxError> invalid syntax (commands.py, line *) (line *) (glob)
37 hgext/blackbox.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
36 hgext/blackbox.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
38 hgext/bugzilla.py: error importing module: <ImportError> No module named 'urlparse' (line *) (glob)
37 hgext/bugzilla.py: error importing module: <ImportError> No module named 'urlparse' (line *) (glob)
39 hgext/censor.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
38 hgext/censor.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
40 hgext/chgserver.py: error importing module: <ImportError> No module named 'SocketServer' (line *) (glob)
39 hgext/chgserver.py: error importing module: <ImportError> No module named 'SocketServer' (line *) (glob)
41 hgext/children.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
40 hgext/children.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
42 hgext/churn.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
41 hgext/churn.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
43 hgext/clonebundles.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
42 hgext/clonebundles.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
44 hgext/color.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
43 hgext/color.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
45 hgext/convert/bzr.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
44 hgext/convert/bzr.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
46 hgext/convert/common.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
45 hgext/convert/common.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
47 hgext/convert/convcmd.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
46 hgext/convert/convcmd.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
48 hgext/convert/cvs.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
47 hgext/convert/cvs.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
49 hgext/convert/cvsps.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
48 hgext/convert/cvsps.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
50 hgext/convert/darcs.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
49 hgext/convert/darcs.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
51 hgext/convert/filemap.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
50 hgext/convert/filemap.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
52 hgext/convert/git.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
51 hgext/convert/git.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
53 hgext/convert/gnuarch.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
52 hgext/convert/gnuarch.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
54 hgext/convert/hg.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
53 hgext/convert/hg.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
55 hgext/convert/monotone.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
54 hgext/convert/monotone.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
56 hgext/convert/p*.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
55 hgext/convert/p*.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
57 hgext/convert/subversion.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
56 hgext/convert/subversion.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
58 hgext/convert/transport.py: error importing module: <ImportError> No module named 'svn.client' (line *) (glob)
57 hgext/convert/transport.py: error importing module: <ImportError> No module named 'svn.client' (line *) (glob)
59 hgext/eol.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
58 hgext/eol.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
60 hgext/extdiff.py: error importing module: <SyntaxError> invalid syntax (archival.py, line *) (line *) (glob)
59 hgext/extdiff.py: error importing module: <SyntaxError> invalid syntax (archival.py, line *) (line *) (glob)
61 hgext/factotum.py: error importing: <ImportError> No module named 'rfc822' (error at __init__.py:*) (glob)
60 hgext/factotum.py: error importing: <ImportError> No module named 'rfc822' (error at __init__.py:*) (glob)
62 hgext/fetch.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
61 hgext/fetch.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
63 hgext/fsmonitor/watchmanclient.py: error importing module: <SystemError> Parent module 'hgext.fsmonitor' not loaded, cannot perform relative import (line *) (glob)
62 hgext/fsmonitor/watchmanclient.py: error importing module: <SystemError> Parent module 'hgext.fsmonitor' not loaded, cannot perform relative import (line *) (glob)
64 hgext/gpg.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
63 hgext/gpg.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
65 hgext/graphlog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
64 hgext/graphlog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
66 hgext/hgk.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
65 hgext/hgk.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
67 hgext/histedit.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
66 hgext/histedit.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
68 hgext/keyword.py: error importing: <ImportError> No module named 'BaseHTTPServer' (error at common.py:*) (glob)
67 hgext/keyword.py: error importing: <ImportError> No module named 'BaseHTTPServer' (error at common.py:*) (glob)
69 hgext/largefiles/basestore.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
68 hgext/largefiles/basestore.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
70 hgext/largefiles/lfcommands.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
69 hgext/largefiles/lfcommands.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
71 hgext/largefiles/lfutil.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
70 hgext/largefiles/lfutil.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
72 hgext/largefiles/localstore.py: error importing module: <ImportError> No module named 'lfutil' (line *) (glob)
71 hgext/largefiles/localstore.py: error importing module: <ImportError> No module named 'lfutil' (line *) (glob)
73 hgext/largefiles/overrides.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
72 hgext/largefiles/overrides.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
74 hgext/largefiles/proto.py: error importing: <ImportError> No module named 'httplib' (error at httppeer.py:*) (glob)
73 hgext/largefiles/proto.py: error importing: <ImportError> No module named 'httplib' (error at httppeer.py:*) (glob)
75 hgext/largefiles/remotestore.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at wireproto.py:*) (glob)
74 hgext/largefiles/remotestore.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at wireproto.py:*) (glob)
76 hgext/largefiles/reposetup.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
75 hgext/largefiles/reposetup.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
77 hgext/largefiles/uisetup.py: error importing module: <SyntaxError> invalid syntax (archival.py, line *) (line *) (glob)
76 hgext/largefiles/uisetup.py: error importing module: <SyntaxError> invalid syntax (archival.py, line *) (line *) (glob)
78 hgext/largefiles/wirestore.py: error importing module: <ImportError> No module named 'lfutil' (line *) (glob)
77 hgext/largefiles/wirestore.py: error importing module: <ImportError> No module named 'lfutil' (line *) (glob)
79 hgext/mq.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
78 hgext/mq.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
80 hgext/notify.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
79 hgext/notify.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
81 hgext/pager.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
80 hgext/pager.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
82 hgext/patchbomb.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
81 hgext/patchbomb.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
83 hgext/purge.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
82 hgext/purge.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
84 hgext/rebase.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
83 hgext/rebase.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
85 hgext/record.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
84 hgext/record.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
86 hgext/relink.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
85 hgext/relink.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
87 hgext/schemes.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
86 hgext/schemes.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
88 hgext/share.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
87 hgext/share.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
89 hgext/shelve.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
88 hgext/shelve.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
90 hgext/strip.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
89 hgext/strip.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
91 hgext/transplant.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
90 hgext/transplant.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
92 mercurial/archival.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
91 mercurial/archival.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
93 mercurial/branchmap.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
92 mercurial/branchmap.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
94 mercurial/bundle*.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
93 mercurial/bundle*.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
95 mercurial/bundlerepo.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
94 mercurial/bundlerepo.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
96 mercurial/changegroup.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
95 mercurial/changegroup.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
97 mercurial/changelog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
96 mercurial/changelog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
98 mercurial/cmdutil.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
97 mercurial/cmdutil.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
99 mercurial/commands.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
98 mercurial/commands.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
100 mercurial/commandserver.py: error importing module: <ImportError> No module named 'SocketServer' (line *) (glob)
99 mercurial/commandserver.py: error importing module: <ImportError> No module named 'SocketServer' (line *) (glob)
101 mercurial/context.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
100 mercurial/context.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
102 mercurial/copies.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
101 mercurial/copies.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
103 mercurial/crecord.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
102 mercurial/crecord.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
104 mercurial/dirstate.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
103 mercurial/dirstate.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
105 mercurial/discovery.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
104 mercurial/discovery.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
106 mercurial/dispatch.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
105 mercurial/dispatch.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
107 mercurial/exchange.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
106 mercurial/exchange.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
108 mercurial/extensions.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
107 mercurial/extensions.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
109 mercurial/filelog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
108 mercurial/filelog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
110 mercurial/filemerge.py: error importing: <ImportError> No module named 'cPickle' (error at formatter.py:*) (glob)
109 mercurial/filemerge.py: error importing: <ImportError> No module named 'cPickle' (error at formatter.py:*) (glob)
111 mercurial/fileset.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
110 mercurial/fileset.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
112 mercurial/formatter.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
111 mercurial/formatter.py: error importing module: <ImportError> No module named 'cPickle' (line *) (glob)
113 mercurial/graphmod.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
112 mercurial/graphmod.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
114 mercurial/help.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
113 mercurial/help.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
115 mercurial/hg.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
114 mercurial/hg.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at bundlerepo.py:*) (glob)
116 mercurial/hgweb/common.py: error importing module: <ImportError> No module named 'BaseHTTPServer' (line *) (glob)
115 mercurial/hgweb/common.py: error importing module: <ImportError> No module named 'BaseHTTPServer' (line *) (glob)
117 mercurial/hgweb/hgweb_mod.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
116 mercurial/hgweb/hgweb_mod.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
118 mercurial/hgweb/hgwebdir_mod.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
117 mercurial/hgweb/hgwebdir_mod.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
119 mercurial/hgweb/protocol.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
118 mercurial/hgweb/protocol.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
120 mercurial/hgweb/request.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
119 mercurial/hgweb/request.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
121 mercurial/hgweb/server.py: error importing module: <ImportError> No module named 'BaseHTTPServer' (line *) (glob)
120 mercurial/hgweb/server.py: error importing module: <ImportError> No module named 'BaseHTTPServer' (line *) (glob)
122 mercurial/hgweb/webcommands.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
121 mercurial/hgweb/webcommands.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
123 mercurial/hgweb/webutil.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
122 mercurial/hgweb/webutil.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
124 mercurial/hgweb/wsgicgi.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
123 mercurial/hgweb/wsgicgi.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
125 mercurial/hook.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
124 mercurial/hook.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
126 mercurial/httpconnection.py: error importing: <ImportError> No module named 'rfc822' (error at __init__.py:*) (glob)
125 mercurial/httpconnection.py: error importing: <ImportError> No module named 'rfc822' (error at __init__.py:*) (glob)
127 mercurial/httppeer.py: error importing module: <ImportError> No module named 'httplib' (line *) (glob)
126 mercurial/httppeer.py: error importing module: <ImportError> No module named 'httplib' (line *) (glob)
128 mercurial/keepalive.py: error importing module: <ImportError> No module named 'httplib' (line *) (glob)
127 mercurial/keepalive.py: error importing module: <ImportError> No module named 'httplib' (line *) (glob)
129 mercurial/localrepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
128 mercurial/localrepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
130 mercurial/mail.py: error importing module: <AttributeError> module 'email' has no attribute 'Header' (line *) (glob)
129 mercurial/mail.py: error importing module: <AttributeError> module 'email' has no attribute 'Header' (line *) (glob)
131 mercurial/manifest.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
130 mercurial/manifest.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
132 mercurial/merge.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
131 mercurial/merge.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
133 mercurial/namespaces.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
132 mercurial/namespaces.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
134 mercurial/patch.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
133 mercurial/patch.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
135 mercurial/pure/mpatch.py: error importing module: <ImportError> cannot import name 'pycompat' (line *) (glob)
134 mercurial/pure/mpatch.py: error importing module: <ImportError> cannot import name 'pycompat' (line *) (glob)
136 mercurial/pure/parsers.py: error importing module: <ImportError> No module named 'mercurial.pure.node' (line *) (glob)
135 mercurial/pure/parsers.py: error importing module: <ImportError> No module named 'mercurial.pure.node' (line *) (glob)
137 mercurial/repair.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
136 mercurial/repair.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
138 mercurial/revlog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
137 mercurial/revlog.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
139 mercurial/revset.py: error importing module: <AttributeError> 'dict' object has no attribute 'iteritems' (line *) (glob)
138 mercurial/revset.py: error importing module: <AttributeError> 'dict' object has no attribute 'iteritems' (line *) (glob)
140 mercurial/scmutil.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
139 mercurial/scmutil.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
141 mercurial/scmwindows.py: error importing module: <ImportError> No module named '_winreg' (line *) (glob)
140 mercurial/scmwindows.py: error importing module: <ImportError> No module named '_winreg' (line *) (glob)
142 mercurial/simplemerge.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
141 mercurial/simplemerge.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
143 mercurial/sshpeer.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at wireproto.py:*) (glob)
142 mercurial/sshpeer.py: error importing: <SyntaxError> invalid syntax (bundle*.py, line *) (error at wireproto.py:*) (glob)
144 mercurial/sshserver.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
143 mercurial/sshserver.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
145 mercurial/statichttprepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
144 mercurial/statichttprepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
146 mercurial/store.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
145 mercurial/store.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
147 mercurial/streamclone.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
146 mercurial/streamclone.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
148 mercurial/subrepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
147 mercurial/subrepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
149 mercurial/templatefilters.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
148 mercurial/templatefilters.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
150 mercurial/templatekw.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
149 mercurial/templatekw.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
151 mercurial/templater.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
150 mercurial/templater.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
152 mercurial/ui.py: error importing: <ImportError> No module named 'cPickle' (error at formatter.py:*) (glob)
151 mercurial/ui.py: error importing: <ImportError> No module named 'cPickle' (error at formatter.py:*) (glob)
153 mercurial/unionrepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
152 mercurial/unionrepo.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
154 mercurial/url.py: error importing module: <ImportError> No module named 'httplib' (line *) (glob)
153 mercurial/url.py: error importing module: <ImportError> No module named 'httplib' (line *) (glob)
155 mercurial/verify.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
154 mercurial/verify.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*) (glob)
156 mercurial/win*.py: error importing module: <ImportError> No module named 'msvcrt' (line *) (glob)
155 mercurial/win*.py: error importing module: <ImportError> No module named 'msvcrt' (line *) (glob)
157 mercurial/windows.py: error importing module: <ImportError> No module named '_winreg' (line *) (glob)
156 mercurial/windows.py: error importing module: <ImportError> No module named '_winreg' (line *) (glob)
158 mercurial/wireproto.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
157 mercurial/wireproto.py: error importing module: <SyntaxError> invalid syntax (bundle*.py, line *) (line *) (glob)
159
158
160 #endif
159 #endif
General Comments 0
You need to be logged in to leave comments. Login now