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. 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 --type=color core.section will be have exactly as: $ git config --get-color core.section red For consistency, let's introduce `--color` and encourage `--type=color`, `--default` together over `--get-color` alone. Signed-off-by: Taylor Blau <me@xxxxxxxxxxxx> --- Documentation/git-config.txt | 10 ++++++---- builtin/config.c | 21 +++++++++++++++++++++ t/t1300-repo-config.sh | 30 ++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 620492d1e..bde702d2e 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -38,10 +38,8 @@ existing values that match the regexp are updated or unset. If you want to handle the lines that do *not* match the regex, just prepend a single exclamation mark in front (see also <<EXAMPLES>>). -A type specifier may be given as an argument to `--type` to make 'git config' -ensure that the variable(s) are of the given type and convert the value to the -canonical form. If no type specifier is passed, no checks or transformations are -performed on the value. +`color`:: + The value is taken as an ANSI color escape sequence. When reading, the values are read from the system, global and repository local configuration files by default, and options @@ -177,6 +175,7 @@ Valid `<type>`'s include: ~/` from the command line to let your shell do the expansion.) - 'expiry-date': canonicalize by converting from a fixed or relative date-string to a timestamp. This specifier has no effect when setting the value. +- 'color': canonicalize by converting to an ANSI color escape sequence. + --bool:: @@ -223,6 +222,9 @@ Valid `<type>`'s include: output it as the ANSI color escape sequence to the standard output. The optional `default` parameter is used instead, if there is no color configured for `name`. ++ +It is preferred to use `--type=color`, or `--type=color --default=[default]` +instead of `--get-color`. -e:: --edit:: diff --git a/builtin/config.c b/builtin/config.c index 1328b568b..aa3fcabe9 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -61,6 +61,7 @@ static int show_origin; #define TYPE_BOOL_OR_INT 3 #define TYPE_PATH 4 #define TYPE_EXPIRY_DATE 5 +#define TYPE_COLOR 6 static int option_parse_type(const struct option *opt, const char *arg, int unset) @@ -82,6 +83,8 @@ static int option_parse_type(const struct option *opt, const char *arg, *type = TYPE_PATH; else if (!strcmp(arg, "expiry-date")) *type = TYPE_EXPIRY_DATE; + else if (!strcmp(arg, "color")) + *type = TYPE_COLOR; else { die(_("unrecognized --type argument, %s"), arg); return 1; @@ -203,6 +206,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 (type == TYPE_COLOR) { + char v[COLOR_MAXLEN]; + if (git_config_color(v, key_, value_) < 0) + return -1; + strbuf_addstr(buf, v); } else if (value_) { strbuf_addstr(buf, value_); } else { @@ -348,6 +356,19 @@ static char *normalize_value(const char *key, const char *value) else return xstrdup(v ? "true" : "false"); } + if (type == TYPE_COLOR) { + char v[COLOR_MAXLEN]; + if (!git_config_color(v, key, value)) + /* + * The contents of `v` now contain an ANSI escape + * sequence, not suitable for including within a + * configuration file. Treat the above as a + * "sanity-check", and return the given value, which we + * know is representable as valid color code. + */ + return xstrdup(value); + die("cannot parse color '%s'", value); + } die("BUG: cannot normalize type %d", type); } diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh index b25ab7b9e..c630bdc77 100755 --- a/t/t1300-repo-config.sh +++ b/t/t1300-repo-config.sh @@ -931,6 +931,36 @@ test_expect_success 'get --expiry-date' ' test_must_fail git config --expiry-date date.invalid1 ' +test_expect_success 'get --type=color' ' + rm .git/config && + git config foo.color "red" && + git config --get --type=color foo.color >actual.raw && + test_decode_color <actual.raw >actual && + echo "<RED>" >expect && + test_cmp expect actual +' + +cat >expect << EOF +[foo] + color = red +EOF + +test_expect_success 'set --type=color' ' + rm .git/config && + git config --type=color foo.color "red" && + test_cmp expect .git/config +' + +test_expect_success 'get --type=color barfs on non-color' ' + echo "[foo]bar=not-a-color" >.git/config && + test_must_fail git config --get --type=color foo.bar +' + +test_expect_success 'set --type=color barfs on non-color' ' + test_must_fail git config --type=color foo.color "not-a-color" 2>error && + test_i18ngrep "cannot parse color" error +' + cat > expect << EOF [quote] leading = " test" -- 2.17.0