[PATCH] amend: support amending merge changesets (issue3778)
Idan Kamara
idankk86 at gmail.com
Fri Feb 8 15:31:49 CST 2013
On Fri, Feb 8, 2013 at 11:14 PM, Brodie Rao <brodie at sf.io> wrote:
>
> # HG changeset patch
> # User Brodie Rao <brodie at sf.io>
> # Date 1360357714 0
> # Node ID ac4b064dde742fbdeaea4818569ca3d134ed92bf
> # Parent 2fefd1170bf269e26bb304553009f38e0117c342
> amend: support amending merge changesets (issue3778)
I haven't looked in depth at the tests you added (seems
like you're not testing conflicts?) but I'm surprised it works
with so little and trivial code added.
I recall Matt saying this is going to be quite tricky to get
right (I also believe I tried to do something close
to what you did here and saw it misbehave sometimes,
but I can't remember where exactly right now).
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -1644,7 +1644,13 @@ def amend(ui, repo, commitfunc, old, ext
> # Also update it from the intermediate commit or from the
> wctx
> extra.update(ctx.extra())
>
> - files = set(old.files())
> + if len(old.parents()) > 1:
> + # ctx.files() isn't reliable for merges, so fall back to
> the
> + # slower repo.status() method
> + files = set([fn for st in repo.status(base, old)[:3]
> + for fn in st])
> + else:
> + files = set(old.files())
>
> # Second, we use either the commit we just did, or if there
> were no
> # changes the parent of the working directory as the version
> of the
> @@ -1709,7 +1715,7 @@ def amend(ui, repo, commitfunc, old, ext
> extra['amend_source'] = old.hex()
>
> new = context.memctx(repo,
> - parents=[base.node(), nullid],
> + parents=[base.node(), old.p2().node()],
> text=message,
> files=files,
> filectxfn=filectxfn,
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -1301,8 +1301,6 @@ def commit(ui, repo, *pats, **opts):
> old = repo['.']
> if old.phase() == phases.public:
> raise util.Abort(_('cannot amend public changesets'))
> - if len(old.parents()) > 1:
> - raise util.Abort(_('cannot amend merge changesets'))
> if len(repo[None].parents()) > 1:
> raise util.Abort(_('cannot amend while merging'))
> if (not obsolete._enabled) and old.children():
> diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t
> --- a/tests/test-commit-amend.t
> +++ b/tests/test-commit-amend.t
> @@ -304,7 +304,7 @@ Same thing, different code path:
> $ hg branches
> default 2:ce12b0b57d46
>
> -Refuse to amend merges:
> +Refuse to amend during a merge:
>
> $ hg up -q default
> $ hg merge foo
> @@ -314,9 +314,6 @@ Refuse to amend merges:
> abort: cannot amend while merging
> [255]
> $ hg ci -m 'merge'
> - $ hg ci --amend
> - abort: cannot amend merge changesets
> - [255]
>
> Follow copies/renames:
>
> @@ -518,3 +515,145 @@ Test that rewriting leaving instability
> date: Thu Jan 01 00:00:00 1970 +0000
> summary: babar
>
> +
> +Amend a merge changeset (with renames from the second parent):
> +
> + $ hg up default
> + 2 files updated, 0 files merged, 4 files removed, 0 files unresolved
> + $ hg branch bar
> + marked working directory as branch bar
> + (branches are permanent and global, did you want a bookmark?)
> + $ hg cp a aa
> + $ hg mv z zz
> + $ echo cc > cc
> + $ hg add cc
> + $ hg ci -m aazzcc
> + $ hg up default
> + 1 files updated, 0 files merged, 3 files removed, 0 files unresolved
> + $ echo a >> a
> + $ hg ci -m aa
> + $ hg merge bar
> + merging a and aa to aa
> + 2 files updated, 1 files merged, 1 files removed, 0 files unresolved
> + (branch merge, don't forget to commit)
> + $ hg ci -m 'merge bar'
> + $ hg log --debug -r .
> + changeset: 23:328607007cf9443df8344c585b87af07e0625c8b
> + tag: tip
> + phase: draft
> + parent: 22:ab15c66e8f33a801daae0714088a7b7af1467c34
> + parent: 21:1aa437659d19aecddc045900b54c8a525b2c11cd
> + manifest: 20:24810812512c7ae79bd8f6cd3be3d4b762400314
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + files+: aa cc zz
> + files-: z
> + extra: branch=default
> + description:
> + merge bar
> +
> +
> + $ hg debugrename aa
> + aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
> + $ hg debugrename zz
> + zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
> + $ hg debugrename cc
> + cc not renamed
> + $ hg ci --amend -m 'merge bar (amend message)'
> + $ hg log --debug -r .
> + changeset: 24:499c685c2f5e0bc60baff5804b3971fd8716e412
> + tag: tip
> + phase: draft
> + parent: 22:ab15c66e8f33a801daae0714088a7b7af1467c34
> + parent: 21:1aa437659d19aecddc045900b54c8a525b2c11cd
> + manifest: 20:24810812512c7ae79bd8f6cd3be3d4b762400314
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + files+: aa cc zz
> + files-: z
> + extra: amend_source=328607007cf9443df8344c585b87af07e0625c8b
> + extra: branch=default
> + description:
> + merge bar (amend message)
> +
> +
> + $ hg debugrename aa
> + aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
> + $ hg debugrename zz
> + zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
> + $ hg debugrename cc
> + cc not renamed
> + $ hg mv zz z
> + $ hg ci --amend -m 'merge bar (undo rename)'
> + $ hg log --debug -r .
> + changeset: 26:dc515e583c85f92ca06c2e284ca18bff869df5a8
> + tag: tip
> + phase: draft
> + parent: 22:ab15c66e8f33a801daae0714088a7b7af1467c34
> + parent: 21:1aa437659d19aecddc045900b54c8a525b2c11cd
> + manifest: 22:e84b4fcd7a8b9d3f0d9bacd3b7aedbd18b0dd56e
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + files+: aa cc
> + extra: amend_source=499c685c2f5e0bc60baff5804b3971fd8716e412
> + extra: branch=default
> + description:
> + merge bar (undo rename)
> +
> +
> + $ hg debugrename z
> + z not renamed
> +
> +Amend a merge changeset (with renames during the merge):
> +
> + $ hg up bar
> + 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + $ echo x > x
> + $ hg add x
> + $ hg ci -m x
> + $ hg up default
> + 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
> + $ hg merge bar
> + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> + (branch merge, don't forget to commit)
> + $ hg mv aa aaa
> + $ hg ci -m 'merge bar again'
> + $ hg log --debug -r .
> + changeset: 28:805630024adb77fbc52d0d49352e3ac0cf61e999
> + tag: tip
> + phase: draft
> + parent: 26:dc515e583c85f92ca06c2e284ca18bff869df5a8
> + parent: 27:4c94d5bc65f5ec1700417b11a74e5bce2737ac38
> + manifest: 24:c39fb616a5250433f226d0079a413d345158c644
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + files+: aaa x
> + files-: aa
> + extra: branch=default
> + description:
> + merge bar again
> +
> +
> + $ hg debugrename aaa
> + aaa renamed from aa:37d9b5d994eab34eda9c16b195ace52c7b129980
> + $ hg ci --amend -m 'merge bar again (amend message)'
> + $ hg mv aaa aa
> + $ hg ci --amend -m 'merge bar again (undo rename)'
> + $ hg log --debug -r .
> + changeset: 31:bdb0e875df5a657ff24e3fadcacd6727d3f8005f
> + tag: tip
> + phase: draft
> + parent: 26:dc515e583c85f92ca06c2e284ca18bff869df5a8
> + parent: 27:4c94d5bc65f5ec1700417b11a74e5bce2737ac38
> + manifest: 26:099ae0f86f993a0c00e3663366bf3f5dfb8cfe86
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + files+: x
> + extra: amend_source=4314c852235cea166cae0c6bc93f9cb0e3d7744d
> + extra: branch=default
> + description:
> + merge bar again (undo rename)
> +
> +
> + $ hg debugrename aa
> + aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20130208/c98478c9/attachment.html>
More information about the Mercurial-devel
mailing list