[PATCH 2 of 7 V4] revbranchcache: add a bundle2 handler for a rbc part
Boris Feld
boris.feld at octobus.net
Fri Mar 16 11:29:34 UTC 2018
# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1519230904 -3600
# Wed Feb 21 17:35:04 2018 +0100
# Node ID 1eb0f8075f0d33fe0aebf7243eaf50db2b33496d
# Parent 695dfd0f5d9849a7f0b81e623dbdb1befdca63c9
# EXP-Topic wire-rbc
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 1eb0f8075f0d
revbranchcache: add a bundle2 handler for a rbc part
We add the necessary bit to process a part containing rev-branch-cache
information. The local rev branch cache is then updated with the received
information.
Computing branch cache can become a significant part of the time spent pulling.
diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -158,6 +158,7 @@ from .i18n import _
from . import (
bookmarks,
changegroup,
+ encoding,
error,
node as nodemod,
obsolete,
@@ -2129,6 +2130,40 @@ def handlehgtagsfnodes(op, inpart):
cache.write()
op.ui.debug('applied %i hgtags fnodes cache entries\n' % count)
+rbcstruct = struct.Struct('>III')
+
+ at 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]
+ utf8branch = inpart.read(header[0])
+ branch = encoding.tolocal(utf8branch)
+ 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)
+ cache.write()
+
@parthandler('pushvars')
def bundle2getvars(op, part):
'''unbundle a bundle2 containing shellvars on the server'''
More information about the Mercurial-devel
mailing list