comparison mercurial/repoview.py @ 24616:72d34c5a6614

repoview: use a heap in _getstatichidden Since we want to process all non-public changesets from top to bottom, a heap seems more appropriate. This will ensure any revision is processed after all its children, opening the way to code simplification.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Fri, 03 Apr 2015 14:16:50 -0700
parents 9e558b788daa
children f76595f6ed7c
comparison
equal deleted inserted replaced
24615:9e558b788daa 24616:72d34c5a6614
4 # Logilab SA <contact@logilab.fr> 4 # Logilab SA <contact@logilab.fr>
5 # 5 #
6 # This software may be used and distributed according to the terms of the 6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version. 7 # GNU General Public License version 2 or any later version.
8 8
9 import collections 9 import heapq
10 import copy 10 import copy
11 import error 11 import error
12 import phases 12 import phases
13 import util 13 import util
14 import obsolete 14 import obsolete
37 hideable = hideablerevs(repo) 37 hideable = hideablerevs(repo)
38 if hideable: 38 if hideable:
39 actuallyhidden = {} 39 actuallyhidden = {}
40 getphase = repo._phasecache.phase 40 getphase = repo._phasecache.phase
41 getparentrevs = repo.changelog.parentrevs 41 getparentrevs = repo.changelog.parentrevs
42 queue = collections.deque((r, False) for r in repo.changelog.headrevs()) 42 heap = [(-r, False) for r in repo.changelog.headrevs()]
43 while queue: 43 heapq.heapify(heap)
44 rev, blocked = queue.popleft() 44 heappop = heapq.heappop
45 heappush = heapq.heappush
46 while heap:
47 rev, blocked = heappop(heap)
48 rev = - rev
45 phase = getphase(repo, rev) 49 phase = getphase(repo, rev)
46 # Skip nodes which are public (guaranteed to not be hidden) and 50 # Skip nodes which are public (guaranteed to not be hidden) and
47 # nodes which have already been processed and won't be blocked by 51 # nodes which have already been processed and won't be blocked by
48 # the previous node. 52 # the previous node.
49 if phase == 0 or (not blocked and rev in actuallyhidden): 53 if phase == 0 or (not blocked and rev in actuallyhidden):
55 actuallyhidden.setdefault(rev, True) 59 actuallyhidden.setdefault(rev, True)
56 else: 60 else:
57 blocked = True 61 blocked = True
58 62
59 for parent in (p for p in getparentrevs(rev) if p != nullrev): 63 for parent in (p for p in getparentrevs(rev) if p != nullrev):
60 queue.append((parent, blocked)) 64 heappush(heap, (- parent, blocked))
61 return set(rev for rev, hidden in actuallyhidden.iteritems() if hidden) 65 return set(rev for rev, hidden in actuallyhidden.iteritems() if hidden)
62 66
63 def _getdynamicblockers(repo): 67 def _getdynamicblockers(repo):
64 """Non-cacheable revisions blocking hidden changesets from being filtered. 68 """Non-cacheable revisions blocking hidden changesets from being filtered.
65 69