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.
--- 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.
--- a/mercurial/streamclone.py Fri Oct 02 23:08:15 2015 -0700
+++ b/mercurial/streamclone.py Sat Oct 03 09:53:56 2015 -0700
@@ -253,31 +253,8 @@
repo._writerequirements()
if remotebranchmap:
- rbheads = []
- closed = []
- for bheads in remotebranchmap.itervalues():
- rbheads.extend(bheads)
- for h in bheads:
- r = repo.changelog.rev(h)
- b, c = repo.changelog.branchinfo(r)
- if c:
- closed.append(h)
+ branchmap.replacecache(repo, remotebranchmap)
- if rbheads:
- rtiprev = max((int(repo.changelog.rev(node))
- for node in rbheads))
- cache = branchmap.branchcache(remotebranchmap,
- 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
repo.invalidate()
finally:
lock.release()