dirstate: improve performance for building _dirs
authorMatt Mackall <mpm@selenic.com>
Fri, 12 Sep 2008 19:57:07 -0500
changeset 7032 7dfac37cfabf
parent 7031 19e8d034932e
child 7033 892d27fb04a5
dirstate: improve performance for building _dirs
mercurial/dirstate.py
--- a/mercurial/dirstate.py	Fri Sep 12 15:11:02 2008 -0500
+++ b/mercurial/dirstate.py	Fri Sep 12 19:57:07 2008 -0500
@@ -16,12 +16,10 @@
 _format = ">cllll"
 
 def _finddirs(path):
-    pos = len(path)
-    while 1:
+    pos = path.rfind('/')
+    while pos != -1:
+        yield path[:pos]
         pos = path.rfind('/', 0, pos)
-        if pos == -1:
-            break
-        yield path[:pos]
 
 class dirstate(object):
 
@@ -65,10 +63,16 @@
             return self._pl
         elif name == '_dirs':
             dirs = {}
-            for f,s in self._map.items():
+            for f,s in self._map.iteritems():
                 if s[0] != 'r':
-                    for base in _finddirs(f):
-                        dirs[base] = dirs.get(base, 0) + 1
+                    pos = f.rfind('/')
+                    while pos != -1:
+                        f = f[:pos]
+                        if f in dirs:
+                            dirs[f] += 1
+                            break
+                        dirs[f] = 1
+                        pos = f.rfind('/')
             self._dirs = dirs
             return self._dirs
         elif name == '_ignore':
@@ -242,8 +246,8 @@
             for base in _finddirs(f):
                 if dirs[base] == 1:
                     del dirs[base]
-                else:
-                    dirs[base] -= 1
+                    return
+                dirs[base] -= 1
 
     def _addpath(self, f, check=False):
         oldstate = self[f]