diff mercurial/revlog.py @ 6872:c7cc40fd74f6

Add ancestors and descendants to revlog This patch adds two methods to revlog: - ancestors: given a list of revisions returns their ancestors - descendants: given a list of revisions return their descendants
author Stefano Tortarolo <stefano.tortarolo@gmail.com>
date Sat, 19 Jul 2008 18:19:50 +0200
parents fb42030d79d6
children 22cb82433842
line wrap: on
line diff
--- a/mercurial/revlog.py	Sat Aug 09 02:10:22 2008 +0200
+++ b/mercurial/revlog.py	Sat Jul 19 18:19:50 2008 +0200
@@ -596,6 +596,27 @@
                     visit.append(p)
         return reachable
 
+    def ancestors(self, *revs):
+        'Generate the ancestors of revs using a breadth-first visit'
+        visit = list(revs)
+        seen = util.set([nullrev])
+        while visit:
+            for parent in self.parentrevs(visit.pop(0)):
+                if parent not in seen:
+                    visit.append(parent)
+                    seen.add(parent)
+                    yield parent
+
+    def descendants(self, *revs):
+        'Generate the descendants of revs in topological order'
+        seen = util.set(revs)
+        for i in xrange(min(revs) + 1, len(self)):
+            for x in self.parentrevs(i):
+                if x != nullrev and x in seen:
+                    seen.add(i)
+                    yield i
+                    break
+
     def nodesbetween(self, roots=None, heads=None):
         """Return a tuple containing three elements. Elements 1 and 2 contain
         a final list bases and heads after all the unreachable ones have been