Patchwork D6023: branchcache: move loading of branch names and nodes into it's own function

login
register
mail settings
Submitter phabricator
Date Feb. 25, 2019, 3:07 p.m.
Message ID <differential-rev-PHID-DREV-4zr6ooraybfvygyyuy2f-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/38926/
State Superseded
Headers show

Comments

phabricator - Feb. 25, 2019, 3:07 p.m.
pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This will help me in implementing lazy loading of the branchcache in upcoming
  patches.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/branchmap.py

CHANGE DETAILS




To: pulkit, #hg-reviewers
Cc: mercurial-devel
phabricator - Feb. 25, 2019, 3:10 p.m.
pulkit added a comment.


  I am trying to make branchcache make lazy load and only validate nodes if required. This will speed up operations and loading of branchcache. Right now loading of branchcache validates all the nodes which is not required until the branch which has that node is accessed. I believe doing this will speed up things. However the current dict interface of branchcache object is making this hard, hence I have sent only this patch for now.

REPOSITORY
  rHG Mercurial

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

To: pulkit, #hg-reviewers
Cc: mercurial-devel
phabricator - Feb. 25, 2019, 6:20 p.m.
lothiraldan accepted this revision.
lothiraldan added a comment.


  LGTM, queued thanks

REPOSITORY
  rHG Mercurial

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

To: pulkit, #hg-reviewers, lothiraldan
Cc: lothiraldan, mercurial-devel

Patch

diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py
--- a/mercurial/branchmap.py
+++ b/mercurial/branchmap.py
@@ -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"""