amend: allow amend of non-head when obsolete is enabled

Obsolescence marker can represent this situation just fine. The old
version is marked as precursor of the new changeset. All its
descendants become "unstable".

If obsolescence is not enabled we keep the current behavior of
aborting. This new behavior only applies when obsolete is
enabled and is subject to future discussion and changes.
This commit is contained in:
Pierre-Yves David 2012-12-31 17:44:18 -06:00
parent 1c9929a557
commit bc7f0f7ffa
2 changed files with 21 additions and 1 deletions

View File

@ -1296,7 +1296,7 @@ def commit(ui, repo, *pats, **opts):
raise util.Abort(_('cannot amend merge changesets'))
if len(repo[None].parents()) > 1:
raise util.Abort(_('cannot amend while merging'))
if old.children():
if (not obsolete._enabled) and old.children():
raise util.Abort(_('cannot amend changeset with children'))
e = cmdutil.commiteditor

View File

@ -458,3 +458,23 @@ Test that amend does not make it easy to create obsoletescence cycle
$ hg commit --amend
$ hg id
b99e5df575f7 (a) tip
Test ui.prevent-unstable
---------------------------------------------------------------------
$ hg up '.^'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo 'b' >> a
$ hg log --style compact -r 'children(.)'
18[tip]:11 b99e5df575f7 1970-01-01 00:00 +0000 test
babar
$ hg commit --amend
$ hg log -r 'unstable()'
changeset: 18:b99e5df575f7
branch: a
parent: 11:3334b7925910
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: babar