# HG changeset patch # User Durham Goode # Date 1428172628 25200 # Node ID cfb8f5e3ca497298d0ef62565955dcdb968c2d51 # Parent bdf84cc2115bbe4bed0cf87cf7da2576faef08b1 histedit: integrate action class into flow This takes the newly added histeditaction class and integrates it into the histedit run and bootstrapcontinue logic. No actions implement the class yet, but they will be add in upcoming patches. diff -r bdf84cc2115b -r cfb8f5e3ca49 hgext/histedit.py --- a/hgext/histedit.py Sat Apr 04 11:34:53 2015 -0700 +++ b/hgext/histedit.py Sat Apr 04 11:37:08 2015 -0700 @@ -157,6 +157,7 @@ except ImportError: import pickle import errno +import inspect import os import sys @@ -849,8 +850,12 @@ state.write() action, ha = state.rules.pop(0) ui.debug('histedit: processing %s %s\n' % (action, ha[:12])) - actfunc = actiontable[action] - parentctx, replacement_ = actfunc(ui, state, ha, opts) + act = actiontable[action] + if inspect.isclass(act): + actobj = act.fromrule(state, ha) + parentctx, replacement_ = actobj.run() + else: + parentctx, replacement_ = act(ui, state, ha, opts) state.parentctxnode = parentctx.node() state.replacements.extend(replacement_) state.write() @@ -905,61 +910,73 @@ def bootstrapcontinue(ui, state, opts): repo, parentctxnode = state.repo, state.parentctxnode - parentctx = repo[parentctxnode] action, currentnode = state.rules.pop(0) - ctx = repo[currentnode] - newchildren = gatherchildren(repo, parentctx) - - # Commit dirty working directory if necessary - new = None s = repo.status() - if s.modified or s.added or s.removed or s.deleted: - # prepare the message for the commit to comes - if action in ('f', 'fold', 'r', 'roll'): - message = 'fold-temp-revision %s' % currentnode[:12] - else: - message = ctx.description() - editopt = action in ('e', 'edit', 'm', 'mess') - canonaction = {'e': 'edit', 'm': 'mess', 'p': 'pick'} - editform = 'histedit.%s' % canonaction.get(action, action) - editor = cmdutil.getcommiteditor(edit=editopt, editform=editform) - commit = commitfuncfor(repo, ctx) - new = commit(text=message, user=ctx.user(), date=ctx.date(), - extra=ctx.extra(), editor=editor) - if new is not None: - newchildren.append(new) - replacements = [] - # track replacements - if ctx.node() not in newchildren: - # note: new children may be empty when the changeset is dropped. - # this happen e.g during conflicting pick where we revert content - # to parent. - replacements.append((ctx.node(), tuple(newchildren))) + + act = actiontable[action] + if inspect.isclass(act): + actobj = act.fromrule(state, currentnode) + if s.modified or s.added or s.removed or s.deleted: + actobj.continuedirty() + s = repo.status() + if s.modified or s.added or s.removed or s.deleted: + raise util.Abort(_("working copy still dirty")) - if action in ('f', 'fold', 'r', 'roll'): - if newchildren: - # finalize fold operation if applicable - if new is None: - new = newchildren[-1] + parentctx, replacements_ = actobj.continueclean() + replacements.extend(replacements_) + else: + parentctx = repo[parentctxnode] + ctx = repo[currentnode] + newchildren = gatherchildren(repo, parentctx) + # Commit dirty working directory if necessary + new = None + if s.modified or s.added or s.removed or s.deleted: + # prepare the message for the commit to comes + if action in ('f', 'fold', 'r', 'roll'): + message = 'fold-temp-revision %s' % currentnode[:12] else: - newchildren.pop() # remove new from internal changes - foldopts = opts - if action in ('r', 'roll'): - foldopts = foldopts.copy() - foldopts['rollup'] = True - parentctx, repl = finishfold(ui, repo, parentctx, ctx, new, - foldopts, newchildren) - replacements.extend(repl) - else: - # newchildren is empty if the fold did not result in any commit - # this happen when all folded change are discarded during the - # merge. - replacements.append((ctx.node(), (parentctx.node(),))) - elif newchildren: - # otherwise update "parentctx" before proceeding to further operation - parentctx = repo[newchildren[-1]] + message = ctx.description() + editopt = action in ('e', 'edit', 'm', 'mess') + canonaction = {'e': 'edit', 'm': 'mess', 'p': 'pick'} + editform = 'histedit.%s' % canonaction.get(action, action) + editor = cmdutil.getcommiteditor(edit=editopt, editform=editform) + commit = commitfuncfor(repo, ctx) + new = commit(text=message, user=ctx.user(), date=ctx.date(), + extra=ctx.extra(), editor=editor) + if new is not None: + newchildren.append(new) + + # track replacements + if ctx.node() not in newchildren: + # note: new children may be empty when the changeset is dropped. + # this happen e.g during conflicting pick where we revert content + # to parent. + replacements.append((ctx.node(), tuple(newchildren))) + + if action in ('f', 'fold', 'r', 'roll'): + if newchildren: + # finalize fold operation if applicable + if new is None: + new = newchildren[-1] + else: + newchildren.pop() # remove new from internal changes + foldopts = opts + if action in ('r', 'roll'): + foldopts = foldopts.copy() + foldopts['rollup'] = True + parentctx, repl = finishfold(ui, repo, parentctx, ctx, new, + foldopts, newchildren) + replacements.extend(repl) + else: + # newchildren is empty if the fold did not result in any commit + # this happen when all folded change are discarded during the + # merge. + replacements.append((ctx.node(), (parentctx.node(),))) + elif newchildren: + # otherwise update "parentctx" before proceeding further + parentctx = repo[newchildren[-1]] state.parentctxnode = parentctx.node() state.replacements.extend(replacements)