changeset 18869:e8b4b139a545

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
author Bryan O'Sullivan <bryano@fb.com>
date Wed, 03 Apr 2013 11:35:27 -0700
parents cafa447a7d3b
children 0f2eb3d16a1a a2d4ab4f575d
files mercurial/dirstate.py
diffstat 1 files changed, 8 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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