subrepo: make "_sanitize()" take absolute path to the root of subrepo
Before this patch, "hg update" doesn't sanitize ".hg/hgrc" in non-hg
subrepos correctly, if "hg update" is executed not at the root of the
parent repository.
"_sanitize()" takes relative path to subrepo from the root of the
parent repository, and passes it to "os.walk()". In this case,
"os.walk()" expects CWD to be equal to the root of the parent
repository.
So, "os.walk()" can't find specified path (or may scan unexpected
path), if CWD isn't equal to the root of the parent repository.
Non-hg subrepo under nested hg-subrepos may cause same problem, too:
CWD may be equal to the root of the outer most repository, or so.
This patch makes "_sanitize()" take absolute path to the root of
subrepo to sanitize correctly in such cases.
This patch doesn't normalize the path to hostile files as the one
relative to CWD (or the root of the outer most repository), to fix the
problem in the simple way suitable for "stable".
Normalizing should be done in the future: maybe as a part of the
migration to vfs.
--- a/mercurial/subrepo.py Thu May 08 19:03:00 2014 +0900
+++ b/mercurial/subrepo.py Thu May 08 19:03:00 2014 +0900
@@ -1050,7 +1050,7 @@
# update to a directory which has since been deleted and recreated.
args.append('%s@%s' % (state[0], state[1]))
status, err = self._svncommand(args, failok=True)
- _sanitize(self._ui, self._path)
+ _sanitize(self._ui, self._ctx._repo.wjoin(self._path))
if not re.search('Checked out revision [0-9]+.', status):
if ('is already a working copy for a different URL' in err
and (self._wcchanged()[:2] == (False, False))):
@@ -1343,7 +1343,7 @@
self._gitcommand(['reset', 'HEAD'])
cmd.append('-f')
self._gitcommand(cmd + args)
- _sanitize(self._ui, self._path)
+ _sanitize(self._ui, self._abspath)
def rawcheckout():
# no branch to checkout, check it out with no branch
@@ -1392,7 +1392,7 @@
if tracking[remote] != self._gitcurrentbranch():
checkout([tracking[remote]])
self._gitcommand(['merge', '--ff', remote])
- _sanitize(self._ui, self._path)
+ _sanitize(self._ui, self._abspath)
else:
# a real merge would be required, just checkout the revision
rawcheckout()
@@ -1428,7 +1428,7 @@
self.get(state) # fast forward merge
elif base != self._state[1]:
self._gitcommand(['merge', '--no-commit', revision])
- _sanitize(self._ui, self._path)
+ _sanitize(self._ui, self._abspath)
if self.dirty():
if self._gitstate() != revision:
--- a/tests/test-subrepo-git.t Thu May 08 19:03:00 2014 +0900
+++ b/tests/test-subrepo-git.t Thu May 08 19:03:00 2014 +0900
@@ -592,11 +592,11 @@
c4069473b459cf27fd4d7c2f50c4346b4e936599 s
$ cd ..
+ $ hg -R tc pull -q
+ $ hg -R tc update -q -C 3473d20bddcf 2>&1 | sort
+ warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/.hg' (glob)
+ warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/sub/.hg' (glob)
$ cd tc
- $ hg pull -q
- $ hg update -q -C 3473d20bddcf 2>&1 | sort
- warning: removing potentially hostile 'hgrc' in 's/.hg' (glob)
- warning: removing potentially hostile 'hgrc' in 's/sub/.hg' (glob)
$ hg parents -q
8:3473d20bddcf
$ grep ' s$' .hgsubstate
@@ -642,10 +642,12 @@
$ cat s/sub/.hg/hgrc
cat: s/sub/.hg/hgrc: No such file or directory
[1]
- $ hg pull -q
- $ hg update -q -C ed23f7fe024e 2>&1 | sort
- warning: removing potentially hostile 'hgrc' in 's/.hg' (glob)
- warning: removing potentially hostile 'hgrc' in 's/sub/.hg' (glob)
+ $ cd ..
+ $ hg -R tc pull -q
+ $ hg -R tc update -q -C ed23f7fe024e 2>&1 | sort
+ warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/.hg' (glob)
+ warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/sub/.hg' (glob)
+ $ cd tc
$ hg parents -q
9:ed23f7fe024e
$ grep ' s$' .hgsubstate
--- a/tests/test-subrepo-svn.t Thu May 08 19:03:00 2014 +0900
+++ b/tests/test-subrepo-svn.t Thu May 08 19:03:00 2014 +0900
@@ -663,10 +663,10 @@
16 s
$ cd ..
+ $ hg -R tc pull -u -q 2>&1 | sort
+ warning: removing potentially hostile 'hgrc' in '$TESTTMP/sub/tc/s/.hg' (glob)
+ warning: removing potentially hostile 'hgrc' in '$TESTTMP/sub/tc/s/sub/.hg' (glob)
$ cd tc
- $ hg pull -u -q 2>&1 | sort
- warning: removing potentially hostile 'hgrc' in 's/.hg' (glob)
- warning: removing potentially hostile 'hgrc' in 's/sub/.hg' (glob)
$ grep ' s$' .hgsubstate
16 s
$ cat s/.hg/hgrc