mercurial/changegroup.py
branchstable
changeset 23381 cc0ff93d0c0c
parent 23226 5dcaed20b27c
child 23382 a81c76106d90
equal deleted inserted replaced
23377:c00b156d6e76 23381:cc0ff93d0c0c
   314         progress = self._progress
   314         progress = self._progress
   315 
   315 
   316         # for progress output
   316         # for progress output
   317         msgbundling = _('bundling')
   317         msgbundling = _('bundling')
   318 
   318 
       
   319         clrevorder = {}
   319         mfs = {} # needed manifests
   320         mfs = {} # needed manifests
   320         fnodes = {} # needed file nodes
   321         fnodes = {} # needed file nodes
   321         changedfiles = set()
   322         changedfiles = set()
   322 
   323 
   323         # Callback for the changelog, used to collect changed files and manifest
   324         # Callback for the changelog, used to collect changed files and manifest
   324         # nodes.
   325         # nodes.
   325         # Returns the linkrev node (identity in the changelog case).
   326         # Returns the linkrev node (identity in the changelog case).
   326         def lookupcl(x):
   327         def lookupcl(x):
   327             c = cl.read(x)
   328             c = cl.read(x)
       
   329             clrevorder[x] = len(clrevorder)
   328             changedfiles.update(c[3])
   330             changedfiles.update(c[3])
   329             # record the first changeset introducing this manifest version
   331             # record the first changeset introducing this manifest version
   330             mfs.setdefault(c[0], x)
   332             mfs.setdefault(c[0], x)
   331             return x
   333             return x
   332 
   334 
   338         # Callback for the manifest, used to collect linkrevs for filelog
   340         # Callback for the manifest, used to collect linkrevs for filelog
   339         # revisions.
   341         # revisions.
   340         # Returns the linkrev node (collected in lookupcl).
   342         # Returns the linkrev node (collected in lookupcl).
   341         def lookupmf(x):
   343         def lookupmf(x):
   342             clnode = mfs[x]
   344             clnode = mfs[x]
   343             if not fastpathlinkrev:
   345             if not fastpathlinkrev or reorder:
   344                 mdata = mf.readfast(x)
   346                 mdata = mf.readfast(x)
   345                 for f, n in mdata.iteritems():
   347                 for f, n in mdata.iteritems():
   346                     if f in changedfiles:
   348                     if f in changedfiles:
   347                         # record the first changeset introducing this filelog
   349                         # record the first changeset introducing this filelog
   348                         # version
   350                         # version
   349                         fnodes.setdefault(f, {}).setdefault(n, clnode)
   351                         fclnodes = fnodes.setdefault(f, {})
       
   352                         fclnode = fclnodes.setdefault(n, clnode)
       
   353                         if clrevorder[clnode] < clrevorder[fclnode]:
       
   354                             fclnodes[n] = clnode
   350             return clnode
   355             return clnode
   351 
   356 
   352         mfnodes = self.prune(mf, mfs, commonrevs, source)
   357         mfnodes = self.prune(mf, mfs, commonrevs, source)
   353         for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'),
   358         for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'),
   354                                 reorder=reorder):
   359                                 reorder=reorder):
   357 
   362 
   358         mfs.clear()
   363         mfs.clear()
   359         needed = set(cl.rev(x) for x in clnodes)
   364         needed = set(cl.rev(x) for x in clnodes)
   360 
   365 
   361         def linknodes(filerevlog, fname):
   366         def linknodes(filerevlog, fname):
   362             if fastpathlinkrev:
   367             if fastpathlinkrev and not reorder:
   363                 llr = filerevlog.linkrev
   368                 llr = filerevlog.linkrev
   364                 def genfilenodes():
   369                 def genfilenodes():
   365                     for r in filerevlog:
   370                     for r in filerevlog:
   366                         linkrev = llr(r)
   371                         linkrev = llr(r)
   367                         if linkrev in needed:
   372                         if linkrev in needed: