# HG changeset patch # User Anton Shestakov # Date 1562835848 -28800 # Node ID 7839720c7c75376dc0f8a4ec971f75a298790b83 # Parent b69497b23d31fd6e2960c0708b74ef92301e018e rewind: make sure merge commits include files from p1 and p2 Otherwise rewinding a merge commit makes it lose all changes. This fix populates `updates` argument of rewriteutil.rewrite() with parent changesets. That argument is normally used for folding multiple changesets, but in this case it's simply used to include files from p1 and p2. Usually, rewrite() works fine using ctx.files(), but that function can return an empty list when ctx is a merge commit. diff -r b69497b23d31 -r 7839720c7c75 CHANGELOG --- a/CHANGELOG Wed Jul 10 18:16:38 2019 +0800 +++ b/CHANGELOG Thu Jul 11 17:04:08 2019 +0800 @@ -9,6 +9,7 @@ * evolve: improve `hg evolve --all` behavior when "." is obsolete * topic: fix confusion in branch heads checking logic * touch: now works on merge commit too + * rewind: fix behavior for merge commit 9.0.1 - in progress ------------------- diff -r b69497b23d31 -r 7839720c7c75 hgext3rd/evolve/rewind.py --- a/hgext3rd/evolve/rewind.py Wed Jul 10 18:16:38 2019 +0800 +++ b/hgext3rd/evolve/rewind.py Thu Jul 11 17:04:08 2019 +0800 @@ -166,9 +166,12 @@ p2 = ctx.p2().node() p2 = rewindmap.get(p2, p2) + updates = [] + if len(ctx.parents()) > 1: + updates = ctx.parents() extradict = {'extra': extra} - new, unusedvariable = rewriteutil.rewrite(unfi, ctx, [], ctx, + new, unusedvariable = rewriteutil.rewrite(unfi, ctx, updates, ctx, [p1, p2], commitopts=extradict) diff -r b69497b23d31 -r 7839720c7c75 tests/test-rewind.t --- a/tests/test-rewind.t Wed Jul 10 18:16:38 2019 +0800 +++ b/tests/test-rewind.t Thu Jul 11 17:04:08 2019 +0800 @@ -9,6 +9,8 @@ > interactive = true > [phases] > publish=False + > [alias] + > glf = log -GT "{rev}: {desc} ({files})" > [extensions] > evolve = > EOF @@ -938,3 +940,45 @@ $ hg rewind abort: uncommitted changes [255] + +Merge commits +------------- + + $ hg up --clean .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo foo > foo + $ hg ci -qAm foo + + $ hg merge + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m merge + $ hg st --change . + A B + + $ echo bar > foo + $ hg amend -m 'merge, but foo is now bar' + $ hg st --change . + M foo + A B + + $ hg rewind --from . + rewinded to 1 changesets + (1 changesets obsoleted) + working directory is now at 006fd8c2fed9 + $ hg st --change . + A B + + $ hg glf -r '. + allpredecessors(.) + parents(.)' --hidden + @ 6: merge () + |\ + +---x 5: merge, but foo is now bar (foo) + | |/ + +---x 4: merge () + | |/ + | o 3: foo (C foo) + | | + | ~ + o 2: c_B0 (B) + | + ~