Re: [PATCH v4 3/3] builtin/config: introduce `color` type specifier
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Apr 6, 2018, 06:02 UTC
- Message-ID
- <20180406060216.GC62593@syl.local>
- In-Reply-To
- <20180405223620.GD29117@sigill.intra.peff.net>
On Thu, Apr 05, 2018 at 06:36:20PM -0400, Jeff King wrote:
Show 22 quoted lines
> On Wed, Apr 04, 2018 at 07:59:17PM -0700, 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. > > > > 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. > > In this last sentence, did you mean "let's introduce --type=color and > encourage its use with --default over --get-color alone"?
I did; thank you :-). I have updated this in the forthcoming re-roll.
Show 25 quoted lines
> > Signed-off-by: Taylor Blau <me@ttaylorr.com> > > --- > > 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. > > We'd want to keep that introductory paragraph, right? And there is no > `--color`? So I think this hunk can go away (and is presumably a > leftover mistake during rebasing).
Yes; this entire hunk should not have been staged. I think that it was a leftover from rebasing. I have removed it in the forthcoming re-roll.
Show 13 quoted lines
> > 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. > > + > > This one is part of the --type list, so that's what we expect. > > You may want to also cover the behavior when setting the value (we check > that it's sane, but store the original).
Good idea; thank you.
Show 13 quoted lines
> > 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 > > Not strictly necessary for this series, but if this became an enum as > part of the de-bitifying, you wouldn't have to write the numbers > manually. :)
Certainly agree that this would be useful. I think that I'd prefer to accomplish this in a future series, since this one is starting to become long-lived :-).
Show 41 quoted lines
> > @@ -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 {
>
> OK, formatting shows the converted value. Good.
>
> > @@ -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);
> > + }
>
> And this returns the original. Good.
>
> > 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
>
> The tests look good.Thank you.
Thanks, Taylor