Mercurial > public > mercurial-scm > hg-stable
diff mercurial/branchmap.py @ 26460:79ef867538ea
branchmap: move branch cache code out of streamclone.py
This is low-level branch map and cache manipulation code. It deserves to
live next to similar code in branchmap.py. Moving it also paves the road
for multiple consumers, such as a bundle2 part handler that receives
branch mappings from a remote.
This is largely a mechanical move, with only variable names and
indentation being changed.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 03 Oct 2015 09:53:56 -0700 |
parents | 47f36e050c2e |
children | 56b2bcea2529 |
line wrap: on
line diff
--- a/mercurial/branchmap.py Fri Oct 02 23:08:15 2015 -0700 +++ b/mercurial/branchmap.py Sat Oct 03 09:53:56 2015 -0700 @@ -116,6 +116,38 @@ assert partial.validfor(repo), filtername repo._branchcaches[repo.filtername] = partial +def replacecache(repo, bm): + """Replace the branchmap cache for a repo with a branch mapping. + + This is likely only called during clone with a branch map from a remote. + """ + rbheads = [] + closed = [] + for bheads in bm.itervalues(): + rbheads.extend(bheads) + for h in bheads: + r = repo.changelog.rev(h) + b, c = repo.changelog.branchinfo(r) + if c: + closed.append(h) + + if rbheads: + rtiprev = max((int(repo.changelog.rev(node)) + for node in rbheads)) + cache = branchcache(bm, + repo[rtiprev].node(), + rtiprev, + closednodes=closed) + + # Try to stick it as low as possible + # filter above served are unlikely to be fetch from a clone + for candidate in ('base', 'immutable', 'served'): + rview = repo.filtered(candidate) + if cache.validfor(rview): + repo._branchcaches[candidate] = cache + cache.write(rview) + break + class branchcache(dict): """A dict like object that hold branches heads cache.