git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ayush Chandekar <ayu.chandekar@gmail.com>
To: ayu.chandekar@gmail.com
Cc: christian.couder@gmail.com, git@vger.kernel.org,
	phillip.wood123@gmail.com, shyamthakkar001@gmail.com,
	kristofferhaugsbakk@fastmail.com, gitster@pobox.com
Subject: [GSOC PATCH 1/2] commit: avoid scanning trailing comments when 'core.commentChar' is "auto"
Date: Wed, 16 Jul 2025 00:21:25 +0530	[thread overview]
Message-ID: <fbee656fb80ef673ea0ee4fafdf4baa9f18b5619.1752602474.git.ayu.chandekar@gmail.com> (raw)
In-Reply-To: <cover.1752602474.git.ayu.chandekar@gmail.com>

When core.commentChar is set to "auto", Git selects a comment character
by scanning the commit message contents and avoiding any character
already present in the message.

If the message still contains old conflict comments (starting with a
comment character), Git assumes that character is in use and chooses a
different one. As a result, those existing comment lines are no longer
recognized as comments and end up being included in the final commit
message.

To avoid this, skip scanning the trailing comment block when selecting
the comment character. This allows Git to safely reuse the original
character when appropriate, keeping the commit message clean and free of
leftover conflict information.

Background:

The "auto" value for core.commentchar was introduced in the commit
84c9dc2c5a (commit: allow core.commentChar=auto for character auto
selection, 2014-05-17) but did not exhibit this issue at that time.

The bug was introduced in commit a6c2654f83 (rebase -m: fix --signoff
with conflicts, 2024-04-18) where Git started writing conflict comments
to the file at 'rebase_path_message()'.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Signed-off-by: Ayush Chandekar <ayu.chandekar@gmail.com>
---
 builtin/commit.c           |  6 +++++-
 t/t3418-rebase-continue.sh | 13 +++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/builtin/commit.c b/builtin/commit.c
index fba0dded64..63e7158e98 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -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)
diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh
index 127216f722..b8a8dd77e7 100755
--- a/t/t3418-rebase-continue.sh
+++ b/t/t3418-rebase-continue.sh
@@ -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 &&
-- 
2.49.0


WARNING: multiple messages have this Message-ID (diff)
From: Ayush Chandekar <ayu.chandekar@gmail.com>
To: ayu.chandekar@gmail.com
Cc: christian.couder@gmail.com, git@vger.kernel.org,
	phillip.wood123@gmail.com, shyamthakkar001@gmail.com,
	kristofferhaugsbakk@fastmail.com, gitster@pobox.com
Subject: [GSOC PATCH v4 1/2] commit: avoid scanning trailing comments when 'core.commentChar' is "auto"
Date: Wed, 16 Jul 2025 00:27:00 +0530	[thread overview]
Message-ID: <fbee656fb80ef673ea0ee4fafdf4baa9f18b5619.1752602474.git.ayu.chandekar@gmail.com> (raw)
Message-ID: <20250715185700.DxaMIne29A9N3CvyKxTmBjukn2YAiOPCbsGfevxJX2c@z> (raw)
In-Reply-To: <cover.1752602474.git.ayu.chandekar@gmail.com>

When core.commentChar is set to "auto", Git selects a comment character
by scanning the commit message contents and avoiding any character
already present in the message.

If the message still contains old conflict comments (starting with a
comment character), Git assumes that character is in use and chooses a
different one. As a result, those existing comment lines are no longer
recognized as comments and end up being included in the final commit
message.

To avoid this, skip scanning the trailing comment block when selecting
the comment character. This allows Git to safely reuse the original
character when appropriate, keeping the commit message clean and free of
leftover conflict information.

Background:

The "auto" value for core.commentchar was introduced in the commit
84c9dc2c5a (commit: allow core.commentChar=auto for character auto
selection, 2014-05-17) but did not exhibit this issue at that time.

The bug was introduced in commit a6c2654f83 (rebase -m: fix --signoff
with conflicts, 2024-04-18) where Git started writing conflict comments
to the file at 'rebase_path_message()'.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Signed-off-by: Ayush Chandekar <ayu.chandekar@gmail.com>
---
 builtin/commit.c           |  6 +++++-
 t/t3418-rebase-continue.sh | 13 +++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/builtin/commit.c b/builtin/commit.c
