comparison mercurial/changegroup.py @ 23382:a81c76106d90

merge with stable
author Matt Mackall <mpm@selenic.com>
date Sat, 22 Nov 2014 17:09:04 -0600
parents 6c1351352b6c cc0ff93d0c0c
children 4ab66de46a96
comparison
equal deleted inserted replaced
23380:90cc552ceed5 23382:a81c76106d90
323 progress = self._progress 323 progress = self._progress
324 324
325 # for progress output 325 # for progress output
326 msgbundling = _('bundling') 326 msgbundling = _('bundling')
327 327
328 clrevorder = {}
328 mfs = {} # needed manifests 329 mfs = {} # needed manifests
329 fnodes = {} # needed file nodes 330 fnodes = {} # needed file nodes
330 changedfiles = set() 331 changedfiles = set()
331 332
332 # Callback for the changelog, used to collect changed files and manifest 333 # Callback for the changelog, used to collect changed files and manifest
333 # nodes. 334 # nodes.
334 # Returns the linkrev node (identity in the changelog case). 335 # Returns the linkrev node (identity in the changelog case).
335 def lookupcl(x): 336 def lookupcl(x):
336 c = cl.read(x) 337 c = cl.read(x)
338 clrevorder[x] = len(clrevorder)
337 changedfiles.update(c[3]) 339 changedfiles.update(c[3])
338 # record the first changeset introducing this manifest version 340 # record the first changeset introducing this manifest version
339 mfs.setdefault(c[0], x) 341 mfs.setdefault(c[0], x)
340 return x 342 return x
341 343
347 # Callback for the manifest, used to collect linkrevs for filelog 349 # Callback for the manifest, used to collect linkrevs for filelog
348 # revisions. 350 # revisions.
349 # Returns the linkrev node (collected in lookupcl). 351 # Returns the linkrev node (collected in lookupcl).
350 def lookupmf(x): 352 def lookupmf(x):
351 clnode = mfs[x] 353 clnode = mfs[x]
352 if not fastpathlinkrev: 354 if not fastpathlinkrev or reorder:
353 mdata = mf.readfast(x) 355 mdata = mf.readfast(x)
354 for f, n in mdata.iteritems(): 356 for f, n in mdata.iteritems():
355 if f in changedfiles: 357 if f in changedfiles:
356 # record the first changeset introducing this filelog 358 # record the first changeset introducing this filelog
357 # version 359 # version
358 fnodes.setdefault(f, {}).setdefault(n, clnode) 360 fclnodes = fnodes.setdefault(f, {})
361 fclnode = fclnodes.setdefault(n, clnode)
362 if clrevorder[clnode] < clrevorder[fclnode]:
363 fclnodes[n] = clnode
359 return clnode 364 return clnode
360 365
361 mfnodes = self.prune(mf, mfs, commonrevs, source) 366 mfnodes = self.prune(mf, mfs, commonrevs, source)
362 for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'), 367 for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'),
363 reorder=reorder): 368 reorder=reorder):
366 371
367 mfs.clear() 372 mfs.clear()
368 needed = set(cl.rev(x) for x in clnodes) 373 needed = set(cl.rev(x) for x in clnodes)
369 374
370 def linknodes(filerevlog, fname): 375 def linknodes(filerevlog, fname):
371 if fastpathlinkrev: 376 if fastpathlinkrev and not reorder:
372 llr = filerevlog.linkrev 377 llr = filerevlog.linkrev
373 def genfilenodes(): 378 def genfilenodes():
374 for r in filerevlog: 379 for r in filerevlog:
375 linkrev = llr(r) 380 linkrev = llr(r)
376 if linkrev in needed: 381 if linkrev in needed: