comparison mercurial/phases.py @ 15482:a667c89e49b3

phases: add retractboundary function to move boundary backward The advanceboundary documentation is updated to highlight the difference.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Fri, 11 Nov 2011 00:16:53 +0100
parents 0b7ce2f739fb
children 79cc89de5be1
comparison
equal deleted inserted replaced
15481:0b7ce2f739fb 15482:a667c89e49b3
59 repo._dirtyphases = True 59 repo._dirtyphases = True
60 60
61 def advanceboundary(repo, targetphase, nodes): 61 def advanceboundary(repo, targetphase, nodes):
62 """Add nodes to a phase changing other nodes phases if necessary. 62 """Add nodes to a phase changing other nodes phases if necessary.
63 63
64 This function move boundary *forward* this means that all nodes are set
65 in the target phase or kept in a *lower* phase.
66
64 Simplify boundary to contains phase roots only.""" 67 Simplify boundary to contains phase roots only."""
65
66 # move roots of lower states
67 for phase in xrange(targetphase + 1, len(allphases)): 68 for phase in xrange(targetphase + 1, len(allphases)):
68 # filter nodes that are not in a compatible phase already 69 # filter nodes that are not in a compatible phase already
69 # XXX rev phase cache might have been invalidated by a previous loop 70 # XXX rev phase cache might have been invalidated by a previous loop
70 # XXX we need to be smarter here 71 # XXX we need to be smarter here
71 nodes = [n for n in nodes if repo[n].phase() >= phase] 72 nodes = [n for n in nodes if repo[n].phase() >= phase]
79 if olds != roots: 80 if olds != roots:
80 # invalidate cache (we probably could be smarter here 81 # invalidate cache (we probably could be smarter here
81 if '_phaserev' in vars(repo): 82 if '_phaserev' in vars(repo):
82 del repo._phaserev 83 del repo._phaserev
83 repo._dirtyphases = True 84 repo._dirtyphases = True
85
86 def retractboundary(repo, targetphase, nodes):
87 """Set nodes back to a phase changing other nodes phases if necessary.
88
89 This function move boundary *backward* this means that all nodes are set
90 in the target phase or kept in a *higher* phase.
91
92 Simplify boundary to contains phase roots only."""
93 currentroots = repo._phaseroots[targetphase]
94 newroots = [n for n in nodes if repo[n].phase() < targetphase]
95 if newroots:
96 currentroots.update(newroots)
97 ctxs = repo.set('roots(%ln::)', currentroots)
98 currentroots.intersection_update(ctx.node() for ctx in ctxs)
99 if '_phaserev' in vars(repo):
100 del repo._phaserev
101 repo._dirtyphases = True
102