dagop: use heap to compute max rev in filectxancestors()
authorYuya Nishihara <yuya@tcha.org>
Thu, 22 Sep 2016 18:41:51 +0900
changeset 35297 c9144396099b
parent 35296 2cb05e6043be
child 35298 921680c3e2ea
dagop: use heap to compute max rev in filectxancestors()
mercurial/dagop.py
--- a/mercurial/dagop.py	Sun Oct 22 18:57:42 2017 +0900
+++ b/mercurial/dagop.py	Thu Sep 22 18:41:51 2016 +0900
@@ -82,10 +82,12 @@
     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 @@
     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,