Mercurial > hg
changeset 36963:9988fc10f49e
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.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Wed, 21 Feb 2018 17:35:04 +0100 |
parents | 95f4f1bfb650 |
children | 79b73be4dda5 |
files | mercurial/bundle2.py |
diffstat | 1 files changed, 35 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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'''