Mercurial > public > mercurial-scm > hg-stable
diff mercurial/subrepo.py @ 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 |
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: