[Request] [+- ] D8641: phases: improve performance of _retractboundary
joerg.sonnenberger (Joerg Sonnenberger)
phabricator at mercurial-scm.org
Thu Jun 18 20:23:44 UTC 2020
joerg.sonnenberger created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
The old version repeatedly converts nodes to revisions, which is a
moderately expensive operation. Mapping all new changes once to
revisions and back at the end reduces the time spend in _retractboundary
during the unbundling of NetBSD's src from 67s to 17s.
REPOSITORY
rHG Mercurial
BRANCH
stable
REVISION DETAIL
https://phab.mercurial-scm.org/D8641
AFFECTED FILES
mercurial/phases.py
CHANGE DETAILS
diff --git a/mercurial/phases.py b/mercurial/phases.py
--- a/mercurial/phases.py
+++ b/mercurial/phases.py
@@ -583,30 +583,28 @@
raise error.ProgrammingError(msg)
repo = repo.unfiltered()
- currentroots = self.phaseroots[targetphase]
+ torev = repo.changelog.rev
+ tonode = repo.changelog.node
+ currentroots = {torev(node) for node in self.phaseroots[targetphase]}
finalroots = oldroots = set(currentroots)
- newroots = [
- n for n in nodes if self.phase(repo, repo[n].rev()) < targetphase
- ]
+ newroots = [torev(node) for node in nodes]
+ newroots = [rev for rev in newroots if self.phase(repo, rev) < targetphase]
+
if newroots:
-
- if nullid in newroots:
+ if nullrev in newroots:
raise error.Abort(_(b'cannot change null revision phase'))
- currentroots = currentroots.copy()
currentroots.update(newroots)
# Only compute new roots for revs above the roots that are being
# retracted.
- minnewroot = min(repo[n].rev() for n in newroots)
- aboveroots = [
- n for n in currentroots if repo[n].rev() >= minnewroot
- ]
- updatedroots = repo.set(b'roots(%ln::)', aboveroots)
+ minnewroot = min(newroots)
+ aboveroots = [rev for rev in currentroots if rev >= minnewroot]
+ updatedroots = repo.set(b'roots(%ld::)', aboveroots)
- finalroots = {n for n in currentroots if repo[n].rev() < minnewroot}
- finalroots.update(ctx.node() for ctx in updatedroots)
+ finalroots = {rev for rev in currentroots if rev < minnewroot}
+ finalroots.update(ctx.rev() for ctx in updatedroots)
if finalroots != oldroots:
- self._updateroots(targetphase, finalroots, tr)
+ self._updateroots(targetphase, {tonode(rev) for rev in finalroots}, tr)
return True
return False
To: joerg.sonnenberger, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mercurial-scm.org/pipermail/mercurial-patches/attachments/20200618/b6beeaf2/attachment-0001.html>
More information about the Mercurial-patches
mailing list