D12390: unamend: abort if commit was not created by `hg [un]amend`

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Mon Mar 21 22:23:11 UTC 2022


martinvonz created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  `hg unamend` can currently undo any kind of rewrite, as long as it has
  an obsmarker. However, that has quite unexpected results if you run it
  after e.g. `hg rebase` (expecting it to behave like a generic `hg
  undo` command), because it updates to the predecessor and leaves the
  old changes in the working copy. I think it's better to allow `hg
  unamend` only after `hg amend` (and after `hg unamend` because that's
  documented as being supported).

REPOSITORY
  rHG Mercurial

BRANCH
  stable

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

AFFECTED FILES
  hgext/uncommit.py
  tests/test-unamend.t

CHANGE DETAILS

diff --git a/tests/test-unamend.t b/tests/test-unamend.t
--- a/tests/test-unamend.t
+++ b/tests/test-unamend.t
@@ -39,8 +39,23 @@
 Trying to unamend when there was no amend done
 
   $ hg unamend
+  abort: working copy parent was not created by 'hg amend' or 'hg unamend'
+  [10]
+  $ echo "bar" >> h
+
+Trying to unamend when the obsmarker is missing
+
+  $ hg amend
+  $ hg debugobsolete --delete 0
+  deleted 1 obsolescence markers
+  $ hg unamend
   abort: changeset must have one predecessor, found 0 predecessors
   [10]
+  $ hg strip tip --config extensions.strip=
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  saved backup bundle to $TESTTMP/repo/.hg/strip-backup/c9fa1a715c1b-06e5c233-backup.hg
+  $ hg up tip
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
 Unamend on clean wdir and tip
 
diff --git a/hgext/uncommit.py b/hgext/uncommit.py
--- a/hgext/uncommit.py
+++ b/hgext/uncommit.py
@@ -276,6 +276,15 @@
         if len(curctx.parents()) > 1:
             raise error.InputError(_(b"cannot unamend merge changeset"))
 
+        expected_keys = (b'amend_source', b'unamend_source')
+        if not any(key in curctx.extra() for key in expected_keys):
+            raise error.InputError(
+                _(
+                    b"working copy parent was not created by 'hg amend' or "
+                    b"'hg unamend'"
+                )
+            )
+
         # identify the commit to which to unamend
         markers = list(predecessormarkers(curctx))
         if len(markers) != 1:



To: martinvonz, #hg-reviewers
Cc: mercurial-patches, mercurial-devel


More information about the Mercurial-devel mailing list