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

Re: [PATCH v2 4/4] builtin/config: introduce `--color` type specifier

From
Jeff King <peff@peff.net>
Date
Mar 26, 2018, 09:16 UTC
Message-ID
<20180326091645.GD18714@sigill.intra.peff.net>
In-Reply-To
<20180324005556.8145-5-me@ttaylorr.com>
On Fri, Mar 23, 2018 at 08:55:56PM -0400, Taylor Blau wrote:
> As of this commit, the canonical way to retreive an ANSI-compatible
> color escape sequence from a configuration file is with the
> `--get-color` action.
s/retreive/retrieve/
Show 13 quoted lines
> This is to allow Git to "fall back" on a default value for the color
> should the given section not exist in the specified configuration(s).
> 
> With the addition of `--default`, this is no longer needed since:
> 
>   $ git config --default red --color core.section
> 
> will be have exactly as:
> 
>   $ git config --get-color core.section red
> 
> For consistency, let's introduce `--color` and encourage `--color`,
> `--default` together over `--get-color` alone.

I don't think we'll ever get rid of --get-color (at the very least, we'd need a deprecation period). But it's probably worth adding a note under the --get-color description to mention that it's a historical synonym, and that using "--default" should be preferred.

Show 8 quoted lines
> @@ -90,6 +91,7 @@ static struct option builtin_config_options[] = {
>  	OPT_BIT(0, "bool-or-int", &types, N_("value is --bool or --int"), TYPE_BOOL_OR_INT),
>  	OPT_BIT(0, "path", &types, N_("value is a path (file or directory name)"), TYPE_PATH),
>  	OPT_BIT(0, "expiry-date", &types, N_("value is an expiry date"), TYPE_EXPIRY_DATE),
> +	OPT_BIT(0, "color", &types, N_("value is a color"), TYPE_COLOR),
>  	OPT_GROUP(N_("Other")),
>  	OPT_BOOL('z', "null", &end_null, N_("terminate values with NUL byte")),
>  	OPT_BOOL(0, "name-only", &omit_values, N_("show variable names only")),

I just had a funny thought. Normally in Git the "--color" option means "colorize the output". And we are diverging from that here. I wonder if anybody would be confused by that, or if we would ever want to later add an option to colorize git-config output. Would we regret squatting on --color?

I'm not sure what else to name it. Anything _except_ "--color" would diverge from the existing scheme of "--<type>".

If we were designing from scratch, I'd consider:
  git config --type=int ...
  git config --type=color ...

etc. I'm not sure if it's worth trying to switch now (on the other hand, it resolves the documentation issue I mentioned earlier, since that would naturally group all of the types ;) ).

It would be pretty easy to declare "--type" as the Right Way, and list "--int" as a historical synonym for "--type=int".

Show 9 quoted lines
> @@ -175,6 +177,11 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value
>  			if (git_config_expiry_date(&t, key_, value_) < 0)
>  				return -1;
>  			strbuf_addf(buf, "%"PRItime, t);
> +		} else if (types == TYPE_COLOR) {
> +			char v[COLOR_MAXLEN];
> +			if (git_config_color(v, key_, value_) < 0)
> +				return -1;
> +			strbuf_addstr(buf, v);
Looks good.
Show 10 quoted lines
> @@ -320,6 +327,12 @@ static char *normalize_value(const char *key, const char *value)
>  		else
>  			return xstrdup(v ? "true" : "false");
>  	}
> +	if (types == TYPE_COLOR) {
> +		char v[COLOR_MAXLEN];
> +		if (!git_config_color(v, key, value))
> +			return xstrdup(value);
> +		die("cannot parse color '%s'", value);
> +	}

Interesting. This doesn't actually normalize anything, since we always pass back the original value (or die). I think that's the right thing to do, since otherwise you'd end up with ANSI codes in your config file.

I wondered at first if this should go in the "noop" normalization that TYPE_PATH undergoes. But I like that it actually sanity-checks the value. We should probably have a comment here explaining that yes, we parse and then throw away the value (similar to the one near TYPE_PATH).

