match: more accurately report when we're always going to match
authorBryan O'Sullivan <bryano@fb.com>
Thu, 21 Feb 2013 12:55:39 -0800
changeset 18713 8728579f6bdc
parent 18712 e3ddb4068757
child 18714 7790d69af6d6
match: more accurately report when we're always going to match This improves the performance of log --patch and --stat by about 20% for moderately large manifests (e.g. mozilla-central) for the common case of no -I/-X patterns.
mercurial/match.py
--- a/mercurial/match.py	Thu Feb 21 13:16:02 2013 -0600
+++ b/mercurial/match.py	Thu Feb 21 12:55:39 2013 -0800
@@ -62,6 +62,7 @@
         self._files = []
         self._anypats = bool(include or exclude)
         self._ctx = ctx
+        self._always = False
 
         if include:
             pats = _normalize(include, 'glob', root, cwd, auditor)
@@ -103,6 +104,7 @@
                     m = lambda f: not em(f)
                 else:
                     m = lambda f: True
+                    self._always = True
 
         self.matchfn = m
         self._fmap = set(self._files)
@@ -130,7 +132,7 @@
     def anypats(self):
         return self._anypats
     def always(self):
-        return False
+        return self._always
 
 class exact(match):
     def __init__(self, root, cwd, files):
@@ -139,8 +141,7 @@
 class always(match):
     def __init__(self, root, cwd):
         match.__init__(self, root, cwd, [])
-    def always(self):
-        return True
+        self._always = True
 
 class narrowmatcher(match):
     """Adapt a matcher to work on a subdirectory only.
@@ -175,6 +176,7 @@
         self._cwd = matcher._cwd
         self._path = path
         self._matcher = matcher
+        self._always = matcher._always
 
         self._files = [f[len(path) + 1:] for f in matcher._files
                        if f.startswith(path + "/")]