git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 00/13] builtin/config: introduce subcommands

From
Patrick Steinhardt <ps@pks.im>
Date
Mar 27, 2024, 08:46 UTC
Message-ID
<cover.1711527811.git.ps@pks.im>
In-Reply-To
<cover.1709724089.git.ps@pks.im>
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
-- 
2.44.GIT
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 46 of 116 in “builtin/config: introduce subcommands”
  1. 0/8 builtin/config: introduce subcommandsPatrick Steinhardt, Mar 6, 2024
  2. 1/8 builtin/config: move option array aroundPatrick Steinhardt, Mar 6, 2024
  3. 2/8 builtin/config: move "fixed-value" option to correct groupPatrick Steinhardt, Mar 6, 2024
  4. 3/8 builtin/config: use `OPT_CMDMODE()` to specify modesPatrick Steinhardt, Mar 6, 2024
  5. Taylor BlauMar 6, 2024
  6. Patrick SteinhardtMar 7, 2024
  7. 4/8 builtin/config: move modes into separate functionsPatrick Steinhardt, Mar 6, 2024
  8. 5/8 builtin/config: track subcommands by actionPatrick Steinhardt, Mar 6, 2024
  9. Jean-Noël AVILAMar 6, 2024
  10. Patrick SteinhardtMar 7, 2024
  11. Taylor BlauMar 7, 2024
  12. Patrick SteinhardtMar 7, 2024
  13. 6/8 builtin/config: introduce subcommandsPatrick Steinhardt, Mar 6, 2024
  14. Karthik NayakMar 6, 2024
  15. Patrick SteinhardtMar 7, 2024
  16. 7/8 t1300: exercise both old- and new-style modesPatrick Steinhardt, Mar 6, 2024
  17. 8/8 Documentation/git-config: update to new-style syntaxPatrick Steinhardt, Mar 6, 2024
  18. Eric SunshineMar 7, 2024
  19. Patrick SteinhardtMar 7, 2024
  20. Junio C HamanoMar 6, 2024
  21. Taylor BlauMar 6, 2024
  22. Junio C HamanoMar 6, 2024
  23. Taylor BlauMar 7, 2024
  24. Dragan SimicMar 7, 2024
  25. Patrick SteinhardtMar 7, 2024
  26. Junio C HamanoMar 7, 2024
  27. Kristoffer HaugsbakkMar 6, 2024
  28. 00/13 builtin/config: introduce subcommandsPatrick Steinhardt, Mar 11, 2024
  29. 01/13 builtin/config: move option array aroundPatrick Steinhardt, Mar 11, 2024
  30. 02/13 builtin/config: move "fixed-value" option to correct groupPatrick Steinhardt, Mar 11, 2024
  31. 03/13 builtin/config: use `OPT_CMDMODE()` to specify modesPatrick Steinhardt, Mar 11, 2024
  32. 04/13 builtin/config: pull out function to handle config locationPatrick Steinhardt, Mar 11, 2024
  33. 05/13 builtin/config: pull out function to handle `--null`Patrick Steinhardt, Mar 11, 2024
  34. 06/13 builtin/config: introduce "list" subcommandPatrick Steinhardt, Mar 11, 2024
  35. Eric SunshineMar 13, 2024
  36. Patrick SteinhardtMar 27, 2024
  37. 07/13 builtin/config: introduce "get" subcommandPatrick Steinhardt, Mar 11, 2024
  38. Eric SunshineMar 13, 2024
  39. Patrick SteinhardtMar 27, 2024
  40. 08/13 builtin/config: introduce "set" subcommandPatrick Steinhardt, Mar 11, 2024
  41. 09/13 builtin/config: introduce "unset" subcommandPatrick Steinhardt, Mar 11, 2024
  42. 10/13 builtin/config: introduce "rename-section" subcommandPatrick Steinhardt, Mar 11, 2024
  43. 11/13 builtin/config: introduce "remove-section" subcommandPatrick Steinhardt, Mar 11, 2024
  44. 12/13 builtin/config: introduce "edit" subcommandPatrick Steinhardt, Mar 11, 2024
  45. 13/13 builtin/config: display subcommand helpPatrick Steinhardt, Mar 11, 2024
  46. 00/13 builtin/config: introduce subcommandsPatrick Steinhardt, Mar 27, 2024
  47. 01/13 builtin/config: move option array aroundPatrick Steinhardt, Mar 27, 2024
  48. 02/13 builtin/config: move "fixed-value" option to correct groupPatrick Steinhardt, Mar 27, 2024
  49. 03/13 builtin/config: use `OPT_CMDMODE()` to specify modesPatrick Steinhardt, Mar 27, 2024
  50. 04/13 builtin/config: pull out function to handle config locationPatrick Steinhardt, Mar 27, 2024
  51. 05/13 builtin/config: pull out function to handle `--null`Patrick Steinhardt, Mar 27, 2024
  52. 06/13 builtin/config: introduce "list" subcommandPatrick Steinhardt, Mar 27, 2024
  53. 07/13 builtin/config: introduce "get" subcommandPatrick Steinhardt, Mar 27, 2024
  54. 08/13 builtin/config: introduce "set" subcommandPatrick Steinhardt, Mar 27, 2024
  55. 09/13 builtin/config: introduce "unset" subcommandPatrick Steinhardt, Mar 27, 2024
  56. 10/13 builtin/config: introduce "rename-section" subcommandPatrick Steinhardt, Mar 27, 2024
  57. 11/13 builtin/config: introduce "remove-section" subcommandPatrick Steinhardt, Mar 27, 2024
  58. 12/13 builtin/config: introduce "edit" subcommandPatrick Steinhardt, Mar 27, 2024
  59. 13/13 builtin/config: display subcommand helpPatrick Steinhardt, Mar 27, 2024
  60. Eric SunshineMar 27, 2024
  61. Patrick SteinhardtMar 27, 2024
  62. 00/14 builtin/config: introduce subcommandsPatrick Steinhardt, May 3, 2024
  63. 01/14 config: clarify memory ownership when preparing comment stringsPatrick Steinhardt, May 3, 2024
  64. Kristoffer HaugsbakkMay 3, 2024
  65. 02/14 builtin/config: move option array aroundPatrick Steinhardt, May 3, 2024
  66. 03/14 builtin/config: move "fixed-value" option to correct groupPatrick Steinhardt, May 3, 2024
  67. Karthik NayakMay 3, 2024
  68. Patrick SteinhardtMay 6, 2024
  69. 04/14 builtin/config: use `OPT_CMDMODE()` to specify modesPatrick Steinhardt, May 3, 2024
  70. 05/14 builtin/config: pull out function to handle config locationPatrick Steinhardt, May 3, 2024
  71. 06/14 builtin/config: pull out function to handle `--null`Patrick Steinhardt, May 3, 2024
  72. 07/14 builtin/config: introduce "list" subcommandPatrick Steinhardt, May 3, 2024
  73. Karthik NayakMay 3, 2024
  74. rsbecker@nexbridge.comMay 3, 2024
  75. Junio C HamanoMay 3, 2024
  76. Patrick SteinhardtMay 6, 2024
  77. Junio C HamanoMay 6, 2024
  78. rsbecker@nexbridge.comMay 6, 2024
  79. Dragan SimicMay 6, 2024
  80. Kristoffer HaugsbakkMay 7, 2024
  81. Git 3.0?Junio C Hamano, May 6, 2024
  82. Patrick SteinhardtMay 7, 2024
  83. Patrick SteinhardtMay 7, 2024
  84. Patrick SteinhardtMay 6, 2024
  85. Karthik NayakMay 6, 2024
  86. 08/14 builtin/config: introduce "get" subcommandPatrick Steinhardt, May 3, 2024
  87. 09/14 builtin/config: introduce "set" subcommandPatrick Steinhardt, May 3, 2024
  88. 10/14 builtin/config: introduce "unset" subcommandPatrick Steinhardt, May 3, 2024
  89. 11/14 builtin/config: introduce "rename-section" subcommandPatrick Steinhardt, May 3, 2024
  90. 12/14 builtin/config: introduce "remove-section" subcommandPatrick Steinhardt, May 3, 2024
  91. 13/14 builtin/config: introduce "edit" subcommandPatrick Steinhardt, May 3, 2024
  92. 14/14 builtin/config: display subcommand helpPatrick Steinhardt, May 3, 2024
  93. Dragan SimicMay 3, 2024
  94. Junio C HamanoMay 3, 2024
  95. 00/14 builtin/config: introduce subcommandsPatrick Steinhardt, May 6, 2024
  96. 01/14 config: clarify memory ownership when preparing comment stringsPatrick Steinhardt, May 6, 2024
  97. 02/14 builtin/config: move option array aroundPatrick Steinhardt, May 6, 2024
  98. 03/14 builtin/config: move "fixed-value" option to correct groupPatrick Steinhardt, May 6, 2024
  99. 04/14 builtin/config: use `OPT_CMDMODE()` to specify modesPatrick Steinhardt, May 6, 2024
  100. 05/14 builtin/config: pull out function to handle config locationPatrick Steinhardt, May 6, 2024
  101. 06/14 builtin/config: pull out function to handle `--null`Patrick Steinhardt, May 6, 2024
  102. 07/14 builtin/config: introduce "list" subcommandPatrick Steinhardt, May 6, 2024
  103. 08/14 builtin/config: introduce "get" subcommandPatrick Steinhardt, May 6, 2024
  104. SZEDER GáborAug 3, 2025
  105. Junio C HamanoAug 3, 2025
  106. Patrick SteinhardtSep 11, 2025
  107. 09/14 builtin/config: introduce "set" subcommandPatrick Steinhardt, May 6, 2024
  108. 10/14 builtin/config: introduce "unset" subcommandPatrick Steinhardt, May 6, 2024
  109. 11/14 builtin/config: introduce "rename-section" subcommandPatrick Steinhardt, May 6, 2024
  110. 12/14 builtin/config: introduce "remove-section" subcommandPatrick Steinhardt, May 6, 2024
  111. 13/14 builtin/config: introduce "edit" subcommandPatrick Steinhardt, May 6, 2024
  112. 14/14 builtin/config: display subcommand helpPatrick Steinhardt, May 6, 2024
  113. Karthik NayakMay 6, 2024
  114. Taylor BlauMay 6, 2024
  115. rsbecker@nexbridge.comMay 6, 2024
  116. Patrick SteinhardtMay 7, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.