diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -1893,6 +1893,32 @@ return 0 return 1 +@command('continue', + dryrunopts, helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, + helpbasic=True) +def continuecmd(ui, repo, **opts): + """finishes an interrupted operation (EXPERIMENTAL) + + Finishes a multistep operation like graft, histedit, rebase, merge, + and unshelve if they are in an interrupted state. + + use --dry-run/-n to dry run the command. + A new operation can be added to this by registering the operation and + continue logic in the unfinishedstates list under statemod. + """ + dryrun = opts.get(r'dry_run') + contstate = cmdutil.getunfinishedstate(repo) + if not contstate: + raise error.Abort(_('no operation in progress')) + if not contstate.continuefunc: + raise error.Abort((_("%s in progress but does not support " + "'hg continue'") % (contstate._opname)), + hint=contstate.continuemsg()) + if dryrun: + ui.status(_('%s in progress, will be resumed\n') % (contstate._opname)) + return + return contstate.continuefunc(ui, repo) + @command('copy|cp', [('A', 'after', None, _('record a copy that has already occurred')), ('f', 'force', None, _('forcibly copy over an existing managed file')), diff --git a/mercurial/state.py b/mercurial/state.py --- a/mercurial/state.py +++ b/mercurial/state.py @@ -99,7 +99,7 @@ def __init__(self, opname, fname, clearable, allowcommit, reportonly, continueflag, stopflag, cmdmsg, cmdhint, statushint, - abortfunc): + abortfunc, continuefunc): self._opname = opname self._fname = fname self._clearable = clearable @@ -111,6 +111,7 @@ self._cmdhint = cmdhint self._statushint = statushint self.abortfunc = abortfunc + self.continuefunc = continuefunc def statusmsg(self): """returns the hint message corresponding to the command for @@ -159,7 +160,8 @@ def addunfinished(opname, fname, clearable=False, allowcommit=False, reportonly=False, continueflag=False, stopflag=False, - cmdmsg="", cmdhint="", statushint="", abortfunc=None): + cmdmsg="", cmdhint="", statushint="", abortfunc=None, + continuefunc=None): """this registers a new command or operation to unfinishedstates opname is the name the command or operation fname is the file name in which data should be stored in .hg directory. @@ -184,10 +186,12 @@ message of the format ('To continue: hg cmdname --continue' 'To abort: hg cmdname --abort') is not desired abortfunc stores the function required to abort an unfinished state. + continuefunc stores the function required to finish an interrupted + operation. """ statecheckobj = _statecheck(opname, fname, clearable, allowcommit, reportonly, continueflag, stopflag, cmdmsg, - cmdhint, statushint, abortfunc) + cmdhint, statushint, abortfunc, continuefunc) if opname == 'merge': _unfinishedstates.append(statecheckobj) else: