dirstate.walk: fast path match-always case during traversal
This case is a common one -- e.g. `hg status`.
For a repository with 170,000 files, this speeds up perfstatus --unknown from
2.15 seconds to 2.09.
--- a/mercurial/dirstate.py Mon Mar 25 14:22:34 2013 -0700
+++ b/mercurial/dirstate.py Fri Mar 22 17:03:00 2013 -0700
@@ -580,6 +580,7 @@
dirignore = util.always
matchfn = match.matchfn
+ matchalways = match.always()
badfn = match.bad
dmap = self._map
normpath = util.normpath
@@ -687,15 +688,15 @@
if not ignore(nf):
match.dir(nf)
wadd(nf)
- if nf in dmap and matchfn(nf):
+ if nf in dmap and (matchalways or matchfn(nf)):
results[nf] = None
elif kind == regkind or kind == lnkkind:
if nf in dmap:
- if matchfn(nf):
+ if matchalways or matchfn(nf):
results[nf] = st
- elif matchfn(nf) and not ignore(nf):
+ elif (matchalways or matchfn(nf)) and not ignore(nf):
results[nf] = st
- elif nf in dmap and matchfn(nf):
+ elif nf in dmap and (matchalways or matchfn(nf)):
results[nf] = None
for s in subrepos: