mercurial/branchmap.py
changeset 40374 47c03042cd1d
parent 40312 5644f7c8982e
child 40375 76d4272bd57b
--- a/mercurial/branchmap.py	Thu Oct 18 16:36:10 2018 -0400
+++ b/mercurial/branchmap.py	Fri Oct 19 16:16:17 2018 +0200
@@ -278,7 +278,7 @@
         newbranches = {}
         getbranchinfo = repo.revbranchcache().branchinfo
         for r in revgen:
-            branch, closesbranch = getbranchinfo(r)
+            branch, closesbranch = getbranchinfo(r, changelog=cl)
             newbranches.setdefault(branch, []).append(r)
             if closesbranch:
                 self._closednodes.add(cl.node(r))
@@ -404,10 +404,10 @@
         self._rbcrevslen = len(self._repo.changelog)
         self._rbcrevs = bytearray(self._rbcrevslen * _rbcrecsize)
 
-    def branchinfo(self, rev):
+    def branchinfo(self, rev, changelog=None):
         """Return branch name and close flag for rev, using and updating
         persistent cache."""
-        changelog = self._repo.changelog
+        changelog = changelog or self._repo.changelog
         rbcrevidx = rev * _rbcrecsize
 
         # avoid negative index, changelog.read(nullrev) is fast without cache
@@ -416,7 +416,7 @@
 
         # if requested rev isn't allocated, grow and cache the rev info
         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
-            return self._branchinfo(rev)
+            return self._branchinfo(rev, changelog=changelog)
 
         # fast path: extract data from cache, use it if node is matching
         reponode = changelog.node(rev)[:_rbcnodelen]
@@ -444,11 +444,11 @@
             self._rbcrevslen = min(self._rbcrevslen, truncate)
 
         # fall back to slow path and make sure it will be written to disk
-        return self._branchinfo(rev)
+        return self._branchinfo(rev, changelog=changelog)
 
-    def _branchinfo(self, rev):
+    def _branchinfo(self, rev, changelog=None):
         """Retrieve branch info from changelog and update _rbcrevs"""
-        changelog = self._repo.changelog
+        changelog = changelog or self._repo.changelog
         b, close = changelog.branchinfo(rev)
         if b in self._namesreverse:
             branchidx = self._namesreverse[b]
@@ -459,7 +459,7 @@
         reponode = changelog.node(rev)
         if close:
             branchidx |= _rbccloseflag
-        self._setcachedata(rev, reponode, branchidx)
+        self._setcachedata(rev, reponode, branchidx, changelog)
         return b, close
 
     def setdata(self, branch, rev, node, close):
@@ -482,14 +482,16 @@
         if r'branchinfo' in vars(self):
             del self.branchinfo
 
-    def _setcachedata(self, rev, node, branchidx):
+    def _setcachedata(self, rev, node, branchidx, changelog=None):
         """Writes the node's branch data to the in-memory cache data."""
         if rev == nullrev:
             return
+
+        changelog = changelog or self._repo.changelog
         rbcrevidx = rev * _rbcrecsize
         if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
             self._rbcrevs.extend('\0' *
-                                 (len(self._repo.changelog) * _rbcrecsize -
+                                 (len(changelog) * _rbcrecsize -
                                   len(self._rbcrevs)))
         pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx)
         self._rbcrevslen = min(self._rbcrevslen, rev)