Mercurial > hg
comparison 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 |
comparison
equal
deleted
inserted
replaced
35329:169d66db5920 | 35330:0c1aff6d73a7 |
---|---|
206 self._phasemaxrev = nullrev | 206 self._phasemaxrev = nullrev |
207 self._phasesets = None | 207 self._phasesets = None |
208 self.filterunknown(repo) | 208 self.filterunknown(repo) |
209 self.opener = repo.svfs | 209 self.opener = repo.svfs |
210 | 210 |
211 def getrevset(self, repo, phases): | 211 def getrevset(self, repo, phases, subset=None): |
212 """return a smartset for the given phases""" | 212 """return a smartset for the given phases""" |
213 self.loadphaserevs(repo) # ensure phase's sets are loaded | 213 self.loadphaserevs(repo) # ensure phase's sets are loaded |
214 phases = set(phases) | 214 phases = set(phases) |
215 if public not in phases: | 215 if public not in phases: |
216 # fast path: _phasesets contains the interesting sets, | 216 # fast path: _phasesets contains the interesting sets, |
220 revs = self._phasesets[p] | 220 revs = self._phasesets[p] |
221 else: | 221 else: |
222 revs = set.union(*[self._phasesets[p] for p in phases]) | 222 revs = set.union(*[self._phasesets[p] for p in phases]) |
223 if repo.changelog.filteredrevs: | 223 if repo.changelog.filteredrevs: |
224 revs = revs - repo.changelog.filteredrevs | 224 revs = revs - repo.changelog.filteredrevs |
225 return smartset.baseset(revs) | 225 if subset is None: |
226 return smartset.baseset(revs) | |
227 else: | |
228 return subset & smartset.baseset(revs) | |
226 else: | 229 else: |
227 phases = set(allphases).difference(phases) | 230 phases = set(allphases).difference(phases) |
228 if not phases: | 231 if not phases: |
229 return smartset.fullreposet(repo) | 232 return smartset.fullreposet(repo) |
230 if len(phases) == 1: | 233 if len(phases) == 1: |
231 [p] = phases | 234 [p] = phases |
232 revs = self._phasesets[p] | 235 revs = self._phasesets[p] |
233 else: | 236 else: |
234 revs = set.union(*[self._phasesets[p] for p in phases]) | 237 revs = set.union(*[self._phasesets[p] for p in phases]) |
238 if subset is None: | |
239 subset = smartset.fullreposet(repo) | |
235 if not revs: | 240 if not revs: |
236 return smartset.fullreposet(repo) | 241 return subset |
237 return smartset.fullreposet(repo).filter(lambda r: r not in revs) | 242 return subset.filter(lambda r: r not in revs) |
238 | 243 |
239 def copy(self): | 244 def copy(self): |
240 # Shallow copy meant to ensure isolation in | 245 # Shallow copy meant to ensure isolation in |
241 # advance/retractboundary(), nothing more. | 246 # advance/retractboundary(), nothing more. |
242 ph = self.__class__(None, None, _load=False) | 247 ph = self.__class__(None, None, _load=False) |