Comments
Patch
@@ -1879,6 +1879,44 @@ def _getbundletagsfnodes(bundler, repo,
outgoing = _computeoutgoing(repo, heads, common)
bundle2.addparttagsfnodescache(repo, bundler, outgoing)
+@getbundle2partsgenerator('cache:rev-branch-cache')
+def _getbundlerevbranchcache(bundler, repo, source, bundlecaps=None,
+ b2caps=None, heads=None, common=None,
+ **kwargs):
+ """Transfer the rev-branch-cache mapping
+
+ 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
+ """
+ # Don't send unless:
+ # - changeset are being exchanged,
+ # - the client supports it.
+ if not (kwargs.get(r'cg', True)) or 'rev-branch-cache' not in b2caps:
+ return
+ cache = repo.revbranchcache()
+ cl = repo.unfiltered().changelog
+ outgoing = _computeoutgoing(repo, heads, common)
+ branchesdata = collections.defaultdict(lambda: (set(), set()))
+ for node in outgoing.missing:
+ branch, close = cache.branchinfo(cl.rev(node))
+ branchesdata[branch][close].add(node)
+
+ def generate():
+ for branch, (nodes, closed) in sorted(branchesdata.items()):
+ yield bundle2.rbcstruct.pack(len(branch), len(nodes), len(closed))
+ yield branch
+ for n in sorted(nodes):
+ yield n
+ for n in sorted(closed):
+ yield n
+
+ bundler.newpart('cache:rev-branch-cache', data=generate())
+
def check_heads(repo, their_heads, context):
"""check if the heads of a repo have been modified