clone: for local clones, copy over filtered branchcaches as well (
issue4286)
Local clones copy/hardlink over files directly, so the branchcaches should all
be valid. There's a slight chance that a read operation would update one of the
branchcaches, but we hold a lock over the source repo so they shouldn't cause
an invalid branchcache to be copied over, just a different, valid one.
--- a/mercurial/hg.py Thu Aug 21 15:58:32 2014 -0700
+++ b/mercurial/hg.py Thu Aug 21 16:05:29 2014 -0700
@@ -11,7 +11,7 @@
from node import hex, nullid
import localrepo, bundlerepo, unionrepo, httppeer, sshpeer, statichttprepo
import bookmarks, lock, util, extensions, error, node, scmutil, phases, url
-import cmdutil, discovery
+import cmdutil, discovery, repoview
import merge as mergemod
import verify as verifymod
import errno, os, shutil
@@ -366,13 +366,20 @@
# Recomputing branch cache might be slow on big repos,
# so just copy it
+ def copybranchcache(fname):
+ srcbranchcache = srcrepo.join('cache/%s' % fname)
+ dstbranchcache = os.path.join(dstcachedir, fname)
+ if os.path.exists(srcbranchcache):
+ if not os.path.exists(dstcachedir):
+ os.mkdir(dstcachedir)
+ util.copyfile(srcbranchcache, dstbranchcache)
+
dstcachedir = os.path.join(destpath, 'cache')
- srcbranchcache = srcrepo.join('cache/branch2')
- dstbranchcache = os.path.join(dstcachedir, 'branch2')
- if os.path.exists(srcbranchcache):
- if not os.path.exists(dstcachedir):
- os.mkdir(dstcachedir)
- util.copyfile(srcbranchcache, dstbranchcache)
+ # In local clones we're copying all nodes, not just served
+ # ones. Therefore copy all branchcaches over.
+ copybranchcache('branch2')
+ for cachename in repoview.filtertable:
+ copybranchcache('branch2-%s' % cachename)
# we need to re-init the repo after manually copying the data
# into it
--- a/tests/test-clone.t Thu Aug 21 15:58:32 2014 -0700
+++ b/tests/test-clone.t Thu Aug 21 16:05:29 2014 -0700
@@ -25,12 +25,25 @@
.hg/store/data/b.d
.hg/store/data/b.i
+Trigger branchcache creation:
+
+ $ hg branches
+ default 10:a7949464abda
+ $ ls .hg/cache
+ branch2-served
+
Default operation:
$ hg clone . ../b
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd ../b
+
+Ensure branchcache got copied over:
+
+ $ ls .hg/cache
+ branch2-served
+
$ cat a
a
$ hg verify
@@ -58,6 +71,12 @@
listing keys for "bookmarks"
#endif
$ cd ../c
+
+Ensure branchcache got copied over:
+
+ $ ls .hg/cache
+ branch2-served
+
$ cat a 2>/dev/null || echo "a not present"
a not present
$ hg verify