[PATCH 3 of 5 modernize-streamclone] branchmap: move branch cache code out of streamclone.py

Gregory Szorc gregory.szorc at gmail.com
Sun Oct 4 13:39:40 CDT 2015


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1443891236 25200
#      Sat Oct 03 09:53:56 2015 -0700
# Node ID d01a373e1434f4e36d4f5f7560e620c9e97fd3dc
# Parent  5ac0d9d646e498321c709e9bcd9467cfe037b2c1
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.

diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py
--- a/mercurial/branchmap.py
+++ b/mercurial/branchmap.py
@@ -115,8 +115,40 @@ def updatecache(repo):
 
     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.
 
     This cache is used to avoid costly computations to determine all the
diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py
--- a/mercurial/streamclone.py
+++ b/mercurial/streamclone.py
@@ -252,32 +252,9 @@ def applyremotedata(repo, remotereqs, re
         repo._applyopenerreqs()
         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()


More information about the Mercurial-devel mailing list