It was reported via IRC that the exec lines are inserted in the wrong spots when using --rebase-merges. The reason is that we used a simple, incorrect implementation that happened to work as long as the generated todo list only contains pick, fixup and squash commands. Which is not the case with--rebase-merges. Fix this issue by using a correct implementation instead, that even takes into account merge commands in the --rebase-merges mode. Changes since v1: * Replaced the "look-ahead" design by a "keep looking" one: instead of having a nested loop that looks for the end of the fixup/squash chain, we continue the loop, delaying the insertion until we know where the fixup/squash chain ends, if any. Johannes Schindelin (2): t3430: demonstrate what -r, --autosquash & --exec should do rebase --exec: make it work with --rebase-merges sequencer.c | 42 +++++++++++++++++++++++++++++----------- t/t3430-rebase-merges.sh | 17 ++++++++++++++++ 2 files changed, 48 insertions(+), 11 deletions(-) base-commit: 1d89318c48d233d52f1db230cf622935ac3c69fa Published-As: https://github.com/gitgitgadget/git/releases/tags/pr-13%2Fdscho%2Frebase-merges-and-exec-commands-v3 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-13/dscho/rebase-merges-and-exec-commands-v3 Pull-Request: https://github.com/gitgitgadget/git/pull/13 Range-diff vs v2: 1: 1d82eb450 = 1: 1d82eb450 t3430: demonstrate what -r, --autosquash & --exec should do 2: 7ca441a89 ! 2: b436f67ba rebase --exec: make it work with --rebase-merges @@ -22,6 +22,11 @@ `pick` lines, skip any fixup/squash chains, and then insert the `exec` line. Lather, rinse, repeat. + Note: we take pains to insert *before* comment lines whenever possible, + as empty commits are represented by commented-out pick lines (and we + want to insert a preceding pick's exec line *before* such a line, not + afterward). + While at it, also add `exec` lines after `merge` commands, because they are similar in spirit to `pick` commands: they add new commits. @@ -81,9 +86,13 @@ + insert = i + 1; } - /* append final <commands> */ +- /* append final <commands> */ - strbuf_add(buf, commands, commands_len); -+ if (insert >= 0 || !offset) ++ /* insert or append final <commands> */ ++ if (insert >= 0 && insert < todo_list.nr) ++ strbuf_insert(buf, todo_list.items[insert].offset_in_buf + ++ offset, commands, commands_len); ++ else if (insert >= 0 || !offset) + strbuf_add(buf, commands, commands_len); i = write_message(buf->buf, buf->len, todo_file, 0); -- gitgitgadget