sequencer: comment commit messages properly

The rebase todo editor has commands like `fixup -c` which affects the commit messages of the rebased commits.[1] For example: pick hash1 <msg> fixup hash2 <msg> fixup -c hash3 <msg> This says that hash2 and hash3 should be squashed into hash1 and that hash3’s commit message should be used for the resulting commit. So the user is presented with an editor where the two first commit messages are commented out and the third is not. However this does not work if `core.commentChar`/`core.commentString` is in use since the comment char is hardcoded (#) in this `sequencer.c` function. As a result the first commit message will not be commented out. † 1: See 9e3cebd97cb (rebase -i: add fixup [-C | -c] command, 2021-01-29) Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Co-authored-by: Phillip Wood <phillip.wood@dunelm.org.uk> Reported-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Kristoffer Haugsbakk committed Nov 25, 2024 at 21:13 UTC 7e2f377b03b0d3593df73a094f97c27b219b02f5
2 files changed +23 -4
sequencer.c
+8 -4
@@ -1941,10 +1941,10 @@ static int seen_squash(struct replay_ctx *ctx)
1941
1942 static void update_comment_bufs(struct strbuf *buf1, struct strbuf *buf2, int n)
1943 {
1944 - strbuf_setlen(buf1, 2);
1944 + strbuf_setlen(buf1, strlen(comment_line_str) + 1);
1945 strbuf_addf(buf1, _(nth_commit_msg_fmt), n);
1946 strbuf_addch(buf1, '\n');
1947 - strbuf_setlen(buf2, 2);
1947 + strbuf_setlen(buf2, strlen(comment_line_str) + 1);
1948 strbuf_addf(buf2, _(skip_nth_commit_msg_fmt), n);
1949 strbuf_addch(buf2, '\n');
1950 }
@@ -1963,8 +1963,12 @@ static void update_squash_message_for_fixup(struct strbuf *msg)
1963 size_t orig_msg_len;
1964 int i = 1;
1965
1966 - strbuf_addf(&buf1, "# %s\n", _(first_commit_msg_str));
1967 - strbuf_addf(&buf2, "# %s\n", _(skip_first_commit_msg_str));
1966 + strbuf_add_commented_lines(&buf1, _(first_commit_msg_str),
1967 + strlen(_(first_commit_msg_str)),
1968 + comment_line_str);
1969 + strbuf_add_commented_lines(&buf2, _(skip_first_commit_msg_str),
1970 + strlen(_(skip_first_commit_msg_str)),
1971 + comment_line_str);
1972 s = start = orig_msg = strbuf_detach(msg, &orig_msg_len);
1973 while (s) {
1974 const char *next;
t/t3437-rebase-fixup-options.sh
+15
@@ -127,6 +127,21 @@ test_expect_success 'fixup -C with conflicts gives correct message' '
127 test_cmp expected-author actual-author
128 '
129
130 +test_expect_success 'conflicting fixup -C after fixup with custom comment string' '
131 + test_config core.commentString COMMENT &&
132 + test_when_finished "test_might_fail git rebase --abort" &&
133 + git checkout --detach A3 &&
134 + test_must_fail env FAKE_LINES="1 fixup 2 fixup_-C 4" git rebase -i A &&
135 + echo resolved >A &&
136 + git add A &&
137 + FAKE_COMMIT_AMEND=edited git rebase --continue &&
138 + test_commit_message HEAD <<-\EOF
139 + A3
140 +
141 + edited
142 + EOF
143 +'
144 +
145 test_expect_success 'skipping fixup -C after fixup gives correct message' '
146 test_when_finished "test_might_fail git rebase --abort" &&
147 git checkout --detach A3 &&