Patchwork D6607: merge: disallow merge abort in case of an unfinished operation(issue6160)

login
register
mail settings
Submitter phabricator
Date July 6, 2019, 8:11 a.m.
Message ID <differential-rev-PHID-DREV-taptzvp265spqilnsffn-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/40794/
State Superseded
Headers show

Comments

phabricator - July 6, 2019, 8:11 a.m.
taapas1128 created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This patch disallows `hg merge --abort` in case an operation of higher
  precedence i.e unshelve, rebase, histedit are in unfinished states.
  
  This is done so as to avoid partial abort of these operations in case
  merge abort is called at an interrupted step.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6607

AFFECTED FILES
  mercurial/commands.py
  tests/test-shelve2.t

CHANGE DETAILS




To: taapas1128, #hg-reviewers
Cc: mercurial-devel
phabricator - July 8, 2019, 3:21 p.m.
pulkit added inline comments.

INLINE COMMENTS

> commands.py:4017
> +    unfinishedstate = None
> +    for state in statemod._unfinishedstates:
> +        if state.isunfinished(repo):

We should first check `if abort` before performing this loop instead of checking later.

> commands.py:4019
> +        if state.isunfinished(repo):
> +            unfinishedstate = state
> +            if abort and unfinishedstate._opname != 'merge':

we don't need to create a new variable. We can operate on `state` below.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6607/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6607

To: taapas1128, #hg-reviewers
Cc: pulkit, mercurial-devel
phabricator - July 8, 2019, 3:49 p.m.
pulkit added inline comments.

INLINE COMMENTS

> commands.py:4019
>      if abort:
> +        for state in statemod._unfinishedstates:
> +            if state.isunfinished(repo) and state._opname != 'merge':

We are performing the same loop in https://phab.mercurial-scm.org/D6566. How about having a utility function which will return the unfinished state, something like `getunfinishedstate`

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6607/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6607

To: taapas1128, #hg-reviewers
Cc: pulkit, mercurial-devel
phabricator - July 8, 2019, 4:14 p.m.
taapas1128 added a comment.


  okay I will create that in `cmdutil.py`.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6607/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6607

To: taapas1128, #hg-reviewers
Cc: pulkit, mercurial-devel
phabricator - July 8, 2019, 9:48 p.m.
pulkit added a comment.


  Also, can you add an entry about this to relnotes/next?

INLINE COMMENTS

> commands.py:4020
> +        state = cmdutil.getunfinishedstate(repo)
> +        if state._opname != 'merge':
> +            raise error.Abort(_('cannot abort merge with %s in progress') %

state can be `None` here.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6607/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6607

To: taapas1128, #hg-reviewers
Cc: pulkit, mercurial-devel
phabricator - July 8, 2019, 10:02 p.m.
taapas1128 added a comment.
taapas1128 marked an inline comment as done.


  added the entry in relnotes.

INLINE COMMENTS

> pulkit wrote in commands.py:4020
> state can be `None` here.

My bad I really shouldn't have missed that.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6607/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6607

To: taapas1128, #hg-reviewers
Cc: pulkit, mercurial-devel
phabricator - Oct. 21, 2021, 8:04 a.m.
Herald added a subscriber: mercurial-patches.
ryancoop987 added a comment.


  This is the latest online this play euchre free <https://myeuchre.com> card game i am exited to all time see it

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6607/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6607

To: taapas1128, #hg-reviewers, pulkit
Cc: mercurial-patches, ryancoop987, pulkit, mercurial-devel

Patch

diff --git a/tests/test-shelve2.t b/tests/test-shelve2.t
--- a/tests/test-shelve2.t
+++ b/tests/test-shelve2.t
@@ -847,3 +847,38 @@ 
 #endif
 
   $ cd ..
+
+Block merge abort when unshelve in progress(issue6160)
+------------------------------------------------------
+
+  $ hg init a
+  $ cd a
+  $ echo foo > a ; hg commit -qAm "initial commit"
+  $ echo bar > a
+  $ hg shelve
+  shelved as default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo foobar > a
+  $ hg unshelve
+  unshelving change 'default'
+  temporarily committing pending changes (restore with 'hg unshelve --abort')
+  rebasing shelved changes
+  merging a
+  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
+  unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
+  [1]
+
+  $ hg log --template '{desc|firstline}  {author}  {date|isodate} \n' -r .
+  pending changes temporary commit  shelve@localhost  1970-01-01 00:00 +0000 
+  $ hg merge --abort
+  abort: cannot abort merge with unshelve in progress
+  (use 'hg unshelve --continue' or 'hg unshelve --abort')
+  [255]
+
+  $ hg unshelve --abort
+  unshelve of 'default' aborted
+
+  $ hg log -G --template '{desc|firstline}  {author}  {date|isodate} \n' -r .
+  @  initial commit  test  1970-01-01 00:00 +0000
+  
+  $ cd ..
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4013,6 +4013,14 @@ 
 
     opts = pycompat.byteskwargs(opts)
     abort = opts.get('abort')
+    unfinishedstate = None
+    for state in statemod._unfinishedstates:
+        if state.isunfinished(repo):
+            unfinishedstate = state
+            if abort and unfinishedstate._opname != 'merge':
+                raise error.Abort(_('cannot abort merge with %s in progress') %
+                                    (unfinishedstate._opname),
+                                    hint=unfinishedstate.hint())
     if abort and repo.dirstate.p2() == nullid:
         cmdutil.wrongtooltocontinue(repo, _('merge'))
     if abort: