mercurial/phases.py
changeset 38218 36ba5dba372d
parent 38158 4e790f0966fc
child 38682 88efb7d6bcb6
equal deleted inserted replaced
38217:16f93a3b8b05 38218:36ba5dba372d
   352                 rev = torev(n)
   352                 rev = torev(n)
   353                 revphase = phase(repo, rev)
   353                 revphase = phase(repo, rev)
   354                 _trackphasechange(phasetracking, rev, None, revphase)
   354                 _trackphasechange(phasetracking, rev, None, revphase)
   355         repo.invalidatevolatilesets()
   355         repo.invalidatevolatilesets()
   356 
   356 
   357     def advanceboundary(self, repo, tr, targetphase, nodes):
   357     def advanceboundary(self, repo, tr, targetphase, nodes, dryrun=None):
   358         """Set all 'nodes' to phase 'targetphase'
   358         """Set all 'nodes' to phase 'targetphase'
   359 
   359 
   360         Nodes with a phase lower than 'targetphase' are not affected.
   360         Nodes with a phase lower than 'targetphase' are not affected.
       
   361 
       
   362         If dryrun is True, no actions will be performed
       
   363 
       
   364         Returns a set of revs whose phase is changed or should be changed
   361         """
   365         """
   362         # Be careful to preserve shallow-copied values: do not update
   366         # Be careful to preserve shallow-copied values: do not update
   363         # phaseroots values, replace them.
   367         # phaseroots values, replace them.
   364         if tr is None:
   368         if tr is None:
   365             phasetracking = None
   369             phasetracking = None
   366         else:
   370         else:
   367             phasetracking = tr.changes.get('phases')
   371             phasetracking = tr.changes.get('phases')
   368 
   372 
   369         repo = repo.unfiltered()
   373         repo = repo.unfiltered()
   370 
   374 
       
   375         changes = set() # set of revisions to be changed
   371         delroots = [] # set of root deleted by this path
   376         delroots = [] # set of root deleted by this path
   372         for phase in xrange(targetphase + 1, len(allphases)):
   377         for phase in xrange(targetphase + 1, len(allphases)):
   373             # filter nodes that are not in a compatible phase already
   378             # filter nodes that are not in a compatible phase already
   374             nodes = [n for n in nodes
   379             nodes = [n for n in nodes
   375                      if self.phase(repo, repo[n].rev()) >= phase]
   380                      if self.phase(repo, repo[n].rev()) >= phase]
   377                 break # no roots to move anymore
   382                 break # no roots to move anymore
   378 
   383 
   379             olds = self.phaseroots[phase]
   384             olds = self.phaseroots[phase]
   380 
   385 
   381             affected = repo.revs('%ln::%ln', olds, nodes)
   386             affected = repo.revs('%ln::%ln', olds, nodes)
       
   387             changes.update(affected)
       
   388             if dryrun:
       
   389                 continue
   382             for r in affected:
   390             for r in affected:
   383                 _trackphasechange(phasetracking, r, self.phase(repo, r),
   391                 _trackphasechange(phasetracking, r, self.phase(repo, r),
   384                                   targetphase)
   392                                   targetphase)
   385 
   393 
   386             roots = set(ctx.node() for ctx in repo.set(
   394             roots = set(ctx.node() for ctx in repo.set(
   387                     'roots((%ln::) - %ld)', olds, affected))
   395                     'roots((%ln::) - %ld)', olds, affected))
   388             if olds != roots:
   396             if olds != roots:
   389                 self._updateroots(phase, roots, tr)
   397                 self._updateroots(phase, roots, tr)
   390                 # some roots may need to be declared for lower phases
   398                 # some roots may need to be declared for lower phases
   391                 delroots.extend(olds - roots)
   399                 delroots.extend(olds - roots)
   392         # declare deleted root in the target phase
   400         if not dryrun:
   393         if targetphase != 0:
   401             # declare deleted root in the target phase
   394             self._retractboundary(repo, tr, targetphase, delroots)
   402             if targetphase != 0:
   395         repo.invalidatevolatilesets()
   403                 self._retractboundary(repo, tr, targetphase, delroots)
       
   404             repo.invalidatevolatilesets()
       
   405         return changes
   396 
   406 
   397     def retractboundary(self, repo, tr, targetphase, nodes):
   407     def retractboundary(self, repo, tr, targetphase, nodes):
   398         oldroots = self.phaseroots[:targetphase + 1]
   408         oldroots = self.phaseroots[:targetphase + 1]
   399         if tr is None:
   409         if tr is None:
   400             phasetracking = None
   410             phasetracking = None
   478         # anyway. If this change we should consider adding a dedicated
   488         # anyway. If this change we should consider adding a dedicated
   479         # "destroyed" function to phasecache or a proper cache key mechanism
   489         # "destroyed" function to phasecache or a proper cache key mechanism
   480         # (see branchmap one)
   490         # (see branchmap one)
   481         self.invalidate()
   491         self.invalidate()
   482 
   492 
   483 def advanceboundary(repo, tr, targetphase, nodes):
   493 def advanceboundary(repo, tr, targetphase, nodes, dryrun=None):
   484     """Add nodes to a phase changing other nodes phases if necessary.
   494     """Add nodes to a phase changing other nodes phases if necessary.
   485 
   495 
   486     This function move boundary *forward* this means that all nodes
   496     This function move boundary *forward* this means that all nodes
   487     are set in the target phase or kept in a *lower* phase.
   497     are set in the target phase or kept in a *lower* phase.
   488 
   498 
   489     Simplify boundary to contains phase roots only."""
   499     Simplify boundary to contains phase roots only.
       
   500 
       
   501     If dryrun is True, no actions will be performed
       
   502 
       
   503     Returns a set of revs whose phase is changed or should be changed
       
   504     """
   490     phcache = repo._phasecache.copy()
   505     phcache = repo._phasecache.copy()
   491     phcache.advanceboundary(repo, tr, targetphase, nodes)
   506     changes = phcache.advanceboundary(repo, tr, targetphase, nodes,
   492     repo._phasecache.replace(phcache)
   507                                       dryrun=dryrun)
       
   508     if not dryrun:
       
   509         repo._phasecache.replace(phcache)
       
   510     return changes
   493 
   511 
   494 def retractboundary(repo, tr, targetphase, nodes):
   512 def retractboundary(repo, tr, targetphase, nodes):
   495     """Set nodes back to a phase changing other nodes phases if
   513     """Set nodes back to a phase changing other nodes phases if
   496     necessary.
   514     necessary.
   497 
   515