From: <rsbecker@nexbridge.com>
To: "'Karthik Nayak'" <karthik.188@gmail.com>,
"'Patrick Steinhardt'" <ps@pks.im>, <git@vger.kernel.org>
Cc: "'Kristoffer Haugsbakk'" <code@khaugsbakk.name>,
"'Taylor Blau'" <me@ttaylorr.com>,
"'Jean-Noël AVILA'" <jn.avila@free.fr>,
"'Eric Sunshine'" <sunshine@sunshineco.com>,
"'Junio C Hamano'" <gitster@pobox.com>
Subject: RE: [PATCH v4 07/14] builtin/config: introduce "list" subcommand
Date: Fri, 3 May 2024 09:13:42 -0400 [thread overview]
Message-ID: <015b01da9d5b$bbe59120$33b0b360$@nexbridge.com> (raw)
In-Reply-To: <CAOLa=ZSNbZPByO9QyeAGaR1pWXMB7ge_GF7M5fydxP-cse-X3g@mail.gmail.com>
On Friday, May 3, 2024 9:09 AM. Karthik Nayak wrote:
>Patrick Steinhardt <ps@pks.im> writes:
>
>> While git-config(1) has several modes, those modes are not exposed
>> with subcommands but instead by specifying e.g. `--unset` or `--list`.
>> This
>
>s/specifying/specifying flags/ perhaps?
>
>> user interface is not really in line with how our more modern commands
>> work, where it is a lot more customary to say e.g. `git remote list`.
>
>Tangent: I totally agree with the patch, but it would be nice to have a
>'DesigningCommands' document which would highlight UX do's and don'ts.
>It would be nice to add that as reference in discussions.
>
>> Furthermore, to add to the confusion, git-config(1) also allows the
>> user to request modes implicitly by just specifying the correct number
>> of arguments. Thus, `git config foo.bar` will retrieve the value of
>> "foo.bar" while `git config foo.bar baz` will set it to "baz".
>>
>> Overall, this makes for a confusing interface that could really use a
>> makeover. It hurts discoverability of what you can do with
>> git-config(1) and is comparatively easy to get wrong. Converting the
>> command to have subcommands instead would go a long way to help address
>these issues.
>>
>> One concern in this context is backwards compatibility. Luckily, we
>> can introduce subcommands without breaking backwards compatibility at all.
>> This is because all the implicit modes of git-config(1) require that
>> the first argument is a properly formatted config key. And as config
>> keys _must_ have a dot in their name, any value without a dot would
>> have been discarded by git-config(1) previous to this change. Thus,
>> given that none of the subcommands do have a dot, they are unambiguous.
>>
>> Introduce the first such new subcommand, which is "git config list".
>> To retain backwards compatibility we only conditionally use
>> subcommands and will fall back to the old syntax in case no subcommand was
>detected.
>> This should help to transition to the new-style syntax until we
>> eventually deprecate and remove the old-style syntax.
>>
>> Note that the way we handle this we're duplicating some functionality
>> across old and new syntax. While this isn't pretty, it helps us to
>> ensure that there really is no change in behaviour for the old syntax.
>>
>> Amend tests such that we run them both with old and new style syntax.
>> As tests are now run twice, state from the first run may be still be
>> around in the second run and thus cause tests to fail. Add cleanup
>> logic as required to fix such tests.
>>
>> Signed-off-by: Patrick Steinhardt <ps@pks.im>
>> ---
>> Documentation/git-config.txt | 26 ++++++---
>> builtin/config.c | 90 ++++++++++++++++++++++++----
>> t/t1300-config.sh | 110 +++++++++++++++++++++--------------
>> 3 files changed, 162 insertions(+), 64 deletions(-)
>>
>> diff --git a/Documentation/git-config.txt
>> b/Documentation/git-config.txt index ac61113fcc..c83c97cb7e 100644
>> --- a/Documentation/git-config.txt
>> +++ b/Documentation/git-config.txt
>> @@ -9,6 +9,7 @@ git-config - Get and set repository or global options
>> SYNOPSIS
>> --------
>> [verse]
>> +'git config list' [<file-option>] [<display-option>] [--includes]
>> 'git config' [<file-option>] [--type=<type>] [--comment=<message>]
>> [--fixed-value] [--show-origin] [--show-scope] [-z|--null] <name>
>> [<value> [<value-pattern>]] 'git config' [<file-option>]
>> [--type=<type>] [--comment=<message>] --add <name> <value> 'git
>> config' [<file-option>] [--type=<type>] [--comment=<message>]
>> [--fixed-value] --replace-all <name> <value> [<value-pattern>] @@
>> -20,7 +21,6 @@ SYNOPSIS 'git config' [<file-option>] [--fixed-value]
>> --unset-all <name> [<value-pattern>] 'git config' [<file-option>]
>> --rename-section <old-name> <new-name> 'git config' [<file-option>]
>> --remove-section <name> -'git config' [<file-option>] [--show-origin]
>> [--show-scope] [-z|--null] [--name-only] -l | --list 'git config'
>> [<file-option>] --get-color <name> [<default>] 'git config' [<file-option>] --get-
>colorbool <name> [<stdout-is-tty>] 'git config' [<file-option>] -e | --edit @@ -74,6
>+74,12 @@ On success, the command returns the exit code 0.
>> A list of all available configuration variables can be obtained using
>> the `git help --config` command.
>>
>> +COMMANDS
>> +--------
>> +
>> +list::
>> + List all variables set in config file, along with their values.
>> +
>> [[OPTIONS]]
>> OPTIONS
>> -------
>> @@ -190,10 +196,6 @@ See also <<FILES>>.
>> --unset-all::
>> Remove all lines matching the key from config file.
>>
>> --l::
>> ---list::
>> - List all variables set in config file, along with their values.
>> -
>> --fixed-value::
>> When used with the `value-pattern` argument, treat `value-pattern` as
>> an exact string instead of a regular expression. This will restrict
>> @@ -248,7 +250,7 @@ Valid `<type>`'s include:
>> contain line breaks.
>>
>> --name-only::
>> - Output only the names of config variables for `--list` or
>> + Output only the names of config variables for `list` or
>> `--get-regexp`.
>>
>> --show-origin::
>> @@ -300,10 +302,20 @@ Valid `<type>`'s include:
>> When using `--get`, and the requested variable is not found, behave as if
>> <value> were the value assigned to that variable.
>>
>> +DEPRECATED MODES
>> +----------------
>> +
>> +The following modes have been deprecated in favor of subcommands. It
>> +is recommended to migrate to the new syntax.
>> +
>> +-l::
>> +--list::
>> + Replaced by `git config list`.
>> +
>> CONFIGURATION
>> -------------
>> `pager.config` is only respected when listing configuration, i.e.,
>> when -using `--list` or any of the `--get-*` which may return multiple results.
>> +using `list` or any of the `--get-*` which may return multiple results.
>> The default is to use a pager.
>>
>> [[FILES]]
>> diff --git a/builtin/config.c b/builtin/config.c index
>> 59877065f8..f89ddce8da 100644
>> --- a/builtin/config.c
>> +++ b/builtin/config.c
>> @@ -16,10 +16,16 @@
>> #include "worktree.h"
>>
>> static const char *const builtin_config_usage[] = {
>> + N_("git config list [<file-option>] [<display-option>]
>> +[--includes]"),
>> N_("git config [<options>]"),
>> NULL
>> };
>>
>> +static const char *const builtin_config_list_usage[] = {
>> + N_("git config list [<file-option>] [<display-option>] [--includes]"),
>> + NULL
>> +};
>> +
>> static char *key;
>> static regex_t *key_regexp;
>> static const char *value_pattern;
>> @@ -33,6 +39,7 @@ static char delim = '='; static char key_delim = '
>> '; static char term = '\n';
>>
>> +static parse_opt_subcommand_fn *subcommand;
>> static int use_global_config, use_system_config, use_local_config;
>> static int use_worktree_config; static struct git_config_source
>> given_config_source; @@ -706,14 +713,24 @@ static void
>> handle_nul(void) {
>> }
>> }
>>
>> +#define CONFIG_LOCATION_OPTIONS \
>> + OPT_GROUP(N_("Config file location")), \
>> + OPT_BOOL(0, "global", &use_global_config, N_("use global config file")), \
>> + OPT_BOOL(0, "system", &use_system_config, N_("use system config
>file")), \
>> + OPT_BOOL(0, "local", &use_local_config, N_("use repository config file")), \
>> + OPT_BOOL(0, "worktree", &use_worktree_config, N_("use per-worktree
>config file")), \
>> + OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given
>config file")), \
>> + OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"),
>> +N_("read config from given blob object"))
>> +
>> +#define CONFIG_DISPLAY_OPTIONS \
>> + OPT_GROUP(N_("Display options")), \
>> + OPT_BOOL('z', "null", &end_nul, N_("terminate values with NUL byte")), \
>> + OPT_BOOL(0, "name-only", &omit_values, N_("show variable names
>only")), \
>> + OPT_BOOL(0, "show-origin", &show_origin, N_("show origin of config (file,
>standard input, blob, command line)")), \
>> + OPT_BOOL(0, "show-scope", &show_scope, N_("show scope of config
>> +(worktree, local, global, system, command)"))
>> +
>> static struct option builtin_config_options[] = {
>> - OPT_GROUP(N_("Config file location")),
>> - OPT_BOOL(0, "global", &use_global_config, N_("use global config file")),
>> - OPT_BOOL(0, "system", &use_system_config, N_("use system config
>file")),
>> - OPT_BOOL(0, "local", &use_local_config, N_("use repository config file")),
>> - OPT_BOOL(0, "worktree", &use_worktree_config, N_("use per-worktree
>config file")),
>> - OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given
>config file")),
>> - OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"),
>N_("read config from given blob object")),
>> + CONFIG_LOCATION_OPTIONS,
>> OPT_GROUP(N_("Action")),
>> OPT_CMDMODE(0, "get", &actions, N_("get value: name [<value-
>pattern>]"), ACTION_GET),
>> OPT_CMDMODE(0, "get-all", &actions, N_("get all values: key
>> [<value-pattern>]"), ACTION_GET_ALL), @@ -737,15 +754,12 @@ static struct
>option builtin_config_options[] = {
>> OPT_CALLBACK_VALUE(0, "bool-or-str", &type, N_("value is --bool or
>string"), TYPE_BOOL_OR_STR),
>> OPT_CALLBACK_VALUE(0, "path", &type, N_("value is a path (file or
>directory name)"), TYPE_PATH),
>> OPT_CALLBACK_VALUE(0, "expiry-date", &type, N_("value is an expiry
>> date"), TYPE_EXPIRY_DATE),
>> + CONFIG_DISPLAY_OPTIONS,
>> OPT_GROUP(N_("Other")),
>> - OPT_BOOL('z', "null", &end_nul, N_("terminate values with NUL byte")),
>> - OPT_BOOL(0, "name-only", &omit_values, N_("show variable names
>only")),
>> - OPT_BOOL(0, "includes", &respect_includes_opt, N_("respect include
>directives on lookup")),
>> - OPT_BOOL(0, "show-origin", &show_origin, N_("show origin of config (file,
>standard input, blob, command line)")),
>> - OPT_BOOL(0, "show-scope", &show_scope, N_("show scope of config
>(worktree, local, global, system, command)")),
>> OPT_STRING(0, "default", &default_value, N_("value"), N_("with --get, use
>default value when missing entry")),
>> OPT_STRING(0, "comment", &comment_arg, N_("value"), N_("human-
>readable comment string (# will be prepended as needed)")),
>> OPT_BOOL(0, "fixed-value", &fixed_value, N_("use string equality
>> when comparing values to 'value-pattern'")),
>> + OPT_BOOL(0, "includes", &respect_includes_opt, N_("respect include
>> +directives on lookup")),
>> OPT_END(),
>> };
>>
>> @@ -754,6 +768,42 @@ static NORETURN void usage_builtin_config(void)
>> usage_with_options(builtin_config_usage, builtin_config_options); }
>>
>> +static int cmd_config_list(int argc, const char **argv, const char
>> +*prefix) {
>> + struct option opts[] = {
>> + CONFIG_LOCATION_OPTIONS,
>> + CONFIG_DISPLAY_OPTIONS,
>> + OPT_GROUP(N_("Other")),
>> + OPT_BOOL(0, "includes", &respect_includes_opt, N_("respect
>include directives on lookup")),
>> + OPT_END(),
>> + };
>> +
>> + argc = parse_options(argc, argv, prefix, opts, builtin_config_list_usage, 0);
>> + check_argc(argc, 0, 0);
>> +
>> + handle_config_location(prefix);
>> + handle_nul();
>> +
>> + setup_auto_pager("config", 1);
>> +
>> + if (config_with_options(show_all_config, NULL,
>> + &given_config_source, the_repository,
>> + &config_options) < 0) {
>> + if (given_config_source.file)
>> + die_errno(_("unable to read config file '%s'"),
>> + given_config_source.file);
>> + else
>> + die(_("error processing config file(s)"));
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static struct option builtin_subcommand_options[] = {
>> + OPT_SUBCOMMAND("list", &subcommand, cmd_config_list),
>> + OPT_END(),
>> +};
>> +
>> int cmd_config(int argc, const char **argv, const char *prefix) {
>> char *value = NULL, *comment = NULL; @@ -763,6 +813,22 @@ int
>> cmd_config(int argc, const char **argv, const char *prefix)
>>
>> given_config_source.file =
>> xstrdup_or_null(getenv(CONFIG_ENVIRONMENT));
>>
>> + /*
>> + * This is somewhat hacky: we first parse the command line while
>> + * keeping all args intact in order to determine whether a subcommand
>> + * has been specified. If so, we re-parse it a second time, but this
>> + * time we drop KEEP_ARGV0. This is so that we don't munge the command
>> + * line in case no subcommand was given, which would otherwise confuse
>> + * us when parsing the legacy-style modes that don't use subcommands.
>> + */
>> + argc = parse_options(argc, argv, prefix, builtin_subcommand_options,
>builtin_config_usage,
>> +
>PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_NO_INTERNAL_HELP|PARSE
>_OPT_KEEP_ARGV0|PARSE_OPT_KEEP_UNKNOWN_OPT);
>> + if (subcommand) {
>> + argc = parse_options(argc, argv, prefix,
>builtin_subcommand_options, builtin_config_usage,
>> +
>PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_NO_INTERNAL_HELP|PARSE
>_OPT_KEEP_UNKNOWN_OPT);
>> + return subcommand(argc, argv, prefix);
>> + }
>> +
>> argc = parse_options(argc, argv, prefix, builtin_config_options,
>> builtin_config_usage,
>> PARSE_OPT_STOP_AT_NON_OPTION); diff --git
>a/t/t1300-config.sh
>> b/t/t1300-config.sh index 86dc70769a..f77d2f7847 100755
>> --- a/t/t1300-config.sh
>> +++ b/t/t1300-config.sh
>> @@ -11,6 +11,20 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
>> TEST_PASSES_SANITIZE_LEAK=true
>> . ./test-lib.sh
>>
>> +for mode in legacy subcommands
>> +do
>> +
>> +case "$mode" in
>> +legacy)
>> + mode_prefix="--"
>> + ;;
>> +subcommands)
>> + mode_prefix=""
>> + ;;
>> +*)
>> + BUG "unknown mode $mode";;
>> +esac
>> +
>> test_expect_success 'setup whitespace config' '
>> sed -e "s/^|//" \
>> -e "s/[$]$//" \
>> @@ -460,11 +474,11 @@ version.1.2.3eX.alpha=beta EOF
>>
>> test_expect_success 'working --list' '
>> - git config --list > output &&
>> + git config ${mode_prefix}list > output &&
>> test_cmp expect output
>> '
>> test_expect_success '--list without repo produces empty output' '
>> - git --git-dir=nonexistent config --list >output &&
>> + git --git-dir=nonexistent config ${mode_prefix}list >output &&
>> test_must_be_empty output
>> '
>>
>> @@ -476,7 +490,7 @@ version.1.2.3eX.alpha EOF
>>
>> test_expect_success '--name-only --list' '
>> - git config --name-only --list >output &&
>> + git config ${mode_prefix}list --name-only >output &&
>> test_cmp expect output
>> '
>>
>> @@ -614,17 +628,17 @@ ein.bahn=strasse EOF
>>
>> test_expect_success 'alternative GIT_CONFIG' '
>> - GIT_CONFIG=other-config git config --list >output &&
>> + GIT_CONFIG=other-config git config ${mode_prefix}list >output &&
>> test_cmp expect output
>> '
>>
>> test_expect_success 'alternative GIT_CONFIG (--file)' '
>> - git config --file other-config --list >output &&
>> + git config ${mode_prefix}list --file other-config >output &&
>> test_cmp expect output
>> '
>>
>> test_expect_success 'alternative GIT_CONFIG (--file=-)' '
>> - git config --file - --list <other-config >output &&
>> + git config ${mode_prefix}list --file - <other-config >output &&
>> test_cmp expect output
>> '
>>
>> @@ -637,6 +651,7 @@ test_expect_success 'editing stdin is an error' '
>> '
>>
>> test_expect_success 'refer config from subdirectory' '
>> + test_when_finished "rm -r x" &&
>> mkdir x &&
>> test_cmp_config -C x strasse --file=../other-config --get ein.bahn
>> '
>> @@ -847,7 +862,7 @@ test_expect_success 'line number is reported correctly' '
>> '
>>
>> test_expect_success 'invalid stdin config' '
>> - echo "[broken" | test_must_fail git config --list --file - >output 2>&1 &&
>> + echo "[broken" | test_must_fail git config ${mode_prefix}list --file
>> +- >output 2>&1 &&
>> test_grep "bad config line 1 in standard input" output '
>>
>> @@ -1139,7 +1154,7 @@ section.quotecont=cont;inued EOF
>>
>> test_expect_success 'value continued on next line' '
>> - git config --list > result &&
>> + git config ${mode_prefix}list > result &&
>> test_cmp expect result
>> '
>>
>> @@ -1163,7 +1178,7 @@ Qsection.sub=section.val4
>> Qsection.sub=section.val5Q EOF test_expect_success '--null --list' '
>> - git config --null --list >result.raw &&
>> + git config ${mode_prefix}list --null >result.raw &&
>> nul_to_q <result.raw >result &&
>> echo >>result &&
>> test_cmp expect result
>> @@ -1198,6 +1213,7 @@ test_expect_success 'inner whitespace kept verbatim,
>horizontal tabs and spaces'
>> '
>>
>> test_expect_success SYMLINKS 'symlinked configuration' '
>> + test_when_finished "rm myconfig" &&
>> ln -s notyet myconfig &&
>> git config --file=myconfig test.frotz nitfol &&
>> test -h myconfig &&
>> @@ -1218,10 +1234,11 @@ test_expect_success SYMLINKS 'symlinked
>configuration' '
>> '
>>
>> test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
>> + test_when_finished "rm linktonada linktolinktonada" &&
>> ln -s doesnotexist linktonada &&
>> ln -s linktonada linktolinktonada &&
>> - test_must_fail git config --file=linktonada --list &&
>> - test_must_fail git config --file=linktolinktonada --list
>> + test_must_fail git config ${mode_prefix}list --file=linktonada &&
>> + test_must_fail git config ${mode_prefix}list --file=linktolinktonada
>> '
>>
>> test_expect_success 'check split_cmdline return' '
>> @@ -1478,7 +1495,7 @@ do
>> done
>>
>> test_expect_success 'git -c is not confused by empty environment' '
>> - GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
>> + GIT_CONFIG_PARAMETERS="" git -c x.one=1 config ${mode_prefix}list
>> '
>>
>> test_expect_success 'GIT_CONFIG_PARAMETERS handles old-style entries' '
>> @@ -1669,31 +1686,31 @@ test_expect_success 'git config ignores pairs with
>empty count' '
>> '
>>
>> test_expect_success 'git config fails with invalid count' '
>> - test_must_fail env GIT_CONFIG_COUNT=10a git config --list 2>error &&
>> + test_must_fail env GIT_CONFIG_COUNT=10a git config
>> +${mode_prefix}list 2>error &&
>> test_grep "bogus count" error &&
>> - test_must_fail env GIT_CONFIG_COUNT=9999999999999999 git config --
>list 2>error &&
>> + test_must_fail env GIT_CONFIG_COUNT=9999999999999999 git config
>> +${mode_prefix}list 2>error &&
>> test_grep "too many entries" error
>> '
>>
>> test_expect_success 'git config fails with missing config key' '
>> test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_VALUE_0="value"
>\
>> - git config --list 2>error &&
>> + git config ${mode_prefix}list 2>error &&
>> test_grep "missing config key" error '
>>
>> test_expect_success 'git config fails with missing config value' '
>> test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0="pair.one" \
>> - git config --list 2>error &&
>> + git config ${mode_prefix}list 2>error &&
>> test_grep "missing config value" error '
>>
>> test_expect_success 'git config fails with invalid config pair key' '
>> test_must_fail env GIT_CONFIG_COUNT=1 \
>> GIT_CONFIG_KEY_0= GIT_CONFIG_VALUE_0=value \
>> - git config --list &&
>> + git config ${mode_prefix}list &&
>> test_must_fail env GIT_CONFIG_COUNT=1 \
>> GIT_CONFIG_KEY_0=missing-section GIT_CONFIG_VALUE_0=value
>\
>> - git config --list
>> + git config ${mode_prefix}list
>> '
>>
>> test_expect_success 'environment overrides config file' '
>> @@ -1733,7 +1750,7 @@ test_expect_success 'git config --edit works' '
>> git config -f tmp test.value no &&
>> echo test.value=yes >expect &&
>> GIT_EDITOR="echo [test]value=yes >" git config -f tmp --edit &&
>> - git config -f tmp --list >actual &&
>> + git config ${mode_prefix}list -f tmp >actual &&
>> test_cmp expect actual
>> '
>>
>> @@ -1742,7 +1759,7 @@ test_expect_success 'git config --edit respects
>core.editor' '
>> echo test.value=yes >expect &&
>> test_config core.editor "echo [test]value=yes >" &&
>> git config -f tmp --edit &&
>> - git config -f tmp --list >actual &&
>> + git config ${mode_prefix}list -f tmp >actual &&
>> test_cmp expect actual
>> '
>>
>> @@ -2093,7 +2110,7 @@ test_expect_success '--show-origin with --list' '
>> command line: user.cmdline=true
>> EOF
>> GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=user.environ
>GIT_CONFIG_VALUE_0=true\
>> - git -c user.cmdline=true config --list --show-origin >output &&
>> + git -c user.cmdline=true config ${mode_prefix}list --show-origin
>> +>output &&
>> test_cmp expect output
>> '
>>
>> @@ -2110,7 +2127,7 @@ test_expect_success '--show-origin with --list --null' '
>> includeQcommand line:Quser.cmdline
>> trueQ
>> EOF
>> - git -c user.cmdline=true config --null --list --show-origin >output.raw &&
>> + git -c user.cmdline=true config ${mode_prefix}list --null
>> +--show-origin >output.raw &&
>> nul_to_q <output.raw >output &&
>> # The here-doc above adds a newline that the --null output would not
>> # include. Add it here to make the two comparable.
>> @@ -2124,7 +2141,7 @@ test_expect_success '--show-origin with single file' '
>> file:.git/config user.override=local
>> file:.git/config include.path=../include/relative.include
>> EOF
>> - git config --local --list --show-origin >output &&
>> + git config ${mode_prefix}list --local --show-origin >output &&
>> test_cmp expect output
>> '
>>
>> @@ -2162,7 +2179,7 @@ test_expect_success !MINGW '--show-origin escape
>special file name characters' '
>> cat >expect <<-\EOF &&
>> file:"file\" (dq) and spaces.conf" user.custom=true
>> EOF
>> - git config --file "$WEIRDLY_NAMED_FILE" --show-origin --list >output &&
>> + git config ${mode_prefix}list --file "$WEIRDLY_NAMED_FILE"
>> +--show-origin >output &&
>> test_cmp expect output
>> '
>>
>> @@ -2170,7 +2187,7 @@ test_expect_success '--show-origin stdin' '
>> cat >expect <<-\EOF &&
>> standard input: user.custom=true
>> EOF
>> - git config --file - --show-origin --list <"$CUSTOM_CONFIG_FILE" >output
>&&
>> + git config ${mode_prefix}list --file - --show-origin
>> +<"$CUSTOM_CONFIG_FILE" >output &&
>> test_cmp expect output
>> '
>>
>> @@ -2197,7 +2214,7 @@ test_expect_success '--show-origin blob' '
>> cat >expect <<-EOF &&
>> blob:$blob user.custom=true
>> EOF
>> - git config --blob=$blob --show-origin --list >output &&
>> + git config ${mode_prefix}list --blob=$blob --show-origin >output
>&&
>> test_cmp expect output
>> )
>> '
>> @@ -2213,7 +2230,7 @@ test_expect_success '--show-origin blob ref' '
>> cp "$CUSTOM_CONFIG_FILE" custom.conf &&
>> git add custom.conf &&
>> git commit -m "new config file" &&
>> - git config --blob=main:custom.conf --show-origin --list >output &&
>> + git config ${mode_prefix}list --blob=main:custom.conf --show-
>origin
>> +>output &&
>> test_cmp expect output
>> )
>> '
>> @@ -2239,13 +2256,14 @@ test_expect_success '--show-scope with --list' '
>> worktree user.worktree=true
>> command user.cmdline=true
>> EOF
>> + test_when_finished "git worktree remove wt1" &&
>> git worktree add wt1 &&
>> # We need these to test for worktree scope, but outside of this
>> # test, this is just noise
>> test_config core.repositoryformatversion 1 &&
>> test_config extensions.worktreeConfig true &&
>> git config --worktree user.worktree true &&
>> - git -c user.cmdline=true config --list --show-scope >output &&
>> + git -c user.cmdline=true config ${mode_prefix}list --show-scope
>> +>output &&
>> test_cmp expect output
>> '
>>
>> @@ -2254,7 +2272,7 @@ test_expect_success !MINGW '--show-scope with --
>blob' '
>> cat >expect <<-EOF &&
>> command user.custom=true
>> EOF
>> - git config --blob=$blob --show-scope --list >output &&
>> + git config ${mode_prefix}list --blob=$blob --show-scope >output &&
>> test_cmp expect output
>> '
>>
>> @@ -2264,7 +2282,7 @@ test_expect_success '--show-scope with --local' '
>> local user.override=local
>> local include.path=../include/relative.include
>> EOF
>> - git config --local --list --show-scope >output &&
>> + git config ${mode_prefix}list --local --show-scope >output &&
>> test_cmp expect output
>> '
>>
>> @@ -2288,7 +2306,7 @@ test_expect_success '--show-scope with --show-origin'
>'
>> local file:.git/../include/relative.include user.relative=include
>> command command line: user.cmdline=true
>> EOF
>> - git -c user.cmdline=true config --list --show-origin --show-scope >output
>&&
>> + git -c user.cmdline=true config ${mode_prefix}list --show-origin
>> +--show-scope >output &&
>> test_cmp expect output
>> '
>>
>> @@ -2329,7 +2347,7 @@ test_expect_success 'override global and system
>config' '
>> global home.config=true
>> local local.config=true
>> EOF
>> - git config --show-scope --list >output &&
>> + git config ${mode_prefix}list --show-scope >output &&
>> test_cmp expect output &&
>>
>> cat >expect <<-EOF &&
>> @@ -2338,20 +2356,20 @@ test_expect_success 'override global and system
>config' '
>> local local.config=true
>> EOF
>> GIT_CONFIG_NOSYSTEM=false GIT_CONFIG_SYSTEM=custom-system-
>config GIT_CONFIG_GLOBAL=custom-global-config \
>> - git config --show-scope --list >output &&
>> + git config ${mode_prefix}list --show-scope >output &&
>> test_cmp expect output &&
>>
>> cat >expect <<-EOF &&
>> local local.config=true
>> EOF
>> GIT_CONFIG_NOSYSTEM=false GIT_CONFIG_SYSTEM=/dev/null
>GIT_CONFIG_GLOBAL=/dev/null \
>> - git config --show-scope --list >output &&
>> + git config ${mode_prefix}list --show-scope >output &&
>> test_cmp expect output
>> '
>>
>> test_expect_success 'override global and system config with missing file' '
>> - test_must_fail env GIT_CONFIG_GLOBAL=does-not-exist
>GIT_CONFIG_SYSTEM=/dev/null git config --global --list &&
>> - test_must_fail env GIT_CONFIG_GLOBAL=/dev/null
>GIT_CONFIG_SYSTEM=does-not-exist git config --system --list &&
>> + test_must_fail env GIT_CONFIG_GLOBAL=does-not-exist
>GIT_CONFIG_SYSTEM=/dev/null git config ${mode_prefix}list --global &&
>> + test_must_fail env GIT_CONFIG_GLOBAL=/dev/null
>> +GIT_CONFIG_SYSTEM=does-not-exist git config ${mode_prefix}list
>> +--system &&
>> GIT_CONFIG_GLOBAL=does-not-exist GIT_CONFIG_SYSTEM=does-not-exist
>> git version '
>>
>> @@ -2478,7 +2496,7 @@ test_expect_success 'set all config with value-pattern' '
>> # no match => add new entry
>> cp initial config &&
>> git config --file=config abc.key two a+ &&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-\EOF &&
>> abc.key=one
>> abc.key=two
>> @@ -2491,7 +2509,7 @@ test_expect_success 'set all config with value-pattern' '
>>
>> # multiple values, no match => add
>> git config --file=config abc.key three a+ &&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-\EOF &&
>> abc.key=one
>> abc.key=two
>> @@ -2501,7 +2519,7 @@ test_expect_success 'set all config with value-pattern' '
>>
>> # single match => replace
>> git config --file=config abc.key four h+ &&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-\EOF &&
>> abc.key=one
>> abc.key=two
>> @@ -2516,7 +2534,7 @@ test_expect_success '--replace-all and value-pattern' '
>> git config --file=config --add abc.key two &&
>> git config --file=config --add abc.key three &&
>> git config --file=config --replace-all abc.key four "o+" &&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-\EOF &&
>> abc.key=four
>> abc.key=three
>> @@ -2534,7 +2552,7 @@ test_expect_success 'refuse --fixed-value for
>incompatible actions' '
>> test_must_fail git config --file=config --fixed-value --get-urlmatch dev.null
>bogus &&
>> test_must_fail git config --file=config --fixed-value --rename-section dev null
>&&
>> test_must_fail git config --file=config --fixed-value --remove-section dev &&
>> - test_must_fail git config --file=config --fixed-value --list &&
>> + test_must_fail git config ${mode_prefix}list --file=config
>> +--fixed-value &&
>> test_must_fail git config --file=config --fixed-value --get-color dev.null &&
>> test_must_fail git config --file=config --fixed-value
>> --get-colorbool dev.null &&
>>
>> @@ -2555,7 +2573,7 @@ test_expect_success '--fixed-value uses exact string
>matching' '
>>
>> cp initial config &&
>> git config --file=config fixed.test bogus "$META" &&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-EOF &&
>> fixed.test=$META
>> fixed.test=bogus
>> @@ -2564,7 +2582,7 @@ test_expect_success '--fixed-value uses exact string
>matching' '
>>
>> cp initial config &&
>> git config --file=config --fixed-value fixed.test bogus "$META" &&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-\EOF &&
>> fixed.test=bogus
>> EOF
>> @@ -2582,7 +2600,7 @@ test_expect_success '--fixed-value uses exact string
>matching' '
>>
>> cp initial config &&
>> git config --file=config --replace-all fixed.test bogus "$META" &&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-EOF &&
>> fixed.test=$META
>> fixed.test=bogus
>> @@ -2590,7 +2608,7 @@ test_expect_success '--fixed-value uses exact string
>matching' '
>> test_cmp expect actual &&
>>
>> git config --file=config --fixed-value --replace-all fixed.test bogus "$META"
>&&
>> - git config --file=config --list >actual &&
>> + git config ${mode_prefix}list --file=config >actual &&
>> cat >expect <<-EOF &&
>> fixed.test=bogus
>> fixed.test=bogus
>> @@ -2751,4 +2769,6 @@ test_expect_success 'specifying multiple modes causes
>failure' '
>> test_cmp expect err
>> '
>>
>> +done
>> +
>>
>Nit: Wouldn't it be better if the tests are indented here? That way you know it's part
>of a loop.
Removing the --list option is going to break backward compatibility for users who script the use of config for things like setup, clone automation, etc. Adding list as a sub-command could (but should not) cause ambiguities between a list and configuration value. If you are going to add 'list', please do not remove '--list'. That is a breaking change.
Thanks,
Randall
next prev parent reply other threads:[~2024-05-03 13:19 UTC|newest]
Thread overview: 113+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-06 11:31 [PATCH 0/8] builtin/config: introduce subcommands Patrick Steinhardt
2024-03-06 11:31 ` [PATCH 1/8] builtin/config: move option array around Patrick Steinhardt
2024-03-06 11:31 ` [PATCH 2/8] builtin/config: move "fixed-value" option to correct group Patrick Steinhardt
2024-03-06 11:31 ` [PATCH 3/8] builtin/config: use `OPT_CMDMODE()` to specify modes Patrick Steinhardt
2024-03-06 23:52 ` Taylor Blau
2024-03-07 7:02 ` Patrick Steinhardt
2024-03-06 11:31 ` [PATCH 4/8] builtin/config: move modes into separate functions Patrick Steinhardt
2024-03-06 11:31 ` [PATCH 5/8] builtin/config: track subcommands by action Patrick Steinhardt
2024-03-06 21:54 ` Jean-Noël AVILA
2024-03-07 6:37 ` Patrick Steinhardt
2024-03-07 0:10 ` Taylor Blau
2024-03-07 6:36 ` Patrick Steinhardt
2024-03-06 11:31 ` [PATCH 6/8] builtin/config: introduce subcommands Patrick Steinhardt
2024-03-06 21:38 ` Karthik Nayak
2024-03-07 7:14 ` Patrick Steinhardt
2024-03-06 11:31 ` [PATCH 7/8] t1300: exercise both old- and new-style modes Patrick Steinhardt
2024-03-06 11:32 ` [PATCH 8/8] Documentation/git-config: update to new-style syntax Patrick Steinhardt
2024-03-07 6:57 ` Eric Sunshine
2024-03-07 7:33 ` Patrick Steinhardt
2024-03-06 17:06 ` [PATCH 0/8] builtin/config: introduce subcommands Junio C Hamano
2024-03-06 23:46 ` Taylor Blau
2024-03-06 23:52 ` Junio C Hamano
2024-03-07 0:13 ` Taylor Blau
2024-03-07 0:31 ` Dragan Simic
2024-03-07 6:31 ` Patrick Steinhardt
2024-03-07 13:22 ` Junio C Hamano
2024-03-06 22:49 ` Kristoffer Haugsbakk
2024-03-11 23:19 ` [PATCH v2 00/13] " Patrick Steinhardt
2024-03-11 23:19 ` [PATCH v2 01/13] builtin/config: move option array around Patrick Steinhardt
2024-03-11 23:19 ` [PATCH v2 02/13] builtin/config: move "fixed-value" option to correct group Patrick Steinhardt
2024-03-11 23:20 ` [PATCH v2 03/13] builtin/config: use `OPT_CMDMODE()` to specify modes Patrick Steinhardt
2024-03-11 23:20 ` [PATCH v2 04/13] builtin/config: pull out function to handle config location Patrick Steinhardt
2024-03-11 23:20 ` [PATCH v2 05/13] builtin/config: pull out function to handle `--null` Patrick Steinhardt
2024-03-11 23:20 ` [PATCH v2 06/13] builtin/config: introduce "list" subcommand Patrick Steinhardt
2024-03-13 2:45 ` Eric Sunshine
2024-03-27 8:42 ` Patrick Steinhardt
2024-03-11 23:20 ` [PATCH v2 07/13] builtin/config: introduce "get" subcommand Patrick Steinhardt
2024-03-13 3:11 ` Eric Sunshine
2024-03-27 8:42 ` Patrick Steinhardt
2024-03-11 23:20 ` [PATCH v2 08/13] builtin/config: introduce "set" subcommand Patrick Steinhardt
2024-03-11 23:21 ` [PATCH v2 09/13] builtin/config: introduce "unset" subcommand Patrick Steinhardt
2024-03-11 23:21 ` [PATCH v2 10/13] builtin/config: introduce "rename-section" subcommand Patrick Steinhardt
2024-03-11 23:21 ` [PATCH v2 11/13] builtin/config: introduce "remove-section" subcommand Patrick Steinhardt
2024-03-11 23:21 ` [PATCH v2 12/13] builtin/config: introduce "edit" subcommand Patrick Steinhardt
2024-03-11 23:21 ` [PATCH v2 13/13] builtin/config: display subcommand help Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 00/13] builtin/config: introduce subcommands Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 01/13] builtin/config: move option array around Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 02/13] builtin/config: move "fixed-value" option to correct group Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 03/13] builtin/config: use `OPT_CMDMODE()` to specify modes Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 04/13] builtin/config: pull out function to handle config location Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 05/13] builtin/config: pull out function to handle `--null` Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 06/13] builtin/config: introduce "list" subcommand Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 07/13] builtin/config: introduce "get" subcommand Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 08/13] builtin/config: introduce "set" subcommand Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 09/13] builtin/config: introduce "unset" subcommand Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 10/13] builtin/config: introduce "rename-section" subcommand Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 11/13] builtin/config: introduce "remove-section" subcommand Patrick Steinhardt
2024-03-27 8:46 ` [PATCH v3 12/13] builtin/config: introduce "edit" subcommand Patrick Steinhardt
2024-03-27 8:47 ` [PATCH v3 13/13] builtin/config: display subcommand help Patrick Steinhardt
2024-03-27 8:53 ` [PATCH v3 00/13] builtin/config: introduce subcommands Eric Sunshine
2024-03-27 9:16 ` Patrick Steinhardt
2024-05-03 9:56 ` [PATCH v4 00/14] " Patrick Steinhardt
2024-05-03 9:56 ` [PATCH v4 01/14] config: clarify memory ownership when preparing comment strings Patrick Steinhardt
2024-05-03 10:13 ` Kristoffer Haugsbakk
2024-05-03 9:56 ` [PATCH v4 02/14] builtin/config: move option array around Patrick Steinhardt
2024-05-03 9:56 ` [PATCH v4 03/14] builtin/config: move "fixed-value" option to correct group Patrick Steinhardt
2024-05-03 12:28 ` Karthik Nayak
2024-05-06 9:34 ` Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 04/14] builtin/config: use `OPT_CMDMODE()` to specify modes Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 05/14] builtin/config: pull out function to handle config location Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 06/14] builtin/config: pull out function to handle `--null` Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 07/14] builtin/config: introduce "list" subcommand Patrick Steinhardt
2024-05-03 13:08 ` Karthik Nayak
2024-05-03 13:13 ` rsbecker [this message]
2024-05-03 16:01 ` Junio C Hamano
2024-05-06 7:51 ` Patrick Steinhardt
2024-05-06 17:13 ` Junio C Hamano
2024-05-06 18:33 ` rsbecker
2024-05-06 18:45 ` Dragan Simic
2024-05-07 6:20 ` Kristoffer Haugsbakk
2024-05-06 21:33 ` Git 3.0? Junio C Hamano
2024-05-07 4:18 ` Patrick Steinhardt
2024-05-07 4:02 ` [PATCH v4 07/14] builtin/config: introduce "list" subcommand Patrick Steinhardt
2024-05-06 7:58 ` Patrick Steinhardt
2024-05-06 11:26 ` Karthik Nayak
2024-05-03 9:57 ` [PATCH v4 08/14] builtin/config: introduce "get" subcommand Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 09/14] builtin/config: introduce "set" subcommand Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 10/14] builtin/config: introduce "unset" subcommand Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 11/14] builtin/config: introduce "rename-section" subcommand Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 12/14] builtin/config: introduce "remove-section" subcommand Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 13/14] builtin/config: introduce "edit" subcommand Patrick Steinhardt
2024-05-03 9:57 ` [PATCH v4 14/14] builtin/config: display subcommand help Patrick Steinhardt
2024-05-03 13:36 ` [PATCH v4 00/14] builtin/config: introduce subcommands Dragan Simic
2024-05-03 16:09 ` Junio C Hamano
2024-05-06 8:55 ` [PATCH v5 " Patrick Steinhardt
2024-05-06 8:55 ` [PATCH v5 01/14] config: clarify memory ownership when preparing comment strings Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 02/14] builtin/config: move option array around Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 03/14] builtin/config: move "fixed-value" option to correct group Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 04/14] builtin/config: use `OPT_CMDMODE()` to specify modes Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 05/14] builtin/config: pull out function to handle config location Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 06/14] builtin/config: pull out function to handle `--null` Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 07/14] builtin/config: introduce "list" subcommand Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 08/14] builtin/config: introduce "get" subcommand Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 09/14] builtin/config: introduce "set" subcommand Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 10/14] builtin/config: introduce "unset" subcommand Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 11/14] builtin/config: introduce "rename-section" subcommand Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 12/14] builtin/config: introduce "remove-section" subcommand Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 13/14] builtin/config: introduce "edit" subcommand Patrick Steinhardt
2024-05-06 8:56 ` [PATCH v5 14/14] builtin/config: display subcommand help Patrick Steinhardt
2024-05-06 11:30 ` [PATCH v5 00/14] builtin/config: introduce subcommands Karthik Nayak
2024-05-06 20:21 ` Taylor Blau
2024-05-06 20:38 ` rsbecker
2024-05-07 4:07 ` Patrick Steinhardt
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='015b01da9d5b$bbe59120$33b0b360$@nexbridge.com' \
--to=rsbecker@nexbridge.com \
--cc=code@khaugsbakk.name \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jn.avila@free.fr \
--cc=karthik.188@gmail.com \
--cc=me@ttaylorr.com \
--cc=ps@pks.im \
--cc=sunshine@sunshineco.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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).