[PATCH 2 of 2] dirstate: skip step 3 in walk if nothing new will match

Simon Heimberg simohe at besonet.ch
Wed May 20 03:43:21 CDT 2009


# HG changeset patch
# User Simon Heimberg <simohe at besonet.ch>
# Date 1242323666 -7200
# Node ID 4af9cb4de3309119a2d1bf9efd91e4e6eb6829c1
# Parent  160826618f873c2f7ddd0522b771e1ca7f5c4824
dirstate: skip step 3 in walk if nothing new will match

nothing will ever match on match.never
nothing new will match on match.exact (all found in step 1)
nothing new will match on match.match when
  there is no pattern and
  there is no direcory in pats

diff -r 160826618f87 -r 4af9cb4de330 mercurial/dirstate.py
--- a/mercurial/dirstate.py	Don Mai 14 10:50:45 2009 +0200
+++ b/mercurial/dirstate.py	Don Mai 14 19:54:26 2009 +0200
@@ -461,6 +461,23 @@
         work = []
         wadd = work.append
 
+        if match.anypats():
+            #match.match with patterns
+            dostep3 = True
+            nomatches = False
+        elif not match.files():
+            #match.always or match.never
+            dostep3 = matchfn('')
+            nomatches = not dostep3
+        else:
+            #match.exact or match.match without pattern
+            dostep3 = False
+            nomatches = matchfn == match.exact
+
+        if nomatches:
+            #skip step 2
+            dirignore = util.always
+
         files = set(match.files())
         if not files or '.' in files:
             files = ['']
@@ -476,6 +493,7 @@
                 st = lstat(join(nf))
                 kind = getkind(st.st_mode)
                 if kind == dirkind:
+                    dostep3 = True
                     if nf in dmap:
                         #file deleted on disc but still in dirstate
                         results[nf] = None
@@ -497,6 +515,7 @@
                         keep = True
                         break
                     elif fn.startswith(prefix):
+                        dostep3 = True
                         keep = True
                         break
                 if not keep:
@@ -541,11 +560,12 @@
                         results[nf] = None
 
         # step 3: report unseen items in the dmap hash
-        visit = sorted([f for f in dmap if f not in results and matchfn(f)])
-        for nf, st in zip(visit, util.statfiles([join(i) for i in visit])):
-            if not st is None and not getkind(st.st_mode) in (regkind, lnkkind):
-                st = None
-            results[nf] = st
+        if dostep3 and not nomatches:
+            visit = sorted([f for f in dmap if f not in results and matchfn(f)])
+            for nf, st in zip(visit, util.statfiles([join(i) for i in visit])):
+                if not st is None and not getkind(st.st_mode) in (regkind, lnkkind):
+                    st = None
+                results[nf] = st
 
         del results['.hg']
         return results


More information about the Mercurial-devel mailing list