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 if d == '.hg': |
453 nd = os.path.normpath(d) |
|
454 if seen(nd): |
450 subdirs[:] = [] |
455 subdirs[:] = [] |
451 continue |
456 continue |
452 for sd in subdirs: |
457 for sd in subdirs: |
453 ds = os.path.join(d, sd +'/') |
458 ds = os.path.join(nd, sd +'/') |
454 if self.ignore(ds) or not match(ds): |
459 if self.ignore(ds) or not match(ds): |
455 subdirs.remove(sd) |
460 subdirs.remove(sd) |
|
461 subdirs.sort() |
|
462 fl.sort() |
456 for fn in fl: |
463 for fn in fl: |
457 fn = util.pconvert(os.path.join(d, fn)) |
464 fn = util.pconvert(os.path.join(d, fn)) |
458 yield 'f', fn |
465 yield 'f', fn |
459 else: |
466 else: |
460 yield 'f', f[len(self.root) + 1:] |
467 yield 'f', f[len(self.root) + 1:] |
461 |
468 |
462 for k in dc.keys(): |
469 ks = dc.keys() |
|
470 ks.sort() |
|
471 for k in ks: |
463 yield 'm', k |
472 yield 'm', k |
464 |
473 |
465 # yield only files that match: all in dirstate, others only if |
474 # yield only files that match: all in dirstate, others only if |
466 # not in .hgignore |
475 # not in .hgignore |
467 |
476 |
468 for src, fn in util.unique(traverse()): |
477 for src, fn in util.unique(traverse()): |
|
478 fn = os.path.normpath(fn) |
|
479 if seen(fn): continue |
469 if fn in dc: |
480 if fn in dc: |
470 del dc[fn] |
481 del dc[fn] |
471 elif self.ignore(fn): |
482 elif self.ignore(fn): |
472 continue |
483 continue |
473 if match(fn): |
484 if match(fn): |
866 return 1 |
877 return 1 |
867 |
878 |
868 def walk(self, node = None, files = [], match = util.always): |
879 def walk(self, node = None, files = [], match = util.always): |
869 if node: |
880 if node: |
870 for fn in self.manifest.read(self.changelog.read(node)[0]): |
881 for fn in self.manifest.read(self.changelog.read(node)[0]): |
871 yield 'm', fn |
882 if match(fn): yield 'm', fn |
872 else: |
883 else: |
873 for src, fn in self.dirstate.walk(files, match): |
884 for src, fn in self.dirstate.walk(files, match): |
874 yield src, fn |
885 yield src, fn |
875 |
886 |
876 def changes(self, node1 = None, node2 = None, files = [], |
887 def changes(self, node1 = None, node2 = None, files = [], |