comparison mercurial/dirstate.py @ 4606:9da7a4da650f

dirstate: lazify initdirs
author Matt Mackall <mpm@selenic.com>
date Mon, 18 Jun 2007 13:24:33 -0500
parents c867c11426ad
children 2651099c5018
comparison
equal deleted inserted replaced
4605:c867c11426ad 4606:9da7a4da650f
18 def __init__(self, opener, ui, root): 18 def __init__(self, opener, ui, root):
19 self.opener = opener 19 self.opener = opener
20 self.root = root 20 self.root = root
21 self.dirty = 0 21 self.dirty = 0
22 self.ui = ui 22 self.ui = ui
23 self.dirs = None
24 self.ignorefunc = None 23 self.ignorefunc = None
25 self._slash = None 24 self._slash = None
26 25
27 def __getattr__(self, name): 26 def __getattr__(self, name):
28 if name == 'map': 27 if name == 'map':
45 if len(st) == 40: 44 if len(st) == 40:
46 self.pl = st[:20], st[20:40] 45 self.pl = st[:20], st[20:40]
47 except IOError, err: 46 except IOError, err:
48 if err.errno != errno.ENOENT: raise 47 if err.errno != errno.ENOENT: raise
49 return self.pl 48 return self.pl
49 elif name == 'dirs':
50 self.dirs = {}
51 for f in self.map:
52 self.updatedirs(f, 1)
53 return self.dirs
50 else: 54 else:
51 raise AttributeError, name 55 raise AttributeError, name
52 56
53 def wjoin(self, f): 57 def wjoin(self, f):
54 return os.path.join(self.root, f) 58 return os.path.join(self.root, f)
254 return self.copymap.get(file, None) 258 return self.copymap.get(file, None)
255 259
256 def copies(self): 260 def copies(self):
257 return self.copymap 261 return self.copymap
258 262
259 def initdirs(self):
260 if self.dirs is None:
261 self.dirs = {}
262 for f in self.map:
263 self.updatedirs(f, 1)
264
265 def updatedirs(self, path, delta): 263 def updatedirs(self, path, delta):
266 if self.dirs is not None: 264 for c in strutil.findall(path, '/'):
267 for c in strutil.findall(path, '/'): 265 pc = path[:c]
268 pc = path[:c] 266 self.dirs.setdefault(pc, 0)
269 self.dirs.setdefault(pc, 0) 267 self.dirs[pc] += delta
270 self.dirs[pc] += delta
271 268
272 def checkinterfering(self, files): 269 def checkinterfering(self, files):
273 def prefixes(f): 270 def prefixes(f):
274 for c in strutil.rfindall(f, '/'): 271 for c in strutil.rfindall(f, '/'):
275 yield f[:c] 272 yield f[:c]
276 self.initdirs()
277 seendirs = {} 273 seendirs = {}
278 for f in files: 274 for f in files:
279 # shadows 275 # shadows
280 if self.dirs.get(f): 276 if self.dirs.get(f):
281 raise util.Abort(_('directory named %r already in dirstate') % 277 raise util.Abort(_('directory named %r already in dirstate') %
299 a marked for addition''' 295 a marked for addition'''
300 296
301 if not files: return 297 if not files: return
302 self.markdirty() 298 self.markdirty()
303 if state == "a": 299 if state == "a":
304 self.initdirs()
305 self.checkinterfering(files) 300 self.checkinterfering(files)
306 for f in files: 301 for f in files:
307 if state == "r": 302 if state == "r":
308 self.map[f] = ('r', 0, 0, 0) 303 self.map[f] = ('r', 0, 0, 0)
309 self.updatedirs(f, -1) 304 self.updatedirs(f, -1)
318 del self.copymap[f] 313 del self.copymap[f]
319 314
320 def forget(self, files): 315 def forget(self, files):
321 if not files: return 316 if not files: return
322 self.markdirty() 317 self.markdirty()
323 self.initdirs()
324 for f in files: 318 for f in files:
325 try: 319 try:
326 del self.map[f] 320 del self.map[f]
327 self.updatedirs(f, -1) 321 self.updatedirs(f, -1)
328 except KeyError: 322 except KeyError: