equal
deleted
inserted
replaced
438 def walk(self, files = None, match = util.always): |
438 def walk(self, files = None, match = util.always): |
439 self.read() |
439 self.read() |
440 dc = self.map.copy() |
440 dc = self.map.copy() |
441 # walk all files by default |
441 # walk all files by default |
442 if not files: files = [self.root] |
442 if not files: files = [self.root] |
|
443 known = {'.hg': 1} |
|
444 def seen(fn): |
|
445 if fn in known: return True |
|
446 known[fn] = 1 |
443 def traverse(): |
447 def traverse(): |
444 for f in util.unique(files): |
448 for f in util.unique(files): |
445 f = os.path.join(self.root, f) |
449 f = os.path.join(self.root, f) |
446 if os.path.isdir(f): |
450 if os.path.isdir(f): |
447 for dir, subdirs, fl in os.walk(f): |
451 for dir, subdirs, fl in os.walk(f): |
448 d = dir[len(self.root) + 1:] |
452 d = dir[len(self.root) + 1:] |
449 nd = os.path.normpath(d) |
453 nd = os.path.normpath(d) |
450 if nd == '.hg': |
454 if seen(nd): |
451 subdirs[:] = [] |
455 subdirs[:] = [] |
452 continue |
456 continue |
453 for sd in subdirs: |
457 for sd in subdirs: |
454 ds = os.path.join(nd, sd +'/') |
458 ds = os.path.join(nd, sd +'/') |
455 if self.ignore(ds) or not match(ds): |
459 if self.ignore(ds) or not match(ds): |
466 # yield only files that match: all in dirstate, others only if |
470 # yield only files that match: all in dirstate, others only if |
467 # not in .hgignore |
471 # not in .hgignore |
468 |
472 |
469 for src, fn in util.unique(traverse()): |
473 for src, fn in util.unique(traverse()): |
470 fn = os.path.normpath(fn) |
474 fn = os.path.normpath(fn) |
|
475 if seen(fn): continue |
471 if fn in dc: |
476 if fn in dc: |
472 del dc[fn] |
477 del dc[fn] |
473 elif self.ignore(fn): |
478 elif self.ignore(fn): |
474 continue |
479 continue |
475 if match(fn): |
480 if match(fn): |