From: "Thomas Bachem via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Junio C Hamano <gitster@pobox.com>,
Thomas Bachem <mail@thomasbachem.com>,
Thomas Bachem <mail@thomasbachem.com>
Subject: [PATCH] sideband: skip unrecognized allowControlCharacters keywords
Date: Fri, 16 Oct 2026 12:39:34 +0000 [thread overview]
Message-ID: <pull.2261.git.1792154374653.gitgitgadget@gmail.com> (raw)
From: Thomas Bachem <mail@thomasbachem.com>
Since 128914438a (sideband: add options to allow more control
sequences to be passed through, 2026-03-05), the value of
sideband.allowControlCharacters is a comma-separated list of
keywords. When the parser meets a keyword it does not know, it warns
but stays on that keyword, so the warning repeats forever.
As the setting is read whenever a transport is set up, a typo like
"colour", a list written as "color, cursor" with a space, or a
keyword that only a newer version of Git knows is enough to make
every fetch, push, clone and ls-remote hang this way.
Move on to the next keyword after the warning, and name only the
unrecognized keyword in it, not the rest of the list.
Assisted-by: Claude Opus 5.5
Signed-off-by: Thomas Bachem <mail@thomasbachem.com>
---
sideband: skip unrecognized allowControlCharacters keywords
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2261%2Fthomasbachem%2Fsideband-control-characters-loop-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2261/thomasbachem/sideband-control-characters-loop-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2261
sideband.c | 19 ++++++++++++-------
t/t5409-colorize-remote-messages.sh | 25 +++++++++++++++++++++++++
2 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/sideband.c b/sideband.c
index 374187402e..ed6840bf89 100644
--- a/sideband.c
+++ b/sideband.c
@@ -62,18 +62,23 @@ int sideband_allow_control_characters_config(const char *var, const char *value)
allow_control_characters = ALLOW_NO_CONTROL_CHARACTERS;
while (*value) {
- if (skip_prefix_in_csv(value, "color", &value))
+ if (skip_prefix_in_csv(value, "color", &value)) {
allow_control_characters |= ALLOW_ANSI_COLOR_SEQUENCES;
- else if (skip_prefix_in_csv(value, "cursor", &value))
+ } else if (skip_prefix_in_csv(value, "cursor", &value)) {
allow_control_characters |= ALLOW_ANSI_CURSOR_MOVEMENTS;
- else if (skip_prefix_in_csv(value, "erase", &value))
+ } else if (skip_prefix_in_csv(value, "erase", &value)) {
allow_control_characters |= ALLOW_ANSI_ERASE;
- else if (skip_prefix_in_csv(value, "true", &value))
+ } else if (skip_prefix_in_csv(value, "true", &value)) {
allow_control_characters = ALLOW_ALL_CONTROL_CHARACTERS;
- else if (skip_prefix_in_csv(value, "false", &value))
+ } else if (skip_prefix_in_csv(value, "false", &value)) {
allow_control_characters = ALLOW_NO_CONTROL_CHARACTERS;
- else
- warning(_("unrecognized value for '%s': '%s'"), var, value);
+ } else {
+ const char *end = strchrnul(value, ',');
+
+ warning(_("unrecognized value for '%s': '%.*s'"),
+ var, (int)(end - value), value);
+ value = end + !!*end;
+ }
}
return 0;
}
diff --git a/t/t5409-colorize-remote-messages.sh b/t/t5409-colorize-remote-messages.sh
index 5da8b0ad64..6117579eb1 100755
--- a/t/t5409-colorize-remote-messages.sh
+++ b/t/t5409-colorize-remote-messages.sh
@@ -190,4 +190,29 @@ test_expect_success 'allow all control sequences for a specific URL' '
test_grep ! "\\^\\[\\[K" decoded
'
+test_expect_success 'unrecognized keywords in allowControlCharacters are skipped' '
+ write_script .git/eraser <<-\EOF &&
+ printf "error: Ohai!\\r\\033[K" >&2
+ exec "$@"
+ EOF
+ test_config_global uploadPack.packObjectsHook ./eraser &&
+ test_commit unrecognized-keyword &&
+
+ # Cap the output, so that a parser stuck on the unrecognized
+ # keyword fails the test instead of warning forever.
+ git -c sideband.allowControlCharacters=bogus,erase \
+ ls-remote . 2>&1 >/dev/null |
+ head -n 2 >warnings &&
+ test_line_count = 1 warnings &&
+ test_grep "allowcontrolcharacters.: .bogus.$" warnings &&
+
+ rm -rf throw-away &&
+ git -c sideband.allowControlCharacters=bogus,erase \
+ clone --no-local . throw-away 2>stderr &&
+ test_decode_color <stderr >color-decoded &&
+ test_decode_csi <color-decoded >decoded &&
+ test_grep "CSI \\[K" decoded &&
+ test_grep ! "\\^\\[\\[K" decoded
+'
+
test_done
base-commit: 6de20f6092dcf9bdb1c8efe03db4b70c82b423dd
--
gitgitgadget
next reply other threads:[~2026-10-16 12:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 12:39 Thomas Bachem via GitGitGadget [this message]
2026-10-16 14:25 ` [PATCH] sideband: skip unrecognized allowControlCharacters keywords Tuomas Ahola
2026-10-16 16:28 ` Thomas Bachem
2026-10-16 16:59 ` Junio C Hamano
2026-10-16 19:34 ` Tuomas Ahola
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=pull.2261.git.1792154374653.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mail@thomasbachem.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