# HG changeset patch # User Anton Shestakov # Date 1563013354 -28800 # Node ID 77bf84025dd5b582c5373fae8c9931fad30d6d23 # Parent 41885988921e03a60f22f28b2bddb30e43f43f90 metaedit: allow operations on merge commits with some conditions As with fold (see the previous patch), it's allowed to metaedit a merge commit or a set of commits including merge commits (with --fold) as long as there are less than 2 parents of the set not included in the said set. diff -r 41885988921e -r 77bf84025dd5 CHANGELOG --- a/CHANGELOG Thu Jul 11 18:07:03 2019 +0800 +++ b/CHANGELOG Sat Jul 13 18:22:34 2019 +0800 @@ -11,6 +11,7 @@ * touch: now works on merge commit too * rewind: fix behavior for merge commit * fold: allow fold with merge commit + * metaedit: now also operates on merge commit 9.0.1 - in progress ------------------- diff -r 41885988921e -r 77bf84025dd5 hgext3rd/evolve/cmdrewrite.py --- a/hgext3rd/evolve/cmdrewrite.py Thu Jul 11 18:07:03 2019 +0800 +++ b/hgext3rd/evolve/cmdrewrite.py Sat Jul 13 18:22:34 2019 +0800 @@ -889,6 +889,7 @@ hint %= repo[newunstable.first()] raise error.Abort(msg, hint=hint) root = head = repo[revs.first()] + p2 = root.p2() wctx = repo[None] p1 = wctx.p1() @@ -911,12 +912,15 @@ commitopts['message'] = "\n".join(msgs) commitopts['edit'] = True + updates = allctx[:] + if p2 is not None and (root.p2() != p2 or not opts['fold']): + updates.append(p2) # TODO: if the author and message are the same, don't create a new # hash. Right now we create a new hash because the date can be # different. - newid, created = rewriteutil.rewrite(repo, root, allctx, head, + newid, created = rewriteutil.rewrite(repo, root, updates, head, [root.p1().node(), - root.p2().node()], + p2.node()], commitopts=commitopts) if created: if p1.rev() in revs: diff -r 41885988921e -r 77bf84025dd5 tests/test-metaedit.t --- a/tests/test-metaedit.t Thu Jul 11 18:07:03 2019 +0800 +++ b/tests/test-metaedit.t Sat Jul 13 18:22:34 2019 +0800 @@ -10,6 +10,7 @@ > publish = False > [alias] > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n' + > gluf = log -GT "{rev}: {desc|firstline} - {author|user} ({files})" > [diff] > git = 1 > unified = 0 @@ -229,3 +230,54 @@ 1 changesets folded $ hg log -r "tip" --template '{rev}: {author}\n' 12: foobar3 + +working on merge commits too + + $ hg up -q 11 + $ hg merge -q 12 + $ hg ci -m 'merge commit' + $ hg st --change . + A D + $ hg metaedit --user someone-else + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg st --change . + A D + $ hg gluf + @ 14: merge commit - someone-else () + |\ + | o 12: D2 - foobar3 (D) + | | + o | 11: E - foobar2 (E F) + |/ + o 3: C - test (C) + | + | o 2: B - test (B) + |/ + o 1: A - test (A) + | + o 0: ROOT - test (ROOT) + + $ hg metaedit --user mr-squasher -r 3:14 --fold --message squashed + 4 changesets folded + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg st --change . + A C + A D + A E + A F + $ hg gluf + @ 15: squashed - mr-squasher (C D E F) + | + | o 2: B - test (B) + |/ + o 1: A - test (A) + | + o 0: ROOT - test (ROOT) + + $ hg files + A + C + D + E + F + ROOT