subrepo: avoid sanitizing ".hg/hgrc" in meta data area for non-hg subrepos stable
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Thu, 08 May 2014 19:03:00 +0900
branchstable
changeset 21567 5900bc09e684
parent 21566 a01988cd9b61
child 21568 8dd17b19e722
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.
mercurial/subrepo.py
tests/test-subrepo-git.t
tests/test-subrepo-svn.t
--- 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 ../..