Skip to content

Commit d345ced

Browse files
committed
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"
2 parents 0f6e503 + 92b7c7c commit d345ced

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

builtin/commit.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,10 @@ static void adjust_comment_line_char(const struct strbuf *sb)
688688
char candidates[] = "#;@!$%^&|:";
689689
char *candidate;
690690
const char *p;
691+
size_t cutoff;
692+
693+
/* Ignore comment chars in trailing comments (e.g., Conflicts:) */
694+
cutoff = sb->len - ignored_log_message_bytes(sb->buf, sb->len);
691695

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

config.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,9 +1534,11 @@ static int git_default_core_config(const char *var, const char *value,
15341534
!strcmp(var, "core.commentstring")) {
15351535
if (!value)
15361536
return config_error_nonbool(var);
1537-
else if (!strcasecmp(value, "auto"))
1537+
else if (!strcasecmp(value, "auto")) {
15381538
auto_comment_line_char = 1;
1539-
else if (value[0]) {
1539+
FREE_AND_NULL(comment_line_str_to_free);
1540+
comment_line_str = "#";
1541+
} else if (value[0]) {
15401542
if (strchr(value, '\n'))
15411543
return error(_("%s cannot contain newline"), var);
15421544
comment_line_str = value;

t/t3418-rebase-continue.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,19 @@ test_expect_success 'there is no --no-reschedule-failed-exec in an ongoing rebas
328328
test_expect_code 129 git rebase --edit-todo --no-reschedule-failed-exec
329329
'
330330

331+
test_expect_success 'no change in comment character due to conflicts markers with core.commentChar=auto' '
332+
git checkout -b branch-a &&
333+
test_commit A F1 &&
334+
git checkout -b branch-b HEAD^ &&
335+
test_commit B F1 &&
336+
test_must_fail git rebase branch-a &&
337+
printf "B\nA\n" >F1 &&
338+
git add F1 &&
339+
GIT_EDITOR="cat >actual" git -c core.commentChar=auto rebase --continue &&
340+
# Check that "#" is still the comment character.
341+
test_grep "^# Changes to be committed" actual
342+
'
343+
331344
test_orig_head_helper () {
332345
test_when_finished 'git rebase --abort &&
333346
git checkout topic &&

0 commit comments

Comments
 (0)