hgext/histedit.py
changeset 24774 a9d63d87b837
parent 24773 090da03361c5
child 24810 f5416657e661
equal deleted inserted replaced
24773:090da03361c5 24774:a9d63d87b837
   155     import cPickle as pickle
   155     import cPickle as pickle
   156     pickle.dump # import now
   156     pickle.dump # import now
   157 except ImportError:
   157 except ImportError:
   158     import pickle
   158     import pickle
   159 import errno
   159 import errno
   160 import inspect
       
   161 import os
   160 import os
   162 import sys
   161 import sys
   163 
   162 
   164 from mercurial import cmdutil
   163 from mercurial import cmdutil
   165 from mercurial import discovery
   164 from mercurial import discovery
   842 
   841 
   843     while state.rules:
   842     while state.rules:
   844         state.write()
   843         state.write()
   845         action, ha = state.rules.pop(0)
   844         action, ha = state.rules.pop(0)
   846         ui.debug('histedit: processing %s %s\n' % (action, ha[:12]))
   845         ui.debug('histedit: processing %s %s\n' % (action, ha[:12]))
   847         act = actiontable[action]
   846         actobj = actiontable[action].fromrule(state, ha)
   848         if inspect.isclass(act):
   847         parentctx, replacement_ = actobj.run()
   849             actobj = act.fromrule(state, ha)
       
   850             parentctx, replacement_ = actobj.run()
       
   851         else:
       
   852             parentctx, replacement_ = act(ui, state, ha, opts)
       
   853         state.parentctxnode = parentctx.node()
   848         state.parentctxnode = parentctx.node()
   854         state.replacements.extend(replacement_)
   849         state.replacements.extend(replacement_)
   855     state.write()
   850     state.write()
   856 
   851 
   857     hg.update(repo, state.parentctxnode)
   852     hg.update(repo, state.parentctxnode)
   888     cleanupnode(ui, repo, 'temp', tmpnodes)
   883     cleanupnode(ui, repo, 'temp', tmpnodes)
   889     state.clear()
   884     state.clear()
   890     if os.path.exists(repo.sjoin('undo')):
   885     if os.path.exists(repo.sjoin('undo')):
   891         os.unlink(repo.sjoin('undo'))
   886         os.unlink(repo.sjoin('undo'))
   892 
   887 
   893 def gatherchildren(repo, ctx):
       
   894     # is there any new commit between the expected parent and "."
       
   895     #
       
   896     # note: does not take non linear new change in account (but previous
       
   897     #       implementation didn't used them anyway (issue3655)
       
   898     newchildren = [c.node() for c in repo.set('(%d::.)', ctx)]
       
   899     if ctx.node() != node.nullid:
       
   900         if not newchildren:
       
   901             return []
       
   902         newchildren.pop(0)  # remove ctx
       
   903     return newchildren
       
   904 
       
   905 def bootstrapcontinue(ui, state, opts):
   888 def bootstrapcontinue(ui, state, opts):
   906     repo, parentctxnode = state.repo, state.parentctxnode
   889     repo = state.repo
   907     action, currentnode = state.rules.pop(0)
   890     action, currentnode = state.rules.pop(0)
   908 
   891 
       
   892     actobj = actiontable[action].fromrule(state, currentnode)
       
   893 
   909     s = repo.status()
   894     s = repo.status()
   910     replacements = []
   895     if s.modified or s.added or s.removed or s.deleted:
   911 
   896         actobj.continuedirty()
   912     act = actiontable[action]
   897         s = repo.status()
   913     if inspect.isclass(act):
       
   914         actobj = act.fromrule(state, currentnode)
       
   915         if s.modified or s.added or s.removed or s.deleted:
   898         if s.modified or s.added or s.removed or s.deleted:
   916             actobj.continuedirty()
   899             raise util.Abort(_("working copy still dirty"))
   917             s = repo.status()
   900 
   918             if s.modified or s.added or s.removed or s.deleted:
   901     parentctx, replacements = actobj.continueclean()
   919                 raise util.Abort(_("working copy still dirty"))
       
   920 
       
   921         parentctx, replacements_ = actobj.continueclean()
       
   922         replacements.extend(replacements_)
       
   923     else:
       
   924         parentctx = repo[parentctxnode]
       
   925         ctx = repo[currentnode]
       
   926         newchildren = gatherchildren(repo, parentctx)
       
   927         # Commit dirty working directory if necessary
       
   928         new = None
       
   929         if s.modified or s.added or s.removed or s.deleted:
       
   930             # prepare the message for the commit to comes
       
   931             message = ctx.description()
       
   932             editor = cmdutil.getcommiteditor()
       
   933             commit = commitfuncfor(repo, ctx)
       
   934             new = commit(text=message, user=ctx.user(), date=ctx.date(),
       
   935                          extra=ctx.extra(), editor=editor)
       
   936             if new is not None:
       
   937                 newchildren.append(new)
       
   938 
       
   939         # track replacements
       
   940         if ctx.node() not in newchildren:
       
   941             # note: new children may be empty when the changeset is dropped.
       
   942             # this happen e.g during conflicting pick where we revert content
       
   943             # to parent.
       
   944             replacements.append((ctx.node(), tuple(newchildren)))
       
   945 
       
   946         if newchildren:
       
   947             # otherwise update "parentctx" before proceeding further
       
   948             parentctx = repo[newchildren[-1]]
       
   949 
   902 
   950     state.parentctxnode = parentctx.node()
   903     state.parentctxnode = parentctx.node()
   951     state.replacements.extend(replacements)
   904     state.replacements.extend(replacements)
   952 
   905 
   953     return state
   906     return state