Merge branch 'ac/auto-comment-char-fix'

"git commit" that concludes a conflicted merge failed to notice and remove
existing comment added automatically (like "# Conflicts:") when the
core.commentstring is set to 'auto'.

* ac/auto-comment-char-fix:
  config: set comment_line_str to "#" when core.commentChar=auto
  commit: avoid scanning trailing comments when 'core.commentChar' is "auto"
maint
Junio C Hamano 2025-07-28 12:02:34 -07:00
commit d345ceda32
3 changed files with 22 additions and 3 deletions

View File

@ -688,6 +688,10 @@ static void adjust_comment_line_char(const struct strbuf *sb)
char candidates[] = "#;@!$%^&|:";
char *candidate;
const char *p;
size_t cutoff;

/* Ignore comment chars in trailing comments (e.g., Conflicts:) */
cutoff = sb->len - ignored_log_message_bytes(sb->buf, sb->len);

if (!memchr(sb->buf, candidates[0], sb->len)) {
free(comment_line_str_to_free);
@ -700,7 +704,7 @@ static void adjust_comment_line_char(const struct strbuf *sb)
candidate = strchr(candidates, *p);
if (candidate)
*candidate = ' ';
for (p = sb->buf; *p; p++) {
for (p = sb->buf; p + 1 < sb->buf + cutoff; p++) {
if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
candidate = strchr(candidates, p[1]);
if (candidate)

View File

@ -1534,9 +1534,11 @@ static int git_default_core_config(const char *var, const char *value,
!strcmp(var, "core.commentstring")) {
if (!value)
return config_error_nonbool(var);
else if (!strcasecmp(value, "auto"))
else if (!strcasecmp(value, "auto")) {
auto_comment_line_char = 1;
else if (value[0]) {
FREE_AND_NULL(comment_line_str_to_free);
comment_line_str = "#";
} else if (value[0]) {
if (strchr(value, '\n'))
return error(_("%s cannot contain newline"), var);
comment_line_str = value;

View File

@ -328,6 +328,19 @@ test_expect_success 'there is no --no-reschedule-failed-exec in an ongoing rebas
test_expect_code 129 git rebase --edit-todo --no-reschedule-failed-exec
'

test_expect_success 'no change in comment character due to conflicts markers with core.commentChar=auto' '
git checkout -b branch-a &&
test_commit A F1 &&
git checkout -b branch-b HEAD^ &&
test_commit B F1 &&
test_must_fail git rebase branch-a &&
printf "B\nA\n" >F1 &&
git add F1 &&
GIT_EDITOR="cat >actual" git -c core.commentChar=auto rebase --continue &&
# Check that "#" is still the comment character.
test_grep "^# Changes to be committed" actual
'

test_orig_head_helper () {
test_when_finished 'git rebase --abort &&
git checkout topic &&