I suspect that TYPE_EXPIRY_DATE should do the same thing (parse and complain if you fed nonsense, but always keep the original value).

Show 7 quoted lines
> +test_expect_success 'get --color' '
> +	rm .git/config &&
> +	git config foo.color "red" &&
> +	git config --get --color foo.color | test_decode_color >actual &&
> +	echo "<RED>" >expect &&
> +	test_cmp expect actual
> +'
We should probably write this as:
  git config --get --color foo.color >actual.raw &&
  test_decode_color <actual.raw >actual

to catch failures from git-config itself (there's a lot of old tests which pipe, but we've been trying to convert them to be more careful).

Show 10 quoted lines
> +test_expect_success 'set --color' '
> +	rm .git/config &&
> +	git config --color foo.color "red" &&
> +	test_cmp expect .git/config
> +'
> +
> +test_expect_success 'get --color barfs on non-color' '
> +	echo "[foo]bar=not-a-color" >.git/config &&
> +	test_must_fail git config --get --color foo.bar
> +'

After reading the normalize bits above, I think there's one more case to cover:

  test_must_fail git config --color foo.color not-a-color
Show 13 quoted lines
> diff --git a/t/t1310-config-default.sh b/t/t1310-config-default.sh
> index 0e464c206..0ebece7d2 100755
> --- a/t/t1310-config-default.sh
> +++ b/t/t1310-config-default.sh
> @@ -62,6 +62,12 @@ test_expect_success 'marshal default value as expiry-date' '
>  	test_cmp expect actual
>  '
>  
> +test_expect_success 'marshal default value as color' '
> +	echo "\033[31m" >expect &&
> +	git config --default red --color core.foo >actual &&
> +	test_cmp expect actual
> +'

I don't offhand recall whether octal escapes with "echo" are portable. It _is_ in POSIX, but only for XSI. I think using "printf" would be portable.

