hgext/histedit.py
changeset 24765 bdf84cc2115b
parent 24764 4dcd55802237
child 24766 cfb8f5e3ca49
equal deleted inserted replaced
24764:4dcd55802237 24765:bdf84cc2115b
   301 
   301 
   302         return parentctxnode, rules, keep, topmost, replacements, backupfile
   302         return parentctxnode, rules, keep, topmost, replacements, backupfile
   303 
   303 
   304     def clear(self):
   304     def clear(self):
   305         self.repo.vfs.unlink('histedit-state')
   305         self.repo.vfs.unlink('histedit-state')
       
   306 
       
   307 class histeditaction(object):
       
   308     def __init__(self, state, node):
       
   309         self.state = state
       
   310         self.repo = state.repo
       
   311         self.node = node
       
   312 
       
   313     @classmethod
       
   314     def fromrule(cls, state, rule):
       
   315         """Parses the given rule, returning an instance of the histeditaction.
       
   316         """
       
   317         repo = state.repo
       
   318         rulehash = rule.strip().split(' ', 1)[0]
       
   319         try:
       
   320             node = repo[rulehash].node()
       
   321         except error.RepoError:
       
   322             raise util.Abort(_('unknown changeset %s listed') % rulehash[:12])
       
   323         return cls(state, node)
       
   324 
       
   325     def run(self):
       
   326         """Runs the action. The default behavior is simply apply the action's
       
   327         rulectx onto the current parentctx."""
       
   328         self.applychange()
       
   329         self.continuedirty()
       
   330         return self.continueclean()
       
   331 
       
   332     def applychange(self):
       
   333         """Applies the changes from this action's rulectx onto the current
       
   334         parentctx, but does not commit them."""
       
   335         repo = self.repo
       
   336         rulectx = repo[self.node]
       
   337         hg.update(repo, self.state.parentctxnode)
       
   338         stats = applychanges(repo.ui, repo, rulectx, {})
       
   339         if stats and stats[3] > 0:
       
   340             raise error.InterventionRequired(_('Fix up the change and run '
       
   341                                             'hg histedit --continue'))
       
   342 
       
   343     def continuedirty(self):
       
   344         """Continues the action when changes have been applied to the working
       
   345         copy. The default behavior is to commit the dirty changes."""
       
   346         repo = self.repo
       
   347         rulectx = repo[self.node]
       
   348 
       
   349         editor = self.commiteditor()
       
   350         commit = commitfuncfor(repo, rulectx)
       
   351 
       
   352         commit(text=rulectx.description(), user=rulectx.user(),
       
   353                date=rulectx.date(), extra=rulectx.extra(), editor=editor)
       
   354 
       
   355     def commiteditor(self):
       
   356         """The editor to be used to edit the commit message."""
       
   357         return False
       
   358 
       
   359     def continueclean(self):
       
   360         """Continues the action when the working copy is clean. The default
       
   361         behavior is to accept the current commit as the new version of the
       
   362         rulectx."""
       
   363         ctx = self.repo['.']
       
   364         if ctx.node() == self.state.parentctxnode:
       
   365             self.repo.ui.warn(_('%s: empty changeset\n') %
       
   366                               node.short(self.node))
       
   367             return ctx, [(self.node, tuple())]
       
   368         if ctx.node() == self.node:
       
   369             # Nothing changed
       
   370             return ctx, []
       
   371         return ctx, [(self.node, (ctx.node(),))]
   306 
   372 
   307 def commitfuncfor(repo, src):
   373 def commitfuncfor(repo, src):
   308     """Build a commit function for the replacement of <src>
   374     """Build a commit function for the replacement of <src>
   309 
   375 
   310     This function ensure we apply the same treatment to all changesets.
   376     This function ensure we apply the same treatment to all changesets.