mercurial/dagop.py
changeset 35296 2cb05e6043be
parent 35276 205c3c6c1a51
child 35297 c9144396099b
--- a/mercurial/dagop.py	Thu Dec 07 13:20:47 2017 -0800
+++ b/mercurial/dagop.py	Sun Oct 22 18:57:42 2017 +0900
@@ -77,7 +77,10 @@
 
 def filectxancestors(fctxs, followfirst=False):
     """Like filectx.ancestors(), but can walk from multiple files/revisions,
-    and includes the given fctxs themselves"""
+    and includes the given fctxs themselves
+
+    Yields (rev, {fctx, ...}) pairs in descending order.
+    """
     visit = {}
     def addvisit(fctx):
         rev = fctx.rev()
@@ -93,13 +96,21 @@
     for c in fctxs:
         addvisit(c)
     while visit:
-        rev = max(visit)
-        c = visit[rev].pop()
-        if not visit[rev]:
-            del visit[rev]
-        yield c
-        for parent in c.parents()[:cut]:
-            addvisit(parent)
+        currev = max(visit)
+        curfctxs = visit.pop(currev)
+        yield currev, curfctxs
+        for c in curfctxs:
+            for parent in c.parents()[:cut]:
+                addvisit(parent)
+
+def filerevancestors(fctxs, followfirst=False):
+    """Like filectx.ancestors(), but can walk from multiple files/revisions,
+    and includes the given fctxs themselves
+
+    Returns a smartset.
+    """
+    gen = (rev for rev, _cs in filectxancestors(fctxs, followfirst))
+    return generatorset(gen, iterasc=False)
 
 def _genrevancestors(repo, revs, followfirst, startdepth, stopdepth, cutfunc):
     if followfirst: