changeset 3534:549cb7b640fb

Simplify ignore logic in dirstate.walk - kill blockignore hack - pull pconvert out of imatch - skip imatch when not ignoring
author Matt Mackall <mpm@selenic.com>
date Fri, 27 Oct 2006 12:09:33 -0500
parents bb44489b901f
children 4d97184a06ad
files mercurial/dirstate.py
diffstat 1 files changed, 6 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dirstate.py	Fri Oct 27 11:30:20 2006 -0500
+++ b/mercurial/dirstate.py	Fri Oct 27 12:09:33 2006 -0500
@@ -25,7 +25,6 @@
         self.dirs = None
         self.copymap = {}
         self.ignorefunc = None
-        self.blockignore = False
 
     def wjoin(self, f):
         return os.path.join(self.root, f)
@@ -98,8 +97,6 @@
         '''default match function used by dirstate and
         localrepository.  this honours the repository .hgignore file
         and any other files specified in the [ui] section of .hgrc.'''
-        if self.blockignore:
-            return False
         if not self.ignorefunc:
             ignore = self.hgignore()
             allpats = []
@@ -379,11 +376,12 @@
             dc = self.filterfiles(files)
 
         def imatch(file_):
-            file_ = util.pconvert(file_)
-            if not ignored and file_ not in dc and self.ignore(file_):
+            if file_ not in dc and self.ignore(file_):
                 return False
             return match(file_)
 
+        if ignored: imatch = match
+
         # self.root may end with a path separator when self.root == '/'
         common_prefix_len = len(self.root)
         if not self.root.endswith('/'):
@@ -415,7 +413,7 @@
                     # don't trip over symlinks
                     st = os.lstat(p)
                     if stat.S_ISDIR(st.st_mode):
-                        ds = os.path.join(nd, f +'/')
+                        ds = util.pconvert(os.path.join(nd, f +'/'))
                         if imatch(ds):
                             work.append(p)
                         if imatch(np) and np in dc:
@@ -449,7 +447,7 @@
                         self.ui.warn('%s: %s\n' % (
                             util.pathto(self.getcwd(), ff),
                             inst.strerror))
-                    elif badmatch and badmatch(ff) and imatch(ff):
+                    elif badmatch and badmatch(ff) and imatch(nf):
                         yield 'b', ff, None
                 continue
             if stat.S_ISDIR(st.st_mode):
@@ -462,13 +460,11 @@
                 ff = util.normpath(ff)
                 if seen(ff):
                     continue
-                self.blockignore = True
-                if imatch(ff):
+                if match(ff):
                     if self.supported_type(ff, st, verbose=True):
                         yield 'f', ff, st
                     elif ff in dc:
                         yield 'm', ff, st
-                self.blockignore = False
 
         # step two run through anything left in the dc hash and yield
         # if we haven't already seen it