-Peff
Previous: Taylor BlauNext: Taylor Blau
Message 23 of 83 in “Teach `--default` to `git-config(1)`”
  1. 0/4 Teach `--default` to `git-config(1)`Taylor Blau, Mar 6, 2018
  2. 1/4 builtin/config: introduce `--default`Taylor Blau, Mar 6, 2018
  3. Jeff KingMar 6, 2018
  4. Eric SunshineMar 6, 2018
  5. Eric SunshineMar 6, 2018
  6. 3/4 config.c: introduce 'git_config_color' to parse ANSI colorsTaylor Blau, Mar 6, 2018
  7. Jeff KingMar 6, 2018
  8. 4/4 builtin/config: introduce `--color` type specifierTaylor Blau, Mar 6, 2018
  9. Jeff KingMar 6, 2018
  10. 2/4 Documentation: list all type specifiers in config proseTaylor Blau, Mar 6, 2018
  11. Jeff KingMar 6, 2018
  12. Junio C HamanoMar 6, 2018
  13. Taylor BlauMar 6, 2018
  14. 0/4 Teach `--default` to `git-config(1)`Taylor Blau, Mar 24, 2018
  15. 1/4 builtin/config: introduce `--default`Taylor Blau, Mar 24, 2018
  16. Jeff KingMar 26, 2018
  17. Taylor BlauMar 29, 2018
  18. 2/4 Documentation: list all type specifiers in config proseTaylor Blau, Mar 24, 2018
  19. Jeff KingMar 26, 2018
  20. Taylor BlauMar 29, 2018
  21. 3/4 config.c: introduce 'git_config_color' to parse ANSI colorsTaylor Blau, Mar 24, 2018
  22. 4/4 builtin/config: introduce `--color` type specifierTaylor Blau, Mar 24, 2018
  23. Jeff KingMar 26, 2018
  24. Taylor BlauMar 29, 2018
  25. Jeff KingMar 26, 2018
  26. 0/4 Teach `--default` to `git-config(1)`Taylor Blau, Mar 29, 2018
  27. 1/3 builtin/config: introduce `--default`Taylor Blau, Mar 29, 2018
  28. Junio C HamanoMar 30, 2018
  29. Taylor BlauApr 5, 2018
  30. Eric SunshineMar 30, 2018
  31. Taylor BlauApr 5, 2018
  32. 2/3 config.c: introduce 'git_config_color' to parse ANSI colorsTaylor Blau, Mar 29, 2018
  33. Eric SunshineMar 30, 2018
  34. Taylor BlauApr 5, 2018
  35. 3/3 builtin/config: introduce `color` type specifierTaylor Blau, Mar 29, 2018
  36. Junio C HamanoMar 30, 2018
  37. Taylor BlauApr 5, 2018
  38. Taylor BlauMar 29, 2018
  39. 0/3 Teach `--default` to `git-config(1)`Taylor Blau, Apr 5, 2018
  40. Jeff KingApr 5, 2018
  41. 0/2 builtin/config.c: prefer `--type=bool` over `--bool`, etc.Taylor Blau, Apr 6, 2018
  42. Taylor BlauApr 6, 2018
  43. 0/2 *** SUBJECT HERE ***Taylor Blau, Apr 6, 2018
  44. Jacob KellerApr 6, 2018
  45. 0/3 builtin/config: introduce `--default`Taylor Blau, Apr 6, 2018
  46. 0/3 Teach `--default` to `git-config(1)`Taylor Blau, Apr 10, 2018
  47. 1/3 builtin/config: introduce `--default`Taylor Blau, Apr 5, 2018
  48. Jeff KingApr 5, 2018
  49. Taylor BlauApr 6, 2018
  50. Junio C HamanoApr 8, 2018
  51. Taylor BlauApr 10, 2018
  52. Eric SunshineApr 5, 2018
  53. Taylor BlauApr 6, 2018
  54. 2/3 config.c: introduce 'git_config_color' to parse ANSI colorsTaylor Blau, Apr 5, 2018
  55. 3/3 builtin/config: introduce `color` type specifierTaylor Blau, Apr 5, 2018
  56. Jeff KingApr 5, 2018
  57. Eric SunshineApr 5, 2018
  58. Jeff KingApr 5, 2018
  59. Taylor BlauApr 6, 2018
  60. Taylor BlauApr 6, 2018
  61. 1/2 builtin/config.c: treat type specifiers singularlyTaylor Blau, Apr 6, 2018
  62. 2/2 builtin/config.c: prefer `--type=bool` over `--bool`, etc.Taylor Blau, Apr 6, 2018
  63. Eric SunshineApr 6, 2018
  64. Taylor BlauApr 6, 2018
  65. Jeff KingApr 6, 2018
  66. Taylor BlauApr 7, 2018
  67. 1/3 builtin/config: introduce `--default`Taylor Blau, Apr 6, 2018
  68. Eric SunshineApr 6, 2018
  69. Eric SunshineApr 6, 2018
  70. Taylor BlauApr 7, 2018
  71. Eric SunshineApr 7, 2018
  72. Taylor BlauApr 7, 2018
  73. Eric SunshineApr 7, 2018
  74. 2/3 config.c: introduce 'git_config_color' to parse ANSI colorsTaylor Blau, Apr 6, 2018
  75. 3/3 builtin/config: introduce `color` type specifierTaylor Blau, Apr 6, 2018
  76. Eric SunshineApr 6, 2018
  77. Taylor BlauApr 7, 2018
  78. 2/3 config.c: introduce 'git_config_color' to parse ANSI colorsTaylor Blau, Apr 10, 2018
  79. 3/3 builtin/config: introduce `color` type specifierTaylor Blau, Apr 10, 2018
  80. 3/3 builtin/config: introduce `color` type specifierTaylor Blau, Apr 10, 2018
  81. Junio C HamanoApr 10, 2018
  82. 1/3 builtin/config: introduce `--default`Taylor Blau, Apr 10, 2018
  83. Junio C HamanoApr 10, 2018

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.