index fba0dded64..63e7158e98 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -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)
diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh
index 127216f722..b8a8dd77e7 100755
--- a/t/t3418-rebase-continue.sh
+++ b/t/t3418-rebase-continue.sh
@@ -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 &&
-- 
2.49.0


  reply	other threads:[~2025-07-15 18:52 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-26 13:22 [GSOC PATCH] commit: avoid scanning trailing comments when 'core.commentChar' is "auto" Ayush Chandekar
2025-06-26 14:33 ` Junio C Hamano
2025-06-26 21:30   ` Ayush Chandekar
2025-06-26 15:40 ` Kristoffer Haugsbakk
2025-06-26 21:28   ` Ayush Chandekar
2025-06-26 22:16 ` [GSOC PATCH v2] " Ayush Chandekar
2025-06-27  8:34   ` Phillip Wood
2025-06-27 14:52     ` Junio C Hamano
2025-06-28 10:37       ` Ayush Chandekar
2025-06-28 13:38       ` Phillip Wood
2025-06-28 14:33         ` Ayush Chandekar
2025-06-30  8:59           ` Phillip Wood
2025-06-30 17:34             ` Ayush Chandekar
2025-06-28 15:10         ` Phillip Wood
2025-06-30 14:11         ` Junio C Hamano
2025-06-28 10:18     ` Ayush Chandekar
2025-06-27  9:04   ` Christian Couder
2025-06-30 18:25 ` [GSOC PATCH v3] " Ayush Chandekar
2025-07-01 13:17   ` Phillip Wood
2025-07-01 18:33     ` Ayush Chandekar
2025-07-01 19:31       ` Phillip Wood
2025-07-02 23:46         ` Ayush Chandekar
2025-07-04  8:23           ` Phillip Wood
2025-07-08 15:47             ` Ayush Chandekar
2025-07-09 14:17               ` Phillip Wood
2025-07-15 18:51 ` [GSOC PATCH 0/2] commit: improve behaviour of core.commentChar=auto for comments in commit messages Ayush Chandekar
2025-07-15 18:51   ` Ayush Chandekar [this message]
2025-07-15 18:57     ` [GSOC PATCH v4 1/2] commit: avoid scanning trailing comments when 'core.commentChar' is "auto" Ayush Chandekar
2025-07-15 18:51   ` [GSOC PATCH 2/2] config: set comment_line_str to "#" when core.commentChar=auto Ayush Chandekar
2025-07-15 18:57     ` [GSOC PATCH v4 " Ayush Chandekar
2025-07-15 21:23     ` [GSOC PATCH " Junio C Hamano
2025-07-15 22:15       ` Ayush Chandekar
2025-07-15 23:30         ` Junio C Hamano
2025-07-16 11:04           ` Ayush Chandekar
2025-07-16 15:21             ` Junio C Hamano
2025-07-16 15:24               ` Phillip Wood
2025-07-16 15:29                 ` Junio C Hamano
2025-07-15 18:56   ` [GSOC PATCH v4 0/2] commit: improve behaviour of core.commentChar=auto for comments in commit messages Ayush Chandekar
2025-07-16 11:43 ` [GSOC PATCH v5 " Ayush Chandekar
2025-07-16 11:43   ` [GSOC PATCH v5 1/2] commit: avoid scanning trailing comments when 'core.commentChar' is "auto" Ayush Chandekar
2025-07-16 11:43   ` [GSOC PATCH v5 2/2] config: set comment_line_str to "#" when core.commentChar=auto Ayush Chandekar
2025-07-16 15:28     ` Junio C Hamano
2025-07-16 14:28   ` [GSOC PATCH v5 0/2] commit: improve behaviour of core.commentChar=auto for comments in commit messages Phillip Wood
2025-07-16 15:29     ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fbee656fb80ef673ea0ee4fafdf4baa9f18b5619.1752602474.git.ayu.chandekar@gmail.com \
    --to=ayu.chandekar@gmail.com \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=kristofferhaugsbakk@fastmail.com \
    --cc=phillip.wood123@gmail.com \
    --cc=shyamthakkar001@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).