Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/context.py @ 24646:5693c834bcb4
manifest: move changectx.walk() to manifests
The logic of walking a manifest to yield files matching a match object is
currently being done by context, not the manifest itself. This moves the walk()
function to both manifestdict and treemanifest. This separate implementation
will also permit differing, optimized implementations for each manifest.
author | Drew Gottlieb <drgott@google.com> |
---|---|
date | Tue, 07 Apr 2015 15:18:52 -0700 |
parents | 2f8f7cc6a53b |
children | 11e8fec00234 |
comparison
equal
deleted
inserted
replaced
24645:b39afa36006a | 24646:5693c834bcb4 |
---|---|
585 def descendant(self, other): | 585 def descendant(self, other): |
586 """True if other is descendant of this changeset""" | 586 """True if other is descendant of this changeset""" |
587 return self._repo.changelog.descendant(self._rev, other._rev) | 587 return self._repo.changelog.descendant(self._rev, other._rev) |
588 | 588 |
589 def walk(self, match): | 589 def walk(self, match): |
590 fset = set(match.files()) | 590 '''Generates matching file names.''' |
591 # avoid the entire walk if we're only looking for specific files | 591 |
592 if fset and not match.anypats(): | 592 # Override match.bad method to have message with nodeid |
593 if util.all(fn in self for fn in fset): | 593 oldbad = match.bad |
594 for fn in sorted(fset): | 594 def bad(fn, msg): |
595 yield fn | 595 oldbad(fn, _('no such file in rev %s') % self) |
596 raise StopIteration | 596 match.bad = bad |
597 | 597 |
598 for fn in self: | 598 return self._manifest.walk(match) |
599 if fn in fset: | |
600 # specified pattern is the exact name | |
601 fset.remove(fn) | |
602 if match(fn): | |
603 yield fn | |
604 # for dirstate.walk, files=['.'] means "walk the whole tree". | |
605 # follow that here, too | |
606 fset.discard('.') | |
607 for fn in sorted(fset): | |
608 if not self.hasdir(fn): | |
609 match.bad(fn, _('no such file in rev %s') % self) | |
610 | 599 |
611 def matches(self, match): | 600 def matches(self, match): |
612 return self.walk(match) | 601 return self.walk(match) |
613 | 602 |
614 class basefilectx(object): | 603 class basefilectx(object): |
1266 def ancestor(self, c2): | 1255 def ancestor(self, c2): |
1267 """return the "best" ancestor context of self and c2""" | 1256 """return the "best" ancestor context of self and c2""" |
1268 return self._parents[0].ancestor(c2) # punt on two parents for now | 1257 return self._parents[0].ancestor(c2) # punt on two parents for now |
1269 | 1258 |
1270 def walk(self, match): | 1259 def walk(self, match): |
1260 '''Generates matching file names.''' | |
1271 return sorted(self._repo.dirstate.walk(match, sorted(self.substate), | 1261 return sorted(self._repo.dirstate.walk(match, sorted(self.substate), |
1272 True, False)) | 1262 True, False)) |
1273 | 1263 |
1274 def matches(self, match): | 1264 def matches(self, match): |
1275 return sorted(self._repo.dirstate.matches(match)) | 1265 return sorted(self._repo.dirstate.matches(match)) |