# HG changeset patch # User Boris Feld # Date 1519230904 -3600 # Node ID 9988fc10f49ed93beb33deffc045d71ca9b8a7db # Parent 95f4f1bfb6500c09b2ea62d8f03463510653eec9 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 -r 95f4f1bfb650 -r 9988fc10f49e mercurial/bundle2.py --- a/mercurial/bundle2.py Thu Jan 18 14:21:05 2018 +0100 +++ b/mercurial/bundle2.py Wed Feb 21 17:35:04 2018 +0100 @@ -158,6 +158,7 @@ from . import ( bookmarks, changegroup, + encoding, error, node as nodemod, obsolete, @@ -2129,6 +2130,40 @@ 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] + 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'''