mercurial/branchmap.py
changeset 41797 68bbcc70e274
parent 41759 aaad36b88298
child 41808 8ad46ac6728e
--- a/mercurial/branchmap.py	Wed Feb 20 15:02:59 2019 -0500
+++ b/mercurial/branchmap.py	Mon Feb 25 16:49:01 2019 +0300
@@ -179,23 +179,7 @@
             if not bcache.validfor(repo):
                 # invalidate the cache
                 raise ValueError(r'tip differs')
-            cl = repo.changelog
-            for line in lineiter:
-                line = line.rstrip('\n')
-                if not line:
-                    continue
-                node, state, label = line.split(" ", 2)
-                if state not in 'oc':
-                    raise ValueError(r'invalid branch state')
-                label = encoding.tolocal(label.strip())
-                node = bin(node)
-                if not cl.hasnode(node):
-                    raise ValueError(
-                        r'node %s does not exist' % pycompat.sysstr(hex(node)))
-                bcache.setdefault(label, []).append(node)
-                if state == 'c':
-                    bcache._closednodes.add(node)
-
+            bcache.load(repo, f)
         except (IOError, OSError):
             return None
 
@@ -214,6 +198,26 @@
 
         return bcache
 
+    def load(self, repo, f):
+        """ fully loads the branchcache by reading from the file f """
+        cl = repo.changelog
+        lineiter = iter(f)
+        for line in lineiter:
+            line = line.rstrip('\n')
+            if not line:
+                continue
+            node, state, label = line.split(" ", 2)
+            if state not in 'oc':
+                raise ValueError(r'invalid branch state')
+            label = encoding.tolocal(label.strip())
+            node = bin(node)
+            if not cl.hasnode(node):
+                raise ValueError(
+                    r'node %s does not exist' % pycompat.sysstr(hex(node)))
+            self.setdefault(label, []).append(node)
+            if state == 'c':
+                self._closednodes.add(node)
+
     @staticmethod
     def _filename(repo):
         """name of a branchcache file for a given repo or repoview"""