[PATCH v3 0/2] Make git rebase work with --rebase-merges and --exec
- From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Aug 9, 2018, 09:41 UTC
- Message-ID
- <pull.13.v3.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.13.v2.git.gitgitgadget@gmail.com>
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