comparison mercurial/repoview.py @ 18272:95ef7a87c053

performance: speedup computation of hidden revisions In their current state, revset calls can be very costlys, as we test predicates on the entire repository. The hidden filter is very widely used, and needs to be very fast. This change drops revset calls in favor of direct revision manipulation. Performance test on my Mercurial checkout - 19857 total changesets, - 1584 obsolete changesets, - 13310 obsolescence markers. Before: ! hidden ! wall 0.077553 After this changes: ! hidden ! wall 0.011230 Performance test on a Mozilla central checkout: - 117293 total changesets, - 1 obsolete changeset, - 1 obsolescence marker. Before: ! hidden ! wall 0.389472 After: ! hidden ! wall 0.000079
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Fri, 04 Jan 2013 05:44:01 +0100
parents f54898526aad
children a2d54f68e13c
comparison
equal deleted inserted replaced
18271:67872e939945 18272:95ef7a87c053
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 copy 9 import copy
10 import phases 10 import phases
11 import util 11 import util
12 import obsolete, bookmarks, revset
12 13
13 14
14 def computehidden(repo): 15 def computehidden(repo):
15 """compute the set of hidden revision to filter 16 """compute the set of hidden revision to filter
16 17
17 During most operation hidden should be filtered.""" 18 During most operation hidden should be filtered."""
18 assert not repo.changelog.filteredrevs 19 assert not repo.changelog.filteredrevs
19 if repo.obsstore: 20 hideable = obsolete.getrevs(repo, 'obsolete')
20 ### hide extinct changeset that are not accessible by any mean 21 if hideable:
21 hiddenquery = 'extinct() - ::(parents() + bookmark())' 22 cl = repo.changelog
22 return frozenset(repo.revs(hiddenquery)) 23 firsthideable = min(hideable)
24 revs = cl.revs(start=firsthideable)
25 blockers = [r for r in revset._children(repo, revs, hideable)
26 if r not in hideable]
27 for par in repo[None].parents():
28 blockers.append(par.rev())
29 for bm in bookmarks.listbookmarks(repo).values():
30 blockers.append(repo[bm].rev())
31 blocked = cl.ancestors(blockers, inclusive=True)
32 return frozenset(r for r in hideable if r not in blocked)
23 return frozenset() 33 return frozenset()
24 34
25 def computeunserved(repo): 35 def computeunserved(repo):
26 """compute the set of revision that should be filtered when used a server 36 """compute the set of revision that should be filtered when used a server
27 37