Re: [GSOC PATCH] commit: avoid scanning trailing comments when 'core.commentChar' is "auto"
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 26, 2025, 14:33 UTC
- Message-ID
- <xmqq5xgir2ry.fsf@gitster.g>
- In-Reply-To
- <20250626132233.414789-1-ayu.chandekar@gmail.com>
Ayush Chandekar <ayu.chandekar@gmail.com> writes:
Show 20 quoted lines
> 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 > `84c9dc2` (commit: allow core.commentChar=auto for character auto > selection) but did not exhibt this issue at that time.
Use "git log -1 --format=reference", i.e.
84c9dc2c (commit: allow core.commentChar=auto for character auto selection, 2014-05-17)
> The bug was introduced in commit `a6c2654` (rebase -m: fix --signoff > with conflicts) where Git started writing conflict comments to the file > at 'rebase_path_message()'.
Ditto.
Show 24 quoted lines
> 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)Looks quite straight-forward. Nice.
Thanks.