# HG changeset patch # User FUJIWARA Katsunori # Date 2014-03-25 10:34:17 # Node ID dda11e79952959a87298e5e094bf087c1837a0a3 # Parent c57c9cece64514e09a5f58b8803c01a6c420e286 hg: use "os.path.join()" to join path components which may be empty (issue4203) Changset 2d0ab571b822 rewriting "hg.copystore()" with vfs uses 'dstbase + "/lock"' instead of "os.path.join()", because target files given from "store.copyfiles()" already uses "/" as path separator But in the repository using revlog format 0, "dstbase" becomes empty ("data" directory is located under ".hg" directly), and 'dstbase + "/lock"' is treated as "/lock": in almost all cases, write access to "/lock" causes "permission denied". This patch uses "os.path.join()" to join path components which may be empty in "hg.copystore()". diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -213,8 +213,10 @@ def copystore(ui, srcrepo, destpath): dstvfs.mkdir(dstbase) if srcvfs.exists(f): if f.endswith('data'): + # 'dstbase' may be empty (e.g. revlog format 0) + lockfile = os.path.join(dstbase, "lock") # lock to avoid premature writing to the target - destlock = lock.lock(dstvfs, dstbase + "/lock") + destlock = lock.lock(dstvfs, lockfile) hardlink, n = util.copyfiles(srcvfs.join(f), dstvfs.join(f), hardlink) num += n diff --git a/tests/test-clone.t b/tests/test-clone.t --- a/tests/test-clone.t +++ b/tests/test-clone.t @@ -621,3 +621,17 @@ re-enable perm to allow deletion #endif $ cd .. + +Test clone from the repository in (emulated) revlog format 0 (issue4203): + + $ mkdir issue4203 + $ mkdir -p src/.hg + $ echo foo > src/foo + $ hg -R src add src/foo + $ hg -R src commit -m '#0' + $ hg -R src log -q + 0:e1bab28bca43 + $ hg clone -U -q src dst + $ hg -R dst log -q + 0:e1bab28bca43 + $ cd ..