diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -314,8 +314,12 @@ def _abssource(repo, push=False, abort=T if abort: raise util.Abort(_("default path for subrepository not found")) -def _sanitize(ui, path): +def _sanitize(ui, path, ignore): for dirname, dirs, names in os.walk(path): + for i, d in enumerate(dirs): + if d.lower() == ignore: + del dirs[i] + break if os.path.basename(dirname).lower() != '.hg': continue for f in names: @@ -1050,7 +1054,7 @@ class svnsubrepo(abstractsubrepo): # 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._ctx._repo.wjoin(self._path)) + _sanitize(self._ui, self._ctx._repo.wjoin(self._path), '.svn') 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 +1347,7 @@ class gitsubrepo(abstractsubrepo): self._gitcommand(['reset', 'HEAD']) cmd.append('-f') self._gitcommand(cmd + args) - _sanitize(self._ui, self._abspath) + _sanitize(self._ui, self._abspath, '.git') def rawcheckout(): # no branch to checkout, check it out with no branch @@ -1392,7 +1396,7 @@ class gitsubrepo(abstractsubrepo): if tracking[remote] != self._gitcurrentbranch(): checkout([tracking[remote]]) self._gitcommand(['merge', '--ff', remote]) - _sanitize(self._ui, self._abspath) + _sanitize(self._ui, self._abspath, '.git') else: # a real merge would be required, just checkout the revision rawcheckout() @@ -1428,7 +1432,7 @@ class gitsubrepo(abstractsubrepo): self.get(state) # fast forward merge elif base != self._state[1]: self._gitcommand(['merge', '--no-commit', revision]) - _sanitize(self._ui, self._abspath) + _sanitize(self._ui, self._abspath, '.git') if self.dirty(): if self._gitstate() != revision: diff --git a/tests/test-subrepo-git.t b/tests/test-subrepo-git.t --- a/tests/test-subrepo-git.t +++ b/tests/test-subrepo-git.t @@ -658,4 +658,13 @@ additional test for "git merge --ff" rou $ cat s/sub/.hg/hgrc cat: s/sub/.hg/hgrc: No such file or directory [1] + +Test that sanitizing is omitted in meta data area: + + $ mkdir s/.git/.hg + $ echo '.hg/hgrc in git metadata area' > s/.git/.hg/hgrc + $ hg update -q -C af6d2edbb0d3 + checking out detached HEAD in subrepo s + check out a git branch if you intend to make changes + $ cd .. diff --git a/tests/test-subrepo-svn.t b/tests/test-subrepo-svn.t --- a/tests/test-subrepo-svn.t +++ b/tests/test-subrepo-svn.t @@ -676,4 +676,10 @@ Test sanitizing ".hg/hgrc" in subrepo cat: s/sub/.hg/hgrc: No such file or directory [1] +Test that sanitizing is omitted in meta data area: + + $ mkdir s/.svn/.hg + $ echo '.hg/hgrc in svn metadata area' > s/.svn/.hg/hgrc + $ hg update -q -C '.^1' + $ cd ../..