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

Re: [PATCH v2 3/7] config: convert multi_replace to flags

From
Emily Shaffer <emilyshaffer@google.com>
Date
Nov 23, 2020, 21:43 UTC
Message-ID
<20201123214322.GC499823@google.com>
In-Reply-To
<0c152faa00881483db0a59f4c5bc7204ebed8966.1606147507.git.gitgitgadget@gmail.com>
On Mon, Nov 23, 2020 at 04:05:03PM +0000, Derrick Stolee via GitGitGadget wrote:
Show 28 quoted lines
> 
> 
> We will extend the flexibility of the config API. Before doing so, let's
> take an existing 'int multi_replace' parameter and replace it with a new
> 'unsigned flags' parameter that can take multiple options as a bit field.
> 
> Update all callers that specified multi_replace to now specify the
> CONFIG_FLAGS_MULTI_REPLACE flag. To add more clarity, extend the
> documentation of git_config_set_multivar_in_file() including a clear
> labeling of its arguments. Other config API methods in config.h require
> only a change of the final parameter from 'int' to 'unsigned'.
> 
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
> diff --git a/builtin/branch.c b/builtin/branch.c
> index e82301fb1b..5ce3844d22 100644
> --- a/builtin/branch.c
> +++ b/builtin/branch.c
> @@ -829,10 +829,10 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
>  			die(_("Branch '%s' has no upstream information"), branch->name);
>  
>  		strbuf_addf(&buf, "branch.%s.remote", branch->name);
> -		git_config_set_multivar(buf.buf, NULL, NULL, 1);
> +		git_config_set_multivar(buf.buf, NULL, NULL, CONFIG_FLAGS_MULTI_REPLACE);
>  		strbuf_reset(&buf);
>  		strbuf_addf(&buf, "branch.%s.merge", branch->name);
> -		git_config_set_multivar(buf.buf, NULL, NULL, 1);
> +		git_config_set_multivar(buf.buf, NULL, NULL, CONFIG_FLAGS_MULTI_REPLACE);
Converting callers. Straightforward.
[snipping more similar work]
Show 14 quoted lines
> diff --git a/config.c b/config.c
> index 2b79fe76ad..096f2eae0d 100644
> --- a/config.c
> +++ b/config.c
> @@ -2716,9 +2716,9 @@ void git_config_set(const char *key, const char *value)
>   * if value_regex!=NULL, disregard key/value pairs where value does not match.
>   * if value_regex==CONFIG_REGEX_NONE, do not match any existing values
>   *     (only add a new one)
> - * if multi_replace==0, nothing, or only one matching key/value is replaced,
> - *     else all matching key/values (regardless how many) are removed,
> - *     before the new pair is written.
> + * if (flags & CONFIG_FLAGS_MULTI_REPLACE) == 0, at most one matching
> + *     key/value is replaced, else all matching key/values (regardless
> + *     how many) are removed, before the new pair is written.

This documentation to me sounds like the question you asked on-list the other day: "does replace-all turn many configs into one, or many configs into many with the same value?" Is it reflected in user-facing documentation? Looks like no - you might have a good opportunity here to make that more clear.

Show 9 quoted lines
>   *
>   * Returns 0 on success.
>   *
> @@ -2739,7 +2739,7 @@ void git_config_set(const char *key, const char *value)
>  int git_config_set_multivar_in_file_gently(const char *config_filename,
>  					   const char *key, const char *value,
>  					   const char *value_regex,
> -					   int multi_replace)
> +					   unsigned flags)

Well, I wanted to complain about using 'unsigned' instead of 'unsigned int', but 'git grep -P "unsigned(?! int)"' tells me that it's not a thing anybody else seems to mind. So I'll just grumble in my corner instead :)

Show 18 quoted lines
>  {
>  	int fd = -1, in_fd = -1;
>  	int ret;
> @@ -2756,7 +2756,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
>  	if (ret)
>  		goto out_free;
>  
> -	store.multi_replace = multi_replace;
> +	store.multi_replace = (flags & CONFIG_FLAGS_MULTI_REPLACE) != 0;
>  
>  	if (!config_filename)
>  		config_filename = filename_buf = git_pathdup("config");
> @@ -2845,7 +2845,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
>  
>  		/* if nothing to unset, or too many matches, error out */
>  		if ((store.seen_nr == 0 && value == NULL) ||
> -		    (store.seen_nr > 1 && multi_replace == 0)) {
> +		    (store.seen_nr > 1 && !store.multi_replace)) {

Huh, I wonder why 'store.multi_replace' wasn't used here before, since it was bothered to be set at earlier. Ah well.

>  void git_config_set_multivar_in_file(const char *config_filename,
>  				     const char *key, const char *value,
> -				     const char *value_regex, int multi_replace)
> +				     const char *value_regex, unsigned flags)
And some more signature conversions. [snip]
Show 19 quoted lines
>  /**
>   * takes four parameters:
> @@ -276,13 +289,15 @@ int git_config_set_multivar_in_file_gently(const char *, const char *, const cha
>   * - the value regex, as a string. It will disregard key/value pairs where value
>   *   does not match.
>   *
> - * - a multi_replace value, as an int. If value is equal to zero, nothing or only
> - *   one matching key/value is replaced, else all matching key/values (regardless
> - *   how many) are removed, before the new pair is written.
> + * - a flags value with bits corresponding to the CONFIG_FLAG_* macros.
>   *
>   * It returns 0 on success.
>   */
> -void git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int);
> +void git_config_set_multivar_in_file(const char *config_filename,
> +				     const char *key,
> +				     const char *value,
> +				     const char *value_regex,
> +				     unsigned flags);

Nice opportunity to make the header a little easier to read here. Thanks.

With just one optional comment,
Reviewed-by: Emily Shaffer <emilyshaffer@google.com>
Previous: Derrick Stolee via GitGitGadgetNext: Derrick Stolee via GitGitGadget
Message 44 of 72 in “config: add --literal-value option”
  1. 0/7 config: add --literal-value optionDerrick Stolee via GitGitGadget, Nov 19, 2020
  2. 1/7 t1300: test "set all" mode with value_regexDerrick Stolee via GitGitGadget, Nov 19, 2020
  3. Junio C HamanoNov 19, 2020
  4. brian m. carlsonNov 20, 2020
  5. Junio C HamanoNov 20, 2020
  6. Jeff KingNov 20, 2020
  7. Junio C HamanoNov 20, 2020
  8. brian m. carlsonNov 21, 2020
  9. Junio C HamanoNov 22, 2020
  10. Jeff KingNov 24, 2020
  11. Junio C HamanoNov 24, 2020
  12. 2/7 t1300: add test for --replace-all with value_regexDerrick Stolee via GitGitGadget, Nov 19, 2020
  13. 5/7 config: plumb --literal-value into config APIDerrick Stolee via GitGitGadget, Nov 19, 2020
  14. Junio C HamanoNov 19, 2020
  15. 4/7 config: add --literal-value option, un-implementedDerrick Stolee via GitGitGadget, Nov 19, 2020
  16. Junio C HamanoNov 19, 2020
  17. Martin ÅgrenNov 20, 2020
  18. 3/7 config: convert multi_replace to flagsDerrick Stolee via GitGitGadget, Nov 19, 2020
  19. Junio C HamanoNov 19, 2020
  20. 7/7 maintenance: use 'git config --literal-value'Derrick Stolee via GitGitGadget, Nov 19, 2020
  21. Junio C HamanoNov 19, 2020
  22. 6/7 config: implement --literal-value with --get*Derrick Stolee via GitGitGadget, Nov 19, 2020
  23. Ævar Arnfjörð BjarmasonNov 20, 2020
  24. Derrick StoleeNov 20, 2020
  25. Junio C HamanoNov 20, 2020
  26. Derrick StoleeNov 20, 2020
  27. Junio C HamanoNov 20, 2020
  28. Ævar Arnfjörð BjarmasonNov 24, 2020
  29. 0/7 config: add --fixed-value optionDerrick Stolee via GitGitGadget, Nov 23, 2020
  30. 1/7 t1300: test "set all" mode with value_regexDerrick Stolee via GitGitGadget, Nov 23, 2020
  31. Emily ShafferNov 23, 2020
  32. 2/7 t1300: add test for --replace-all with value_regexDerrick Stolee via GitGitGadget, Nov 23, 2020
  33. Emily ShafferNov 23, 2020
  34. 4/7 config: add --fixed-value option, un-implementedDerrick Stolee via GitGitGadget, Nov 23, 2020
  35. Junio C HamanoNov 23, 2020
  36. Emily ShafferNov 23, 2020
  37. Junio C HamanoNov 23, 2020
  38. Derrick StoleeNov 25, 2020
  39. Derrick StoleeNov 25, 2020
  40. Eric SunshineNov 25, 2020
  41. Junio C HamanoNov 25, 2020
  42. Junio C HamanoNov 25, 2020
  43. 3/7 config: convert multi_replace to flagsDerrick Stolee via GitGitGadget, Nov 23, 2020
  44. Emily ShafferNov 23, 2020
  45. 5/7 config: plumb --fixed-value into config APIDerrick Stolee via GitGitGadget, Nov 23, 2020
  46. Emily ShafferNov 23, 2020
  47. Eric SunshineNov 24, 2020
  48. Derrick StoleeNov 25, 2020
  49. Eric SunshineNov 25, 2020
  50. 6/7 config: implement --fixed-value with --get*Derrick Stolee via GitGitGadget, Nov 23, 2020
  51. Junio C HamanoNov 23, 2020
  52. Emily ShafferNov 23, 2020
  53. 7/7 maintenance: use 'git config --fixed-value'Derrick Stolee via GitGitGadget, Nov 23, 2020
  54. Junio C HamanoNov 23, 2020
  55. Emily ShafferNov 23, 2020
  56. Junio C HamanoNov 23, 2020
  57. Junio C HamanoNov 23, 2020
  58. 0/8 config: add --fixed-value optionDerrick Stolee via GitGitGadget, Nov 25, 2020
  59. 3/8 t1300: test "set all" mode with value-patternDerrick Stolee via GitGitGadget, Nov 25, 2020
  60. 4/8 t1300: add test for --replace-all with value-patternDerrick Stolee via GitGitGadget, Nov 25, 2020
  61. 6/8 config: plumb --fixed-value into config APIDerrick Stolee via GitGitGadget, Nov 25, 2020
  62. 8/8 maintenance: use 'git config --fixed-value'Derrick Stolee via GitGitGadget, Nov 25, 2020
  63. Junio C HamanoNov 25, 2020
  64. 5/8 config: add --fixed-value option, un-implementedDerrick Stolee via GitGitGadget, Nov 25, 2020
  65. Eric SunshineNov 25, 2020
  66. 2/8 config: replace 'value_regex' with 'value_pattern'Derrick Stolee via GitGitGadget, Nov 25, 2020
  67. Eric SunshineNov 25, 2020
  68. 1/8 config: convert multi_replace to flagsDerrick Stolee via GitGitGadget, Nov 25, 2020
  69. 7/8 config: implement --fixed-value with --get*Derrick Stolee via GitGitGadget, Nov 25, 2020
  70. Junio C HamanoNov 25, 2020
  71. Derrick StoleeNov 26, 2020
  72. Junio C HamanoDec 1, 2020

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.