Message ID | cover.1711527811.git.ps@pks.im (mailing list archive) |
---|---|
Headers | show |
Series | builtin/config: introduce subcommands | expand |
On Wed, Mar 27, 2024 at 4:46 AM Patrick Steinhardt <ps@pks.im> wrote: > this is the third version of my patch series that aims to add > subcommands to git-config(1) in a backwards-compatible manner. > > There's only been a few changes compared to v2 based on Eric's comments: > > 7: 8ceced0fc5 ! 7: eee1fae50c builtin/config: introduce "get" subcommand > -+ With "get", Return all values for a multi-valued key. > ++ With `get`, Return all values for a multi-valued key. Better. This fixes the typesetting problem but misses the s/Return/return/ mentioned earlier[1]. [1]: https://lore.kernel.org/git/CAPig+cRwh4HCi=Q01tGJ0WOb59iE18HWSCNxGogcreOz+2w1WA@mail.gmail.com/
On Wed, Mar 27, 2024 at 04:53:35AM -0400, Eric Sunshine wrote: > On Wed, Mar 27, 2024 at 4:46 AM Patrick Steinhardt <ps@pks.im> wrote: > > this is the third version of my patch series that aims to add > > subcommands to git-config(1) in a backwards-compatible manner. > > > > There's only been a few changes compared to v2 based on Eric's comments: > > > > 7: 8ceced0fc5 ! 7: eee1fae50c builtin/config: introduce "get" subcommand > > -+ With "get", Return all values for a multi-valued key. > > ++ With `get`, Return all values for a multi-valued key. > > Better. This fixes the typesetting problem but misses the > s/Return/return/ mentioned earlier[1]. > > [1]: https://lore.kernel.org/git/CAPig+cRwh4HCi=Q01tGJ0WOb59iE18HWSCNxGogcreOz+2w1WA@mail.gmail.com/ Ah, sorry, I missed that one. Fixed locally, will send out with the inevitable v4 of this patch series. Thanks! Patrick
Hi, this is the third version of my patch series that aims to add subcommands to git-config(1) in a backwards-compatible manner. There's only been a few changes compared to v2 based on Eric's comments: - Touched up a commit message to explain why I had to add cleanups to tests. - Reformulate "implicit modes" in a comment to clarify that this refers to the legacy-style modes. - Reformulated documentation of the "get" subcommand. - Use `BUG` instead of `echo >&2 && exit 1`. - Removed duplicate example in the documentation. - Fixed conflicts with 86f9ce7dd6 (docs: fix typo in git-config `--default`, 2024-03-16) and 7823a51203 (docs: clarify file options in git-config `--edit`, 2024-03-16) by rebasing onto latest `master`. Thanks! Patrick Patrick Steinhardt (13): builtin/config: move option array around builtin/config: move "fixed-value" option to correct group builtin/config: use `OPT_CMDMODE()` to specify modes builtin/config: pull out function to handle config location builtin/config: pull out function to handle `--null` builtin/config: introduce "list" subcommand builtin/config: introduce "get" subcommand builtin/config: introduce "set" subcommand builtin/config: introduce "unset" subcommand builtin/config: introduce "rename-section" subcommand builtin/config: introduce "remove-section" subcommand builtin/config: introduce "edit" subcommand builtin/config: display subcommand help Documentation/git-config.txt | 219 +++++++++------- builtin/config.c | 496 ++++++++++++++++++++++++++++------- t/t0450/txt-help-mismatches | 1 - t/t1300-config.sh | 416 ++++++++++++++++++----------- 4 files changed, 785 insertions(+), 347 deletions(-) Range-diff against v2: 1: 1f21e7fa0d = 1: bfcb50e393 builtin/config: move option array around 2: 54e536394a = 2: ff428d8a22 builtin/config: move "fixed-value" option to correct group 3: 49d190ac24 = 3: e049c05713 builtin/config: use `OPT_CMDMODE()` to specify modes 4: 80093f3908 = 4: 41585803bf builtin/config: pull out function to handle config location 5: 283a199578 = 5: 95f661f267 builtin/config: pull out function to handle `--null` 6: 53401299fa ! 6: b50f32d074 builtin/config: introduce "list" subcommand @@ Commit message 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: Valid `<type>`'s include: --show-origin:: @@ Documentation/git-config.txt: Valid `<type>`'s include: When using `--get`, and the requested variable is not found, behave as if - <value> were the value assigned to the that variable. + <value> were the value assigned to that variable. +DEPRECATED MODES +---------------- @@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix + * 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 implicit modes. ++ * 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); @@ t/t1300-config.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + mode_prefix="" + ;; +*) -+ echo "unknown mode $mode" >&2 -+ exit 1;; ++ BUG "unknown mode $mode";; +esac + test_expect_success 'clear default config' ' 7: 8ceced0fc5 ! 7: eee1fae50c builtin/config: introduce "get" subcommand @@ Documentation/git-config.txt: COMMANDS List all variables set in config file, along with their values. +get:: -+ Get value for one or more config options. Values can be filtered by -+ regexes and URLs.Returns error code 1 if the key was not found and the -+ last value if multiple key values were found. If `--all` is set, then -+ all values will be shown. ++ Emits the value of the specified key. If key is present multiple times ++ in the configuration, emits the last value. If `--all` is specified, ++ emits all values associated with key. Returns error code 1 if key is ++ not present. + [[OPTIONS]] OPTIONS @@ Documentation/git-config.txt: OPTIONS ---get-all:: - Like get, but returns all values for a multi-valued key. +--all:: -+ With "get", Return all values for a multi-valued key. ++ With `get`, Return all values for a multi-valued key. ---get-regexp:: - Like --get-all, but interprets the name as a regular expression and @@ Documentation/git-config.txt: OPTIONS - in which section and variable names are lowercased, but subsection - names are not. +---regexp:: -+ With "get", interpret the name as a regular expression. Regular ++ With `get`, interpret the name as a regular expression. Regular + expression matching is currently case-sensitive and done against a + canonicalized version of the key in which section and variable names + are lowercased, but subsection names are not. @@ Documentation/git-config.txt: Valid `<type>`'s include: --default <value>:: - When using `--get`, and the requested variable is not found, behave as if + When using `get`, and the requested variable is not found, behave as if - <value> were the value assigned to the that variable. + <value> were the value assigned to that variable. DEPRECATED MODES @@ Documentation/git-config.txt: DEPRECATED MODES @@ Documentation/git-config.txt: you have to provide a regex matching the value of ------------ -% git config --get core.filemode -+% git config get core.filemode - ------------ - - or - - ------------ +------------- +- +-or +- +------------- -% git config core.filemode +% git config get core.filemode ------------ @@ t/t1300-config.sh: do + mode_get_regexp="get --regexp --all --show-names" ;; *) - echo "unknown mode $mode" >&2 + BUG "unknown mode $mode";; @@ t/t1300-config.sh: test_expect_success 'multi-valued get-all returns all' ' wow wow2 for me 8: aa5c9743ad ! 8: e2815affab builtin/config: introduce "set" subcommand @@ Documentation/git-config.txt: You can query/set/replace/unset options with this lines, a `value-pattern` (which is an extended regular expression, unless the `--fixed-value` option is given) needs to be given. Only the @@ Documentation/git-config.txt: get:: - last value if multiple key values were found. If `--all` is set, then - all values will be shown. + emits all values associated with key. Returns error code 1 if key is + not present. +set:: + Set value for one or more config options. By default, this command @@ Documentation/git-config.txt: OPTIONS + values. This is the same as providing '--value=^$' in `set`. --all:: - With "get", Return all values for a multi-valued key. + With `get`, Return all values for a multi-valued key. @@ Documentation/git-config.txt: recommended to migrate to the new syntax. 'git config <name>':: Replaced by `git config get <name>`. @@ t/t1300-config.sh: legacy) + mode_replace_all="set --all" ;; *) - echo "unknown mode $mode" >&2 + BUG "unknown mode $mode";; @@ t/t1300-config.sh: cat > expect << EOF penguin = little blue EOF 9: c8a44b6189 ! 9: 90f055ae1d builtin/config: introduce "unset" subcommand @@ t/t1300-config.sh: subcommands) + mode_unset_all="unset --all" ;; *) - echo "unknown mode $mode" >&2 + BUG "unknown mode $mode";; @@ t/t1300-config.sh: foo = bar EOF 10: a3c66431b0 = 10: 3e360b1f47 builtin/config: introduce "rename-section" subcommand 11: 6314d51cec = 11: d610b5fda1 builtin/config: introduce "remove-section" subcommand 12: 12011714e3 ! 12: 4a6512c88a builtin/config: introduce "edit" subcommand @@ Documentation/git-config.txt: rename-section:: +edit:: + Opens an editor to modify the specified config file; either -+ `--system`, `--global`, or repository (default). ++ `--system`, `--global`, `--local` (default), `--worktree`, or ++ `--file <config-file>`. + [[OPTIONS]] OPTIONS @@ Documentation/git-config.txt: Valid `<type>`'s include: --e:: ---edit:: - Opens an editor to modify the specified config file; either -- `--system`, `--global`, or repository (default). +- `--system`, `--global`, `--local` (default), `--worktree`, or +- `--file <config-file>`. - --[no-]includes:: Respect `include.*` directives in config files when looking up 13: 2046f6652a ! 13: 657d1355b5 builtin/config: display subcommand help @@ builtin/config.c: static const char *const builtin_config_usage[] = { }; @@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix) - * us when parsing the implicit modes. + * 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); base-commit: c75fd8d8150afdf836b63a8e0534d9b9e3e111ba