diff mercurial/hg.py @ 17740:e6067bec18da

branchcache: fetch source branchcache during clone (issue3378) Recomputing branch cache on clone may be expensive, therefore if possible we fetch it along with the data. - If the clone is performed by copying, we just copy branchcache file. - If we localrepo.clone and streaming then we follow the procedure: 1. Fetch branchmap from the remote 2. Fetch the actual data. 3. Find the latest rev within branch heads (tip at the time of branchmap fetch) 4. Update the cache for the revs in [remotetip+1, tip] This way we ensure that the branchcache is correct even in case of races with commits.
author Tomasz Kleczek <tomasz.kleczek@fb.com>
date Wed, 03 Oct 2012 13:19:53 -0700
parents 3d1a781b23c0
children 92980a8dfdfe
line wrap: on
line diff
--- a/mercurial/hg.py	Wed Oct 10 01:30:45 2012 +0200
+++ b/mercurial/hg.py	Wed Oct 03 13:19:53 2012 -0700
@@ -336,6 +336,16 @@
 
             destlock = copystore(ui, srcrepo, destpath)
 
+            # Recomputing branch cache might be slow on big repos,
+            # so just copy it
+            dstcachedir = os.path.join(destpath, 'cache')
+            srcbranchcache = srcrepo.sjoin('cache/branchheads')
+            dstbranchcache = os.path.join(dstcachedir, 'branchheads')
+            if os.path.exists(srcbranchcache):
+                if not os.path.exists(dstcachedir):
+                    os.mkdir(dstcachedir)
+                util.copyfile(srcbranchcache, dstbranchcache)
+
             # we need to re-init the repo after manually copying the data
             # into it
             destpeer = peer(ui, peeropts, dest)