Mercurial > hg > mercurial-crew-with-dirclash
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: |