Mercurial > public > mercurial-scm > hg
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: |