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.
This commit is contained in:
Siddharth Agarwal 2014-08-21 16:05:29 -07:00
parent 703f8d3ed8
commit 8f7105eac1
2 changed files with 33 additions and 7 deletions

View File

@ -11,7 +11,7 @@ from lock import release
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 @@ def clone(ui, peeropts, source, dest=None, pull=False, rev=None,
# 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

View File

@ -25,12 +25,25 @@ List files in store/data (should show a 'b.d'):
.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 @@ No update, with debug option:
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