# HG changeset patch # User Matt Mackall # Date 2008-09-13 00:57:07 # Node ID 7dfac37cfabf4dfc8ccb57fd92ff165087d4cae4 # Parent 19e8d034932e5d9b0c360fffa302cde3f6bc36a7 dirstate: improve performance for building _dirs diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -16,12 +16,10 @@ import cStringIO, osutil, sys _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 @@ 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]