[PATCH 2 of 6] dagop: use heap to compute max rev in filectxancestors()

Yuya Nishihara yuya at tcha.org
Thu Dec 7 10:09:20 EST 2017


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1474537311 -32400
#      Thu Sep 22 18:41:51 2016 +0900
# Node ID 06c09a740d66aa3e7abcf3104b84803c8b48ecad
# Parent  33687d121e08c716d8e41e0135b14c75c78c3fda
dagop: use heap to compute max rev in filectxancestors()

diff --git a/mercurial/dagop.py b/mercurial/dagop.py
--- a/mercurial/dagop.py
+++ b/mercurial/dagop.py
@@ -82,10 +82,12 @@ def filectxancestors(fctxs, followfirst=
     Yields (rev, {fctx, ...}) pairs in descending order.
     """
     visit = {}
+    visitheap = []
     def addvisit(fctx):
         rev = fctx.rev()
         if rev not in visit:
             visit[rev] = set()
+            heapq.heappush(visitheap, -rev)  # max heap
         visit[rev].add(fctx)
 
     if followfirst:
@@ -96,12 +98,13 @@ def filectxancestors(fctxs, followfirst=
     for c in fctxs:
         addvisit(c)
     while visit:
-        currev = max(visit)
+        currev = -heapq.heappop(visitheap)
         curfctxs = visit.pop(currev)
         yield currev, curfctxs
         for c in curfctxs:
             for parent in c.parents()[:cut]:
                 addvisit(parent)
+    assert not visitheap
 
 def filerevancestors(fctxs, followfirst=False):
     """Like filectx.ancestors(), but can walk from multiple files/revisions,


More information about the Mercurial-devel mailing list