mercurial/changegroup.py
changeset 19289 6ea1f858efd9
parent 19208 0b564cf359a7
child 19293 446ab88d3f1c
equal deleted inserted replaced
19288:ec367f203cb5 19289:6ea1f858efd9
   294             for c in self.revchunk(revlog, curr, prev, linknode):
   294             for c in self.revchunk(revlog, curr, prev, linknode):
   295                 yield c
   295                 yield c
   296 
   296 
   297         yield self.close()
   297         yield self.close()
   298 
   298 
       
   299     # filter any nodes that claim to be part of the known set
       
   300     def prune(self, revlog, missing, commonrevs, source):
       
   301         rr, rl = revlog.rev, revlog.linkrev
       
   302         return [n for n in missing if rl(rr(n)) not in commonrevs]
       
   303 
   299     def generate(self, commonrevs, clnodes, fastpathlinkrev, source):
   304     def generate(self, commonrevs, clnodes, fastpathlinkrev, source):
   300         '''yield a sequence of changegroup chunks (strings)'''
   305         '''yield a sequence of changegroup chunks (strings)'''
   301         repo = self._repo
   306         repo = self._repo
   302         cl = self._changelog
   307         cl = self._changelog
   303         mf = self._manifest
   308         mf = self._manifest
   308         msgbundling = _('bundling')
   313         msgbundling = _('bundling')
   309 
   314 
   310         mfs = {} # needed manifests
   315         mfs = {} # needed manifests
   311         fnodes = {} # needed file nodes
   316         fnodes = {} # needed file nodes
   312         changedfiles = set()
   317         changedfiles = set()
   313 
       
   314         # filter any nodes that claim to be part of the known set
       
   315         def prune(revlog, missing):
       
   316             rr, rl = revlog.rev, revlog.linkrev
       
   317             return [n for n in missing if rl(rr(n)) not in commonrevs]
       
   318 
   318 
   319         # Callback for the changelog, used to collect changed files and manifest
   319         # Callback for the changelog, used to collect changed files and manifest
   320         # nodes.
   320         # nodes.
   321         # Returns the linkrev node (identity in the changelog case).
   321         # Returns the linkrev node (identity in the changelog case).
   322         def lookupcl(x):
   322         def lookupcl(x):
   345             yield chunk
   345             yield chunk
   346         progress(msgbundling, None)
   346         progress(msgbundling, None)
   347 
   347 
   348         for f in changedfiles:
   348         for f in changedfiles:
   349             fnodes[f] = {}
   349             fnodes[f] = {}
   350         mfnodes = prune(mf, mfs)
   350         mfnodes = self.prune(mf, mfs, commonrevs, source)
   351         for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'),
   351         for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'),
   352                                 reorder=reorder):
   352                                 reorder=reorder):
   353             yield chunk
   353             yield chunk
   354         progress(msgbundling, None)
   354         progress(msgbundling, None)
   355 
   355 
   375             # Lookup for filenodes, we collected the linkrev nodes above in the
   375             # Lookup for filenodes, we collected the linkrev nodes above in the
   376             # fastpath case and with lookupmf in the slowpath case.
   376             # fastpath case and with lookupmf in the slowpath case.
   377             def lookupfilelog(x):
   377             def lookupfilelog(x):
   378                 return linkrevnodes[x]
   378                 return linkrevnodes[x]
   379 
   379 
   380             filenodes = prune(filerevlog, linkrevnodes)
   380             filenodes = self.prune(filerevlog, linkrevnodes, commonrevs, source)
   381             if filenodes:
   381             if filenodes:
   382                 progress(msgbundling, i + 1, item=fname, unit=msgfiles,
   382                 progress(msgbundling, i + 1, item=fname, unit=msgfiles,
   383                          total=total)
   383                          total=total)
   384                 yield self.fileheader(fname)
   384                 yield self.fileheader(fname)
   385                 for chunk in self.group(filenodes, filerevlog, lookupfilelog,
   385                 for chunk in self.group(filenodes, filerevlog, lookupfilelog,