On 19/01/2018 15:54, Yuya Nishihara wrote:
On Thu, 18 Jan 2018 16:38:45 +0100, Boris Feld wrote:
# HG changeset patch
# User Boris Feld <boris.f...@octobus.net>
# Date 1516282142 -3600
#      Thu Jan 18 14:29:02 2018 +0100
# Node ID 9c1ad82226a2e1fc7ca69550a46a7f7329c6b579
# Parent  4ad1a1054450063cc9aa19ab2037722c64877eb7
# EXP-Topic wire-rbc
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 
9c1ad82226a2
revbranchcache: add a bundle2 handler for a rbc part
diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -2101,6 +2101,40 @@ def handlehgtagsfnodes(op, inpart):
      cache.write()
      op.ui.debug('applied %i hgtags fnodes cache entries\n' % count)
+rbcstruct = struct.Struct('>III')
+
+@parthandler('cache:rev-branch-cache')
+def handlerbc(op, inpart):
+    """receive a rev-branch-cache payload and update the local cache
+
+    The payload is a series of data related to each branch
+
+    1) branch name length
+    2) number of open heads
+    3) number of closed heads
+    4) open heads nodes
+    5) closed heads nodes
+    """
+    total = 0
+    rawheader = inpart.read(rbcstruct.size)
+    cache = op.repo.revbranchcache()
+    cl = op.repo.unfiltered().changelog
+    while rawheader:
+        header = rbcstruct.unpack(rawheader)
+        total += header[1] + header[2]
+        branch = inpart.read(header[0])
We'll probably need to convert branch name between utf-8 and local encoding.

We are not sure to understand why. The rev branch cache uses an internal encoding, so local encoding shouldn't matter in our analysis.

https://www.mercurial-scm.org/repo/hg/file/tip/mercurial/branchmap.py#l336


+        for x in xrange(header[1]):
+            node = inpart.read(20)
+            rev = cl.rev(node)
+            cache.setdata(branch, rev, node, False)
+        for x in xrange(header[2]):
+            node = inpart.read(20)
+            rev = cl.rev(node)
+            cache.setdata(branch, rev, node, True)
+        rawheader = inpart.read(rbcstruct.size)
+    if total and 'branchinfo' in vars(cache):
+        del cache.branchinfo
No idea why we have to undo 'self.branchinfo = self._branchinfo'. Can you
add a comment?


If branchmap caught an error when trying to read the branchmap file and it's read-only (the default), it set the branchinfo attribute (with `self.branchinfo = self._branchinfo`) in order to bypass the caching logic defined in the `branchinfo` method.

If we add some information in the cache, we need to undo this bypass by removing the instance attribute, so branchinfo will point back to the original branchinfo method and cache will be used.

We will add a comment in the V2 version of this series.
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to