repoview: avoid processing the same rev twice in _getstatichidden
authorPierre-Yves David <pierre-yves.david@fb.com>
Fri, 03 Apr 2015 14:41:18 -0700
changeset 24620 7c6f9097e2e0
parent 24619 ad6dea5d96f2
child 24622 1e05f11619bb
repoview: avoid processing the same rev twice in _getstatichidden If a rev had multiple children, it would be added to the heap multiple times. We now ensure it is added only once.
mercurial/repoview.py
--- a/mercurial/repoview.py	Fri Apr 03 14:37:52 2015 -0700
+++ b/mercurial/repoview.py	Fri Apr 03 14:41:18 2015 -0700
@@ -43,6 +43,7 @@
         heapq.heapify(heap)
         heappop = heapq.heappop
         heappush = heapq.heappush
+        seen = set() # no need to init it with heads, they have no children
         while heap:
             rev = -heappop(heap)
             # All children have been processed so at that point, if no children
@@ -54,8 +55,11 @@
                 if blocker:
                     # If visible, ensure parent will be visible too
                     hidden.discard(parent)
-                # Skip nodes which are public (guaranteed to not be hidden)
-                if getphase(repo, rev):
+                # - Avoid adding the same revision twice
+                # - Skip nodes which are public (guaranteed to not be hidden)
+                pre = len(seen)
+                seen.add(parent)
+                if pre < len(seen) and getphase(repo, rev):
                     heappush(heap, -parent)
     return hidden