[PATCH 3 of 4] dirstate: skip step 3 in walk if nothing new will match
Simon Heimberg
simohe at besonet.ch
Tue May 19 02:26:55 CDT 2009
# HG changeset patch
# User Simon Heimberg <simohe at besonet.ch>
# Date 1242323666 -7200
# Node ID 19a134f738f5ac0720bc08fbe6507f4eb4769fd9
# Parent 4095d02302b74f9ce2c90fe283d84ad31ce2da83
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 4095d02302b7 -r 19a134f738f5 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
@@ -460,6 +460,11 @@
join = self._join
work = []
wadd = work.append
+ dostep3 = match.anypats() or match.__class__.__name__ == 'always'
+ nomatches = not dostep3 and match.__class__.__name__ in 'never exact'.split()
+ if nomatches:
+ #skip step 2
+ dirignore = util.always
files = set(match.files())
if not files or '.' in files:
@@ -476,6 +481,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 +503,7 @@
keep = True
break
elif fn.startswith(prefix):
+ dostep3 = True
keep = True
break
if not keep:
@@ -541,11 +548,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