Mercurial > public > mercurial-scm > hg
diff mercurial/phases.py @ 35330:0c1aff6d73a7
revset: use phasecache.getrevset to calculate public()
Other revsets like secret(), draft(), _nonpublic() are using
phasescache.getrevset already. The latter is more efficient after D1606.
So let's migrate the public() revset function too.
Tested using:
$ hg debugshell --hidden --cwd hg-committed`
In [1]: %timeit len(repo.revs('public()'))
* Before D1606: 10 loops, best of 3: 22.5 ms per loop
* Before this change, after D1606: 10 loops, best of 3: 28.6 ms per loop
* After this change: 10 loops, best of 3: 20.2 ms per loop
Therefore `public()` revset becomes even slightly faster after the data
structure change by D1606. A similar performance win could also be observed
on a large repo.
A side effect is `phasecache.getrevset` needs to take a `subset` parameter.
That was added with a default value so it won't cause BC issues.
Differential Revision: https://phab.mercurial-scm.org/D1620
author | Jun Wu <quark@fb.com> |
---|---|
date | Fri, 08 Dec 2017 14:20:34 -0800 |
parents | d13526333835 |
children | 98cc121099fe |
line wrap: on
line diff
--- a/mercurial/phases.py Fri Dec 08 16:14:19 2017 -0500 +++ b/mercurial/phases.py Fri Dec 08 14:20:34 2017 -0800 @@ -208,7 +208,7 @@ self.filterunknown(repo) self.opener = repo.svfs - def getrevset(self, repo, phases): + def getrevset(self, repo, phases, subset=None): """return a smartset for the given phases""" self.loadphaserevs(repo) # ensure phase's sets are loaded phases = set(phases) @@ -222,7 +222,10 @@ revs = set.union(*[self._phasesets[p] for p in phases]) if repo.changelog.filteredrevs: revs = revs - repo.changelog.filteredrevs - return smartset.baseset(revs) + if subset is None: + return smartset.baseset(revs) + else: + return subset & smartset.baseset(revs) else: phases = set(allphases).difference(phases) if not phases: @@ -232,9 +235,11 @@ revs = self._phasesets[p] else: revs = set.union(*[self._phasesets[p] for p in phases]) + if subset is None: + subset = smartset.fullreposet(repo) if not revs: - return smartset.fullreposet(repo) - return smartset.fullreposet(repo).filter(lambda r: r not in revs) + return subset + return subset.filter(lambda r: r not in revs) def copy(self): # Shallow copy meant to ensure isolation in