Commit b45b8c0a authored by Taapas Agrawal's avatar Taapas Agrawal
Browse files

abort: added logic for of hg abort

This is part of `GSoC19` project `Implement abort and
continue commands`. This patch is part of the `abort plan`.

This adds the basic logic for `hg abort`. This command
aborts an multistep operation like graft, histedit, rebase,
merge and unshelve if they are in an unfinished state.

The first part of the logic is determining the unfinished
operation from the state detection API under `statemod`.
This API is extended to support `hg abort` by adding a method
to register the abort logic as a function (here `abortfunc`).

Once the unfinished operation is determined the registered
logic is used to abort the command. The benefit of this kind
of framework is that any new extension developed can support
`hg abort` by registering the command and logic under
statedetection API.

`hg abort` currently supports `--dry-run/-n` flag only.
It is used to dry run `hg abort`

Further patches sequentially add support for `graft`, `rebase`,
`unshelve`, `histedit` and `merge`.

Differential Revision: https://phab.mercurial-scm.org/D6566
parent eb7bd7d64a9d
......@@ -131,6 +131,31 @@ debugrevlogopts = cmdutil.debugrevlogopts
# Commands start here, listed alphabetically
@command('abort',
dryrunopts, helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
helpbasic=True)
def abort(ui, repo, **opts):
"""abort an unfinished operation (EXPERIMENTAL)
Aborts a multistep operation like graft, histedit, rebase, merge,
and unshelve if they are in an unfinished state.
use --dry-run/-n to dry run the command.
A new operation can be added to this by registering the operation and
abort logic in the unfinishedstates list under statemod.
"""
dryrun = opts.get(r'dry_run')
abortstate = cmdutil.getunfinishedstate(repo)
if not abortstate:
raise error.Abort(_('no operation in progress'))
if not abortstate.abortfunc:
raise error.Abort((_("%s in progress but does not support 'hg abort'") %
(abortstate._opname)), hint=abortstate.hint())
if dryrun:
ui.status(_('%s in progress, will be aborted\n') % (abortstate._opname))
return
return abortstate.abortfunc(ui, repo)
@command('add',
walkopts + subrepoopts + dryrunopts,
_('[OPTION]... [FILE]...'),
......
......@@ -98,7 +98,8 @@ class _statecheck(object):
"""
def __init__(self, opname, fname, clearable, allowcommit, reportonly,
continueflag, stopflag, cmdmsg, cmdhint, statushint):
continueflag, stopflag, cmdmsg, cmdhint, statushint,
abortfunc):
self._opname = opname
self._fname = fname
self._clearable = clearable
......@@ -109,6 +110,7 @@ class _statecheck(object):
self._cmdmsg = cmdmsg
self._cmdhint = cmdhint
self._statushint = statushint
self.abortfunc = abortfunc
def statusmsg(self):
"""returns the hint message corresponding to the command for
......@@ -157,7 +159,7 @@ _unfinishedstates = []
def addunfinished(opname, fname, clearable=False, allowcommit=False,
reportonly=False, continueflag=False, stopflag=False,
cmdmsg="", cmdhint="", statushint=""):
cmdmsg="", cmdhint="", statushint="", abortfunc=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.
......@@ -181,10 +183,11 @@ def addunfinished(opname, fname, clearable=False, allowcommit=False,
statushint is used to pass a different status message in case standard
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.
"""
statecheckobj = _statecheck(opname, fname, clearable, allowcommit,
reportonly, continueflag, stopflag, cmdmsg,
cmdhint, statushint)
cmdhint, statushint, abortfunc)
if opname == 'merge':
_unfinishedstates.append(statecheckobj)
else:
......
......@@ -7,7 +7,7 @@ setup
> @command(b'crash', [], b'hg crash')
> def crash(ui, *args, **kwargs):
> raise Exception("oops")
> @command(b'abort', [], b'hg abort')
> @command(b'abortcmd', [], b'hg abortcmd')
> def abort(ui, *args, **kwargs):
> raise error.Abort(b"oops")
> EOF
......@@ -52,10 +52,10 @@ failure exit code
abort exit code
$ rm ./.hg/blackbox.log
$ hg abort 2> /dev/null
$ hg abortcmd 2> /dev/null
[255]
$ hg blackbox -l 2
1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000 (5000)> abort exited 255 after * seconds (glob)
1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000 (5000)> abortcmd exited 255 after * seconds (glob)
1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000 (5000)> blackbox -l 2
unhandled exception
......
Show all commands except debug commands
$ hg debugcomplete
abort
add
addremove
annotate
......@@ -59,6 +60,7 @@ Show all commands except debug commands
Show all commands that start with "a"
$ hg debugcomplete a
abort
add
addremove
annotate
......@@ -235,6 +237,7 @@ Show an error if we use --options with an ambiguous abbreviation
Show all commands + options
$ hg debugcommands
abort: dry-run
add: include, exclude, subrepos, dry-run
addremove: similarity, subrepos, include, exclude, dry-run
annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, skip, ignore-all-space, ignore-space-change, ignore-blank-lines, ignore-space-at-eol, include, exclude, template
......
......@@ -402,6 +402,7 @@ Test short command list with verbose option
basic commands:
abort abort an unfinished operation (EXPERIMENTAL)
add add the specified files on the next commit
annotate, blame
show changeset information by line for each file
......@@ -2352,6 +2353,13 @@ Dish up an empty repo; serve it cold.
<tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
<tr><td>
<a href="/help/abort">
abort
</a>
</td><td>
abort an unfinished operation (EXPERIMENTAL)
</td></tr>
<tr><td>
<a href="/help/add">
add
......
......@@ -1874,6 +1874,10 @@ help/ shows help topics
{
"earlycommands": [
{
"summary": "abort an unfinished operation (EXPERIMENTAL)",
"topic": "abort"
},
{
"summary": "add the specified files on the next commit",
"topic": "add"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment