From: Junio C Hamano Date: Tue, 23 Dec 2025 03:19:56 +0000 (+0900) Subject: Merge branch 'js/neuter-sideband' into seen X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1ba858c6d3766141ad7e73c8c45fc461ce941a8;p=thirdparty%2Fgit.git Merge branch 'js/neuter-sideband' into seen Invalidate control characters in sideband messages, to avoid terminal state getting messed up. Comments? cf. * js/neuter-sideband: sideband: add options to allow more control sequences to be passed through sideband: do allow ANSI color sequences by default sideband: introduce an "escape hatch" to allow control characters sideband: mask control characters --- c1ba858c6d3766141ad7e73c8c45fc461ce941a8 diff --cc Documentation/config.adoc index 62eebe7c54,48870bb588..dcea3c0c15 --- a/Documentation/config.adoc +++ b/Documentation/config.adoc @@@ -373,188 -372,188 +373,190 @@@ inventing new variables for use in you names do not conflict with those that are used by Git itself and other popular tools, and describe them in your documentation. -include::config/add.txt[] +include::config/add.adoc[] + +include::config/advice.adoc[] -include::config/advice.txt[] +include::config/alias.adoc[] -include::config/alias.txt[] +include::config/am.adoc[] -include::config/am.txt[] +include::config/apply.adoc[] -include::config/apply.txt[] +include::config/attr.adoc[] -include::config/attr.txt[] +include::config/bitmap-pseudo-merge.adoc[] -include::config/bitmap-pseudo-merge.txt[] +include::config/blame.adoc[] -include::config/blame.txt[] +include::config/branch.adoc[] -include::config/branch.txt[] +include::config/browser.adoc[] -include::config/browser.txt[] +include::config/bundle.adoc[] -include::config/bundle.txt[] +include::config/checkout.adoc[] -include::config/checkout.txt[] +include::config/clean.adoc[] -include::config/clean.txt[] +include::config/clone.adoc[] -include::config/clone.txt[] +include::config/color.adoc[] -include::config/color.txt[] +include::config/column.adoc[] -include::config/column.txt[] +include::config/commit.adoc[] -include::config/commit.txt[] +include::config/commitgraph.adoc[] -include::config/commitgraph.txt[] +include::config/completion.adoc[] -include::config/completion.txt[] +include::config/core.adoc[] -include::config/core.txt[] +include::config/credential.adoc[] -include::config/credential.txt[] +include::config/diff.adoc[] -include::config/diff.txt[] +include::config/difftool.adoc[] -include::config/difftool.txt[] +include::config/extensions.adoc[] -include::config/extensions.txt[] +include::config/fastimport.adoc[] -include::config/fastimport.txt[] +include::config/feature.adoc[] -include::config/feature.txt[] +include::config/fetch.adoc[] -include::config/fetch.txt[] +include::config/filter.adoc[] -include::config/filter.txt[] +include::config/format.adoc[] -include::config/format.txt[] +include::config/fsck.adoc[] -include::config/fsck.txt[] +include::config/fsmonitor--daemon.adoc[] -include::config/fsmonitor--daemon.txt[] +include::config/gc.adoc[] -include::config/gc.txt[] +include::config/gitcvs.adoc[] -include::config/gitcvs.txt[] +include::config/gitweb.adoc[] -include::config/gitweb.txt[] +include::config/gpg.adoc[] -include::config/gpg.txt[] +include::config/grep.adoc[] -include::config/grep.txt[] +include::config/gui.adoc[] -include::config/gui.txt[] +include::config/guitool.adoc[] -include::config/guitool.txt[] +include::config/help.adoc[] -include::config/help.txt[] +include::config/http.adoc[] -include::config/http.txt[] +include::config/i18n.adoc[] -include::config/i18n.txt[] +include::config/imap.adoc[] -include::config/imap.txt[] +include::config/includeif.adoc[] -include::config/includeif.txt[] +include::config/index.adoc[] -include::config/index.txt[] +include::config/init.adoc[] -include::config/init.txt[] +include::config/instaweb.adoc[] -include::config/instaweb.txt[] +include::config/interactive.adoc[] -include::config/interactive.txt[] +include::config/log.adoc[] -include::config/log.txt[] +include::config/lsrefs.adoc[] -include::config/lsrefs.txt[] +include::config/mailinfo.adoc[] -include::config/mailinfo.txt[] +include::config/mailmap.adoc[] -include::config/mailmap.txt[] +include::config/maintenance.adoc[] -include::config/maintenance.txt[] +include::config/man.adoc[] -include::config/man.txt[] +include::config/merge.adoc[] -include::config/merge.txt[] +include::config/mergetool.adoc[] -include::config/mergetool.txt[] +include::config/notes.adoc[] -include::config/notes.txt[] +include::config/pack.adoc[] -include::config/pack.txt[] +include::config/pager.adoc[] -include::config/pager.txt[] +include::config/pretty.adoc[] -include::config/pretty.txt[] +include::config/promisor.adoc[] -include::config/promisor.txt[] +include::config/protocol.adoc[] -include::config/protocol.txt[] +include::config/pull.adoc[] -include::config/pull.txt[] +include::config/push.adoc[] -include::config/push.txt[] +include::config/rebase.adoc[] -include::config/rebase.txt[] +include::config/receive.adoc[] -include::config/receive.txt[] +include::config/reftable.adoc[] -include::config/reftable.txt[] +include::config/remote.adoc[] -include::config/remote.txt[] +include::config/remotes.adoc[] -include::config/remotes.txt[] +include::config/repack.adoc[] -include::config/repack.txt[] +include::config/rerere.adoc[] -include::config/rerere.txt[] +include::config/revert.adoc[] -include::config/revert.txt[] +include::config/safe.adoc[] -include::config/safe.txt[] +include::config/sendemail.adoc[] -include::config/sendemail.txt[] +include::config/sequencer.adoc[] -include::config/sequencer.txt[] +include::config/showbranch.adoc[] -include::config/showbranch.txt[] ++include::config/sideband.adoc[] + -include::config/sideband.txt[] +include::config/sparse.adoc[] -include::config/sparse.txt[] +include::config/splitindex.adoc[] -include::config/splitindex.txt[] +include::config/ssh.adoc[] -include::config/ssh.txt[] +include::config/stash.adoc[] -include::config/stash.txt[] +include::config/status.adoc[] -include::config/status.txt[] +include::config/submodule.adoc[] -include::config/submodule.txt[] +include::config/tag.adoc[] -include::config/tag.txt[] +include::config/tar.adoc[] -include::config/tar.txt[] +include::config/trace2.adoc[] -include::config/trace2.txt[] +include::config/trailer.adoc[] -include::config/transfer.txt[] +include::config/transfer.adoc[] -include::config/uploadarchive.txt[] +include::config/uploadarchive.adoc[] -include::config/uploadpack.txt[] +include::config/uploadpack.adoc[] -include::config/url.txt[] +include::config/url.adoc[] -include::config/user.txt[] +include::config/user.adoc[] -include::config/versionsort.txt[] +include::config/versionsort.adoc[] -include::config/web.txt[] +include::config/web.adoc[] -include::config/worktree.txt[] +include::config/worktree.adoc[] diff --cc Documentation/config/sideband.adoc index 0000000000,8eb7656cdd..8eb7656cdd mode 000000,100644..100644 --- a/Documentation/config/sideband.adoc +++ b/Documentation/config/sideband.adoc diff --cc sideband.c index ea7c25211e,725e24db0d..0290a4d1ce --- a/sideband.c +++ b/sideband.c @@@ -26,22 -25,79 +26,79 @@@ static struct keyword_entry keywords[] { "error", GIT_COLOR_BOLD_RED }, }; + static enum { + ALLOW_NO_CONTROL_CHARACTERS = 0, + ALLOW_ANSI_COLOR_SEQUENCES = 1<<0, + ALLOW_ANSI_CURSOR_MOVEMENTS = 1<<1, + ALLOW_ANSI_ERASE = 1<<2, + ALLOW_DEFAULT_ANSI_SEQUENCES = ALLOW_ANSI_COLOR_SEQUENCES, + ALLOW_ALL_CONTROL_CHARACTERS = 1<<3, + } allow_control_characters = ALLOW_DEFAULT_ANSI_SEQUENCES; + + static inline int skip_prefix_in_csv(const char *value, const char *prefix, + const char **out) + { + if (!skip_prefix(value, prefix, &value) || + (*value && *value != ',')) + return 0; + *out = value + !!*value; + return 1; + } + + static void parse_allow_control_characters(const char *value) + { + allow_control_characters = ALLOW_NO_CONTROL_CHARACTERS; + while (*value) { + if (skip_prefix_in_csv(value, "default", &value)) + allow_control_characters |= ALLOW_DEFAULT_ANSI_SEQUENCES; + else if (skip_prefix_in_csv(value, "color", &value)) + allow_control_characters |= ALLOW_ANSI_COLOR_SEQUENCES; + 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)) + allow_control_characters |= ALLOW_ANSI_ERASE; + 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)) + allow_control_characters = ALLOW_NO_CONTROL_CHARACTERS; + else + warning(_("unrecognized value for `sideband." + "allowControlCharacters`: '%s'"), value); + } + } + /* Returns a color setting (GIT_COLOR_NEVER, etc). */ -static int use_sideband_colors(void) +static enum git_colorbool use_sideband_colors(void) { - static int use_sideband_colors_cached = -1; - + static enum git_colorbool use_sideband_colors_cached = GIT_COLOR_UNKNOWN; - ++ struct repository *r = the_repository; const char *key = "color.remote"; struct strbuf sb = STRBUF_INIT; const char *value; int i; - if (use_sideband_colors_cached >= 0) + if (use_sideband_colors_cached != GIT_COLOR_UNKNOWN) return use_sideband_colors_cached; - if (!repo_config_get_string_tmp(the_repository, key, &value)) - switch (git_config_get_maybe_bool("sideband.allowcontrolcharacters", &i)) { ++ switch (repo_config_get_maybe_bool(r, "sideband.allowcontrolcharacters", &i)) { + case 0: /* Boolean value */ + allow_control_characters = i ? ALLOW_ALL_CONTROL_CHARACTERS : + ALLOW_NO_CONTROL_CHARACTERS; + break; + case -1: /* non-Boolean value */ - if (git_config_get_string_tmp("sideband.allowcontrolcharacters", - &value)) ++ if (repo_config_get_string_tmp(r, "sideband.allowcontrolcharacters", ++ &value)) + ; /* huh? `get_maybe_bool()` returned -1 */ + else + parse_allow_control_characters(value); + break; + default: + break; /* not configured */ + } + - if (!git_config_get_string_tmp(key, &value)) ++ if (!repo_config_get_string_tmp(r, key, &value)) use_sideband_colors_cached = git_config_colorbool(key, value); - else if (!repo_config_get_string_tmp(the_repository, "color.ui", &value)) - else if (!git_config_get_string_tmp("color.ui", &value)) ++ else if (!repo_config_get_string_tmp(r, "color.ui", &value)) use_sideband_colors_cached = git_config_colorbool("color.ui", value); else use_sideband_colors_cached = GIT_COLOR_AUTO; @@@ -49,7 -105,7 +106,7 @@@ for (i = 0; i < ARRAY_SIZE(keywords); i++) { strbuf_reset(&sb); strbuf_addf(&sb, "%s.%s", key, keywords[i].keyword); - if (repo_config_get_string_tmp(the_repository, sb.buf, &value)) - if (git_config_get_string_tmp(sb.buf, &value)) ++ if (repo_config_get_string_tmp(r, sb.buf, &value)) continue; color_parse(value, keywords[i].color); }