From b9cdddd1ceb5296d72d229fb1bf5b260d97d8bab Mon Sep 17 00:00:00 2001 From: Boris Feld Date: Wed, 12 Jul 2017 20:11:00 +0200 Subject: [PATCH] phases: track phase changes from 'retractboundary' We adds new computation to find and record the revision affected by the boundary retraction. This add more complication to the function but this seems fine since it is only used in a couple of rare and explicit cases (`hg phase --force` and `hg qimport`). Having strong tracking of phase changes is worth the effort. --- mercurial/phases.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/mercurial/phases.py b/mercurial/phases.py index 7fa8dc139c..38c40e55ef 100644 --- a/mercurial/phases.py +++ b/mercurial/phases.py @@ -348,7 +348,30 @@ class phasecache(object): repo.invalidatevolatilesets() def retractboundary(self, repo, tr, targetphase, nodes): - self._retractboundary(repo, tr, targetphase, nodes) + oldroots = self.phaseroots[:targetphase + 1] + if tr is None: + phasetracking = None + else: + phasetracking = tr.changes.get('phases') + repo = repo.unfiltered() + if (self._retractboundary(repo, tr, targetphase, nodes) + and phasetracking is not None): + + # find the affected revisions + new = self.phaseroots[targetphase] + old = oldroots[targetphase] + affected = set(repo.revs('(%ln::) - (%ln::)', new, old)) + + # find the phase of the affected revision + for phase in xrange(targetphase, -1, -1): + if phase: + roots = oldroots[phase] + revs = set(repo.revs('%ln::%ld', roots, affected)) + affected -= revs + else: # public phase + revs = affected + for r in revs: + _trackphasechange(phasetracking, r, phase, targetphase) repo.invalidatevolatilesets() def _retractboundary(self, repo, tr, targetphase, nodes):