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') + +@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'''