builtin/config: introduce color
type specifier
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 `--type=color` and encourage its use with `--default` together over `--get-color` alone. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6d2f9acc0f
commit
63e2a0f8e9
@ -177,6 +177,10 @@ Valid `<type>`'s include:
|
|||||||
~/` from the command line to let your shell do the expansion.)
|
~/` from the command line to let your shell do the expansion.)
|
||||||
- 'expiry-date': canonicalize by converting from a fixed or relative date-string
|
- 'expiry-date': canonicalize by converting from a fixed or relative date-string
|
||||||
to a timestamp. This specifier has no effect when setting the value.
|
to a timestamp. This specifier has no effect when setting the value.
|
||||||
|
- 'color': When getting a value, canonicalize by converting to an ANSI color
|
||||||
|
escape sequence. When setting a value, a sanity-check is performed to ensure
|
||||||
|
that the given value is canonicalize-able as an ANSI color, but it is written
|
||||||
|
as-is.
|
||||||
+
|
+
|
||||||
|
|
||||||
--bool::
|
--bool::
|
||||||
@ -228,6 +232,8 @@ Valid `<type>`'s include:
|
|||||||
output it as the ANSI color escape sequence to the standard
|
output it as the ANSI color escape sequence to the standard
|
||||||
output. The optional `default` parameter is used instead, if
|
output. The optional `default` parameter is used instead, if
|
||||||
there is no color configured for `name`.
|
there is no color configured for `name`.
|
||||||
|
+
|
||||||
|
`--type=color [--default=<default>]` is preferred over `--get-color`.
|
||||||
|
|
||||||
-e::
|
-e::
|
||||||
--edit::
|
--edit::
|
||||||
|
@ -61,6 +61,7 @@ static int show_origin;
|
|||||||
#define TYPE_BOOL_OR_INT 3
|
#define TYPE_BOOL_OR_INT 3
|
||||||
#define TYPE_PATH 4
|
#define TYPE_PATH 4
|
||||||
#define TYPE_EXPIRY_DATE 5
|
#define TYPE_EXPIRY_DATE 5
|
||||||
|
#define TYPE_COLOR 6
|
||||||
|
|
||||||
#define OPT_CALLBACK_VALUE(s, l, v, h, i) \
|
#define OPT_CALLBACK_VALUE(s, l, v, h, i) \
|
||||||
{ OPTION_CALLBACK, (s), (l), (v), NULL, (h), PARSE_OPT_NOARG | \
|
{ OPTION_CALLBACK, (s), (l), (v), NULL, (h), PARSE_OPT_NOARG | \
|
||||||
@ -94,6 +95,8 @@ static int option_parse_type(const struct option *opt, const char *arg,
|
|||||||
new_type = TYPE_PATH;
|
new_type = TYPE_PATH;
|
||||||
else if (!strcmp(arg, "expiry-date"))
|
else if (!strcmp(arg, "expiry-date"))
|
||||||
new_type = TYPE_EXPIRY_DATE;
|
new_type = TYPE_EXPIRY_DATE;
|
||||||
|
else if (!strcmp(arg, "color"))
|
||||||
|
new_type = TYPE_COLOR;
|
||||||
else
|
else
|
||||||
die(_("unrecognized --type argument, %s"), arg);
|
die(_("unrecognized --type argument, %s"), arg);
|
||||||
}
|
}
|
||||||
@ -230,6 +233,11 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value
|
|||||||
if (git_config_expiry_date(&t, key_, value_) < 0)
|
if (git_config_expiry_date(&t, key_, value_) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
strbuf_addf(buf, "%"PRItime, t);
|
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_) {
|
} else if (value_) {
|
||||||
strbuf_addstr(buf, value_);
|
strbuf_addstr(buf, value_);
|
||||||
} else {
|
} else {
|
||||||
@ -375,6 +383,20 @@ static char *normalize_value(const char *key, const char *value)
|
|||||||
else
|
else
|
||||||
return xstrdup(v ? "true" : "false");
|
return xstrdup(v ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
if (type == TYPE_COLOR) {
|
||||||
|
char v[COLOR_MAXLEN];
|
||||||
|
if (git_config_color(v, key, value))
|
||||||
|
die("cannot parse color '%s'", 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("BUG: cannot normalize type %d", type);
|
die("BUG: cannot normalize type %d", type);
|
||||||
}
|
}
|
||||||
|
@ -931,6 +931,36 @@ test_expect_success 'get --expiry-date' '
|
|||||||
test_must_fail git config --expiry-date date.invalid1
|
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
|
cat > expect << EOF
|
||||||
[quote]
|
[quote]
|
||||||
leading = " test"
|
leading = " test"
|
||||||
|
Loading…
Reference in New Issue
Block a user