match: refactor matchfn generation
authorMatt Mackall <mpm@selenic.com>
Sun, 24 May 2009 02:56:14 -0500
changeset 8571 9f12e1a27a1b
parent 8570 7fe2012b3bd0
child 8572 dd46948a07fa
match: refactor matchfn generation
mercurial/match.py
--- a/mercurial/match.py	Sun May 24 02:56:14 2009 -0500
+++ b/mercurial/match.py	Sun May 24 02:56:14 2009 -0500
@@ -148,7 +148,7 @@
 
     # a common case: no patterns at all
     if not names and not inc and not exc:
-        return [], util.always, False
+        return [], lambda f: True, False
 
     def contains_glob(name):
         for c in name:
@@ -233,20 +233,35 @@
 
     roots, pats, anypats = normalizepats(names, dflt_pat)
 
-    patmatch = matchfn(pats, '$') or util.always
-    incmatch = util.always
+    patmatch = matchfn(pats, '$')
     if inc:
         dummy, inckinds, dummy = normalizepats(inc, 'glob')
         incmatch = matchfn(inckinds, '(?:/|$)')
-    excmatch = util.never
     if exc:
         dummy, exckinds, dummy = normalizepats(exc, 'glob')
         excmatch = matchfn(exckinds, '(?:/|$)')
 
-    if not names and inc and not exc:
-        # common case: hgignore patterns
-        matcher = incmatch
+    if names:
+        if inc:
+            if exc:
+                m = lambda f: incmatch(f) and not excmatch(f) and patmatch(f)
+            else:
+                m = lambda f: incmatch(f) and patmatch(f)
+        else:
+            if exc:
+                m = lambda f: not excmatch(f) and patmatch(f)
+            else:
+                m = patmatch
     else:
-        matcher = lambda fn: incmatch(fn) and not excmatch(fn) and patmatch(fn)
+        if inc:
+            if exc:
+                m = lambda f: incmatch(f) and not excmatch(f)
+            else:
+                m = incmatch
+        else:
+            if exc:
+                m = lambda f: not excmatch(f)
+            else:
+                m = lambda f: True
 
-    return (roots, matcher, (inc or exc or anypats) and True)
+    return (roots, m, (inc or exc or anypats) and True)