sequencer: comment checked-out branch properly

`git rebase --update-ref` does not insert commands for dependent/sub-
branches which are checked out.[1]  Instead it leaves a comment about
that fact.  The comment char is hardcoded (#).  In turn the comment
line gets interpreted as an invalid command when `core.commentChar`/
`core.commentString` is in use.

† 1: See 900b50c242 (rebase: add --update-refs option, 2022-07-19)

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Kristoffer Haugsbakk
2024-11-25 21:13:11 +01:00
committed by Junio C Hamano
parent fd3785337b
commit 94304b9f48
2 changed files with 22 additions and 2 deletions

View File

@ -6382,8 +6382,9 @@ static int add_decorations_to_list(const struct commit *commit,
/* If the branch is checked out, then leave a comment instead. */
if ((path = branch_checked_out(decoration->name))) {
item->command = TODO_COMMENT;
strbuf_addf(ctx->buf, "# Ref %s checked out at '%s'\n",
decoration->name, path);
strbuf_commented_addf(ctx->buf, comment_line_str,
"Ref %s checked out at '%s'\n",
decoration->name, path);
} else {
struct string_list_item *sti;
item->command = TODO_UPDATE_REF;

View File

@ -456,4 +456,23 @@ test_expect_success 'rebase when inside worktree subdirectory' '
)
'
test_expect_success 'git rebase --update-ref with core.commentChar and branch on worktree' '
test_when_finished git branch -D base topic2 &&
test_when_finished git checkout main &&
test_when_finished git branch -D wt-topic &&
test_when_finished git worktree remove wt-topic &&
git checkout main &&
git checkout -b base &&
git checkout -b topic2 &&
test_commit msg2 &&
git worktree add wt-topic &&
git checkout base &&
test_commit msg3 &&
git checkout topic2 &&
GIT_SEQUENCE_EDITOR="cat >actual" git -c core.commentChar=% \
rebase -i --update-refs base &&
test_grep "% Ref refs/heads/wt-topic checked out at" actual &&
test_grep "% Ref refs/heads/topic2 checked out at" actual
'
test_done