dirstate: only call lstat once per flags invocation
This makes a big difference to performance in some cases.
hg --time locate 'set:symlink()'
mozilla-central (70,000 files):
before: 2.92 sec
after: 2.47
another repo (170,000 files):
before: 7.87 sec
after: 6.86
--- a/mercurial/dirstate.py Wed Apr 03 11:35:27 2013 -0700
+++ b/mercurial/dirstate.py Wed Apr 03 11:35:27 2013 -0700
@@ -154,11 +154,14 @@
def flagfunc(self, buildfallback):
if self._checklink and self._checkexec:
def f(x):
- p = self._join(x)
- if os.path.islink(p):
- return 'l'
- if util.isexec(p):
- return 'x'
+ try:
+ st = os.lstat(self._join(x))
+ if util.statislink(st):
+ return 'l'
+ if util.statisexec(st):
+ return 'x'
+ except OSError:
+ pass
return ''
return f