walk: begin refactoring badmatch handling
authorMatt Mackall <mpm@selenic.com>
Mon, 12 May 2008 11:37:07 -0500
changeset 6578 f242d3684f83
parent 6577 569761919450
child 6579 0159b7a36184
walk: begin refactoring badmatch handling
mercurial/cmdutil.py
mercurial/commands.py
mercurial/dirstate.py
mercurial/localrepo.py
mercurial/match.py
--- a/mercurial/cmdutil.py	Mon May 12 11:37:07 2008 -0500
+++ b/mercurial/cmdutil.py	Mon May 12 11:37:07 2008 -0500
@@ -228,12 +228,18 @@
         pats = util.expand_glob(pats or [])
     m = match.match(repo.root, repo.getcwd(), pats, opts.get('include'),
                     opts.get('exclude'), default)
+    def badfn(f, msg):
+        repo.ui.warn("%s: %s\n" % (m.rel(f), msg))
+        return False
+    m.bad = badfn
     return m.files(), m, m.anypats()
 
 def walk(repo, pats=[], opts={}, node=None, badmatch=None, globbed=False,
          default='relpath'):
     dummy, m, dummy = matchpats(repo, pats, opts, globbed, default)
-    for src, fn in repo.walk(node, m, badmatch):
+    if badmatch:
+        m.bad = badmatch
+    for src, fn in repo.walk(node, m):
         yield src, fn, m.rel(fn), m.exact(fn)
 
 def findrenames(repo, added=None, removed=None, threshold=0.5):
--- a/mercurial/commands.py	Mon May 12 11:37:07 2008 -0500
+++ b/mercurial/commands.py	Mon May 12 11:37:07 2008 -0500
@@ -32,7 +32,7 @@
     exacts = {}
     names = []
     for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
-                                             badmatch=util.always):
+                                             badmatch=lambda x,y: True):
         if exact:
             if ui.verbose:
                 ui.status(_('adding %s\n') % rel)
@@ -1696,7 +1696,7 @@
 
     ret = 1
     for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node,
-                                             badmatch=util.always,
+                                             badmatch=lambda x,y: True,
                                              default='relglob'):
         if src == 'b':
             continue
--- a/mercurial/dirstate.py	Mon May 12 11:37:07 2008 -0500
+++ b/mercurial/dirstate.py	Mon May 12 11:37:07 2008 -0500
@@ -416,14 +416,13 @@
                 return True
         return False
 
-    def walk(self, match, badmatch):
+    def walk(self, match):
         # filter out the stat
-        for src, f, st in self.statwalk(match.files(), match,
-                                        badmatch=badmatch):
+        for src, f, st in self.statwalk(match.files(), match, badfn=match.bad):
             yield src, f
 
     def statwalk(self, files, match, unknown=True,
-                 ignored=False, badmatch=None, directories=False):
+                 ignored=False, badfn=None, directories=False):
         '''
         walk recursively through the directory tree, finding all files
         matched by the match function
@@ -433,11 +432,16 @@
         'f' the file was found in the directory tree
         'd' the file is a directory of the tree
         'm' the file was only in the dirstate and not in the tree
-        'b' file was not found and matched badmatch
+        'b' file was not found and did not match badfn
 
         and st is the stat result if the file was found in the directory.
         '''
 
+        def fwarn(f, msg):
+            self._ui.warn('%s: %s\n' % (self.pathto(ff), msg))
+            return False
+        badfn = badfn or fwarn
+
         # walk all files by default
         if not files:
             files = ['.']
@@ -536,10 +540,9 @@
                         found = True
                         break
                 if not found:
-                    if inst.errno != errno.ENOENT or not badmatch:
-                        self._ui.warn('%s: %s\n' %
-                                      (self.pathto(ff), inst.strerror))
-                    elif badmatch and badmatch(ff) and imatch(nf):
+                    if inst.errno != errno.ENOENT:
+                        fwarn(ff, inst.strerror)
+                    elif badfn(ff, inst.strerror) and imatch(nf):
                         yield 'b', ff, None
                 continue
             if s_isdir(st.st_mode):
--- a/mercurial/localrepo.py	Mon May 12 11:37:07 2008 -0500
+++ b/mercurial/localrepo.py	Mon May 12 11:37:07 2008 -0500
@@ -931,7 +931,7 @@
                 self.dirstate.invalidate()
             del tr, lock, wlock
 
-    def walk(self, node, match, badmatch):
+    def walk(self, node, match):
         '''
         walk recursively through the directory tree or a given
         changeset, finding all files matched by the match
@@ -963,14 +963,11 @@
             ffiles = fdict.keys()
             ffiles.sort()
             for fn in ffiles:
-                if badmatch and badmatch(fn):
-                    if match(fn):
-                        yield 'b', fn
-                else:
-                    self.ui.warn(_('%s: No such file in rev %s\n')
-                                 % (self.pathto(fn), short(node)))
+                if match.bad(fn, 'No such file in rev ' + short(node)) \
+                        and match(fn):
+                    yield 'b', fn
         else:
-            for src, fn in self.dirstate.walk(match, badmatch):
+            for src, fn in self.dirstate.walk(match):
                 yield src, fn
 
     def status(self, node1=None, node2=None, files=[], match=util.always,
--- a/mercurial/match.py	Mon May 12 11:37:07 2008 -0500
+++ b/mercurial/match.py	Mon May 12 11:37:07 2008 -0500
@@ -7,9 +7,8 @@
         self._cwd = cwd
         self._include = include
         self._exclude = exclude
-        f, mf, ap = util.matcher(self._root, self._cwd, self._patterns,
-                                 self._include, self._exclude, self.src(),
-                                 default)
+        f, mf, ap = util.matcher(root, cwd, patterns, include, exclude,
+                                 self.src(), default)
         self._files = f
         self._fmap = dict.fromkeys(f)
         self._matchfn = mf