[PATCH 5/5] config: make 'git config list --type=<X>' work
- From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Feb 10, 2026, 04:42 UTC
- Message-ID
- <e27d52c4a5970f774e324b0a9c0badb0532bf3d4.1770698579.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.2044.git.1770698579.gitgitgadget@gmail.com>
From: Derrick Stolee <stolee@gmail.com>
Previously, the --type=<X> argument to 'git config list' was ignored and did nothing. Now, we add the use of format_config() to the show_all_config() function so each key-value pair is attempted to be parsed.
If there is an error in parsing, then the row is not output.
This is a change in behavior! We are starting to respect an option that was previously ignored, leading to potential user confusion. This is probably still a good option, since the --type argument did not change behavior at all previously, so users can get the behavior they expect by removing the --type argument or adding the --no-type argument.
Signed-off-by: Derrick Stolee <stolee@gmail.com> --- Documentation/git-config.adoc | 3 +++ builtin/config.c | 19 +++++-------------- t/t1300-config.sh | 26 +++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/Documentation/git-config.adoc b/Documentation/git-config.adoc index ac3b536a15..5300dd4c51 100644 --- a/Documentation/git-config.adoc +++ b/Documentation/git-config.adoc @@ -240,6 +240,9 @@ Valid `<type>`'s include: that the given value is canonicalize-able as an ANSI color, but it is written as-is. + +If the command is in `list` mode, then the `--type <type>` argument will apply +to each listed config value. If the value does not successfully parse in that +format, then it will be omitted from the list. --bool:: --int:: diff --git a/builtin/config.c b/builtin/config.c index e69b26af6a..c83514b4ff 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -363,21 +363,12 @@ static int show_all_config(const char *key_, const char *value_, { const struct config_display_options *opts = cb; const struct key_value_info *kvi = ctx->kvi; + struct strbuf formatted = STRBUF_INIT; - if (opts->show_origin || opts->show_scope) { - struct strbuf buf = STRBUF_INIT; - if (opts->show_scope) - show_config_scope(opts, kvi, &buf); - if (opts->show_origin) - show_config_origin(opts, kvi, &buf); - /* Use fwrite as "buf" can contain \0's if "end_null" is set. */ - fwrite(buf.buf, 1, buf.len, stdout); - strbuf_release(&buf); - } - if (!opts->omit_values && value_) - printf("%s%c%s%c", key_, opts->delim, value_, opts->term); - else - printf("%s%c", key_, opts->term); + if (format_config(opts, &formatted, key_, value_, kvi, 0) >= 0) + fwrite(formatted.buf, 1, formatted.len, stdout); + + strbuf_release(&formatted); return 0; } diff --git a/t/t1300-config.sh b/t/t1300-config.sh index 9850fcd5b5..b5ce900126 100755 --- a/t/t1300-config.sh +++ b/t/t1300-config.sh @@ -2459,9 +2459,10 @@ done cat >.git/config <<-\EOF && [section] -foo = true +foo = True number = 10 big = 1M +path = ~/dir EOF test_expect_success 'identical modern --type specifiers are allowed' ' @@ -2503,6 +2504,29 @@ test_expect_success 'unset type specifiers may be reset to conflicting ones' ' test_cmp_config 1048576 --type=bool --no-type --type=int section.big ' +test_expect_success 'list --type=bool shows only canonicalizable bool values' ' + cat >expect <<-EOF && + section.foo=true + section.number=true + section.big=true + EOF + + git config ${mode_prefix}list --type=bool >actual && + test_cmp expect actual +' + +test_expect_success 'list --type=path shows only canonicalizable path values' ' + cat >expect <<-EOF && + section.foo=True + section.number=10 + section.big=1M + section.path=$HOME/dir + EOF + + git config ${mode_prefix}list --type=path >actual && + test_cmp expect actual +' + test_expect_success '--type rejects unknown specifiers' ' test_must_fail git config --type=nonsense section.foo 2>error && test_grep "unrecognized --type argument" error
-- gitgitgadget