# HG changeset patch # User Boris Feld # Date 2017-07-12 18:11:00 # Node ID cf694e6422f0ceb572d05f1d118c010a6028444f # Parent 61714c282106fac00ac3b9dabbe44cb5419c8322 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. diff --git a/mercurial/phases.py b/mercurial/phases.py --- 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):