From 7ce9a41a1257b32da4a764126cb6aaa535eb19a4 Mon Sep 17 00:00:00 2001 From: Matt Mackall Date: Fri, 12 Sep 2008 19:57:07 -0500 Subject: [PATCH] dirstate: improve performance for building _dirs --- mercurial/dirstate.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py index bf98eeb83d..08d48ee926 100644 --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -16,12 +16,10 @@ _unknown = ('?', 0, 0, 0) _format = ">cllll" def _finddirs(path): - pos = len(path) - while 1: - pos = path.rfind('/', 0, pos) - if pos == -1: - break + pos = path.rfind('/') + while pos != -1: yield path[:pos] + pos = path.rfind('/', 0, pos) class dirstate(object): @@ -65,10 +63,16 @@ class dirstate(object): 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 @@ class dirstate(object): 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]