Mercurial > hg
changeset 21567:5900bc09e684 stable
subrepo: avoid sanitizing ".hg/hgrc" in meta data area for non-hg subrepos
Before this patch, sanitizing ".hg/hgrc" scans directories and files
also in meta data area for non-hg subrepos: under ".svn" for
Subversion subrepo, for example.
This may cause not only performance impact (especially in large scale
subrepos) but also unexpected removing meta data files.
This patch avoids sanitizing ".hg/hgrc" in meta data area for non-hg
subrepos.
This patch stops checking "ignore" target at the first
(case-insensitive) appearance of it, because continuation of scanning
is meaningless in almost all cases.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Thu, 08 May 2014 19:03:00 +0900 |
parents | a01988cd9b61 |
children | 8dd17b19e722 |
files | mercurial/subrepo.py tests/test-subrepo-git.t tests/test-subrepo-svn.t |
diffstat | 3 files changed, 24 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/subrepo.py Thu May 08 19:03:00 2014 +0900 +++ b/mercurial/subrepo.py Thu May 08 19:03:00 2014 +0900 @@ -314,8 +314,12 @@ 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 @@ # 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 @@ 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 @@ 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 @@ 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:
--- 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 @@ -658,4 +658,13 @@ $ 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 ..
--- 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 @@ -676,4 +676,10 @@ 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 ../..