Mercurial > hg-stable
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 |