D4191: changegroup: define linknodes callbacks in generatefiles()

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Thu Aug 9 16:27:30 EDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rHGb83e9c503f2f: changegroup: define linknodes callbacks in generatefiles() (authored by indygreg, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D4191?vs=10158&id=10180

REVISION DETAIL
  https://phab.mercurial-scm.org/D4191

AFFECTED FILES
  mercurial/changegroup.py

CHANGE DETAILS

diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -819,19 +819,9 @@
         mfs.clear()
         clrevs = set(cl.rev(x) for x in clnodes)
 
-        if not fastpathlinkrev:
-            def linknodes(unused, fname):
-                return fnodes.get(fname, {})
-        else:
-            cln = cl.node
-            def linknodes(filerevlog, fname):
-                llr = filerevlog.linkrev
-                fln = filerevlog.node
-                revs = ((r, llr(r)) for r in filerevlog)
-                return dict((fln(r), cln(lr)) for r, lr in revs if lr in clrevs)
-
-        for chunk in self.generatefiles(changedfiles, linknodes, commonrevs,
-                                        source, mfdicts):
+        for chunk in self.generatefiles(changedfiles, commonrevs,
+                                        source, mfdicts, fastpathlinkrev,
+                                        fnodes, clrevs):
             yield chunk
 
         yield self._close()
@@ -986,16 +976,28 @@
         yield self._manifestsend
 
     # The 'source' parameter is useful for extensions
-    def generatefiles(self, changedfiles, linknodes, commonrevs, source,
-                      mfdicts):
+    def generatefiles(self, changedfiles, commonrevs, source,
+                      mfdicts, fastpathlinkrev, fnodes, clrevs):
         changedfiles = list(filter(self._filematcher, changedfiles))
 
+        if not fastpathlinkrev:
+            def normallinknodes(unused, fname):
+                return fnodes.get(fname, {})
+        else:
+            cln = self._repo.changelog.node
+
+            def normallinknodes(store, fname):
+                flinkrev = store.linkrev
+                fnode = store.node
+                revs = ((r, flinkrev(r)) for r in store)
+                return dict((fnode(r), cln(lr))
+                            for r, lr in revs if lr in clrevs)
+
         if self._isshallow:
             # In a shallow clone, the linknodes callback needs to also include
             # those file nodes that are in the manifests we sent but weren't
             # introduced by those manifests.
             commonctxs = [self._repo[c] for c in commonrevs]
-            oldlinknodes = linknodes
             clrev = self._repo.changelog.rev
 
             # Defining this function has a side-effect of overriding the
@@ -1008,15 +1010,17 @@
                         self._clrevtolocalrev[c.rev()] = flog.rev(fnode)
                     except error.ManifestLookupError:
                         pass
-                links = oldlinknodes(flog, fname)
+                links = normallinknodes(flog, fname)
                 if len(links) != len(mfdicts):
                     for mf, lr in mfdicts:
                         fnode = mf.get(fname, None)
                         if fnode in links:
                             links[fnode] = min(links[fnode], lr, key=clrev)
                         elif fnode:
                             links[fnode] = lr
                 return links
+        else:
+            linknodes = normallinknodes
 
         return self._generatefiles(changedfiles, linknodes, commonrevs, source)
 



To: indygreg, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list