Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlog.py @ 17672:474047947b8f
clfilter: make the revlog class responsible of all its iteration
This prepares changelog level filtering. We need the algorithms used in revlog to
work on a subset of revisions. To achieve this, the use of explicit range of
revision is banned. `range` and `xrange` calls are replaced by a `revlog.irevs`
method. Filtered super class can then overwrite the `irevs` method to filter out
revision.
author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
---|---|
date | Thu, 20 Sep 2012 19:00:59 +0200 |
parents | 31f32a96e1e3 |
children | d686c6876ef6 |
comparison
equal
deleted
inserted
replaced
17671:fdd0fc046cf1 | 17672:474047947b8f |
---|---|
254 def __len__(self): | 254 def __len__(self): |
255 return len(self.index) - 1 | 255 return len(self.index) - 1 |
256 def __iter__(self): | 256 def __iter__(self): |
257 for i in xrange(len(self)): | 257 for i in xrange(len(self)): |
258 yield i | 258 yield i |
259 def revs(self, start=0, stop=None): | |
260 """iterate over all rev in this revlog (from start to stop)""" | |
261 if stop is None: | |
262 stop = len(self) | |
263 else: | |
264 stop += 1 | |
265 return xrange(start, stop) | |
259 | 266 |
260 @util.propertycache | 267 @util.propertycache |
261 def nodemap(self): | 268 def nodemap(self): |
262 self.rev(self.node(0)) | 269 self.rev(self.node(0)) |
263 return self._nodecache | 270 return self._nodecache |
372 for i in self: | 379 for i in self: |
373 yield i | 380 yield i |
374 return | 381 return |
375 | 382 |
376 seen = set(revs) | 383 seen = set(revs) |
377 for i in xrange(first + 1, len(self)): | 384 for i in self.revs(start=first + 1): |
378 for x in self.parentrevs(i): | 385 for x in self.parentrevs(i): |
379 if x != nullrev and x in seen: | 386 if x != nullrev and x in seen: |
380 seen.add(i) | 387 seen.add(i) |
381 yield i | 388 yield i |
382 break | 389 break |
547 # Our topologically sorted list of output nodes. | 554 # Our topologically sorted list of output nodes. |
548 orderedout = [] | 555 orderedout = [] |
549 # Don't start at nullid since we don't want nullid in our output list, | 556 # Don't start at nullid since we don't want nullid in our output list, |
550 # and if nullid shows up in descendants, empty parents will look like | 557 # and if nullid shows up in descendants, empty parents will look like |
551 # they're descendants. | 558 # they're descendants. |
552 for r in xrange(max(lowestrev, 0), highestrev + 1): | 559 for r in self.revs(start=max(lowestrev, 0), stop=highestrev + 1): |
553 n = self.node(r) | 560 n = self.node(r) |
554 isdescendant = False | 561 isdescendant = False |
555 if lowestrev == nullrev: # Everybody is a descendant of nullid | 562 if lowestrev == nullrev: # Everybody is a descendant of nullid |
556 isdescendant = True | 563 isdescendant = True |
557 elif n in descendants: | 564 elif n in descendants: |
604 count = len(self) | 611 count = len(self) |
605 if not count: | 612 if not count: |
606 return [nullrev] | 613 return [nullrev] |
607 ishead = [1] * (count + 1) | 614 ishead = [1] * (count + 1) |
608 index = self.index | 615 index = self.index |
609 for r in xrange(count): | 616 for r in self: |
610 e = index[r] | 617 e = index[r] |
611 ishead[e[5]] = ishead[e[6]] = 0 | 618 ishead[e[5]] = ishead[e[6]] = 0 |
612 return [r for r in xrange(count) if ishead[r]] | 619 return [r for r in xrange(count) if ishead[r]] |
613 | 620 |
614 def heads(self, start=None, stop=None): | 621 def heads(self, start=None, stop=None): |
632 startrev = self.rev(start) | 639 startrev = self.rev(start) |
633 reachable = set((startrev,)) | 640 reachable = set((startrev,)) |
634 heads = set((startrev,)) | 641 heads = set((startrev,)) |
635 | 642 |
636 parentrevs = self.parentrevs | 643 parentrevs = self.parentrevs |
637 for r in xrange(startrev + 1, len(self)): | 644 for r in self.revs(start=startrev + 1): |
638 for p in parentrevs(r): | 645 for p in parentrevs(r): |
639 if p in reachable: | 646 if p in reachable: |
640 if r not in stoprevs: | 647 if r not in stoprevs: |
641 reachable.add(r) | 648 reachable.add(r) |
642 heads.add(r) | 649 heads.add(r) |
647 | 654 |
648 def children(self, node): | 655 def children(self, node): |
649 """find the children of a given node""" | 656 """find the children of a given node""" |
650 c = [] | 657 c = [] |
651 p = self.rev(node) | 658 p = self.rev(node) |
652 for r in range(p + 1, len(self)): | 659 for r in self.revs(start=p + 1): |
653 prevs = [pr for pr in self.parentrevs(r) if pr != nullrev] | 660 prevs = [pr for pr in self.parentrevs(r) if pr != nullrev] |
654 if prevs: | 661 if prevs: |
655 for pr in prevs: | 662 for pr in prevs: |
656 if pr == p: | 663 if pr == p: |
657 c.append(self.node(r)) | 664 c.append(self.node(r)) |