share: properly copy cache files when cloning from a share
If a is shared to b and b cloned to c, the old code would look directly
under b/.hg for the cache directory and not use the cachevfs layer to
pick the members from a/.hg/cache. Adjust variable names and comments to
reflect that the function is used for more than just the branchmap
cache.
Differential Revision: https://phab.mercurial-scm.org/D9598
--- a/mercurial/hg.py Mon Dec 14 18:19:58 2020 +0100
+++ b/mercurial/hg.py Mon Dec 14 19:48:35 2020 +0100
@@ -594,16 +594,15 @@
return srcpeer, peer(ui, peeropts, dest)
-# Recomputing branch cache might be slow on big repos,
-# so just copy it
+# Recomputing caches is often slow on big repos, so copy them.
def _copycache(srcrepo, dstcachedir, fname):
"""copy a cache from srcrepo to destcachedir (if it exists)"""
- srcbranchcache = srcrepo.vfs.join(b'cache/%s' % fname)
- dstbranchcache = os.path.join(dstcachedir, fname)
- if os.path.exists(srcbranchcache):
+ srcfname = srcrepo.cachevfs.join(fname)
+ dstfname = os.path.join(dstcachedir, fname)
+ if os.path.exists(srcfname):
if not os.path.exists(dstcachedir):
os.mkdir(dstcachedir)
- util.copyfile(srcbranchcache, dstbranchcache)
+ util.copyfile(srcfname, dstfname)
def clone(
--- a/tests/test-share.t Mon Dec 14 18:19:58 2020 +0100
+++ b/tests/test-share.t Mon Dec 14 19:48:35 2020 +0100
@@ -56,6 +56,17 @@
rbc-revs-v1
tags2-visible
+Cloning a shared repo should pick up the full cache dir on the other hand.
+
+ $ hg clone . ../repo2-clone
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ ls -1 ../repo2-clone/.hg/cache
+ branch2-served
+ rbc-names-v1
+ rbc-revs-v1
+ tags2-visible
+
Some sed versions appends newline, some don't, and some just fails
$ cat .hg/sharedpath; echo