Re: [PATCH v4 1/3] builtin/config: introduce `--default`
- From
Jeff King <peff@peff.net>
- Date
- Apr 5, 2018, 22:29 UTC
- Message-ID
- <20180405222949.GC29117@sigill.intra.peff.net>
- In-Reply-To
- <20180405025912.GB49902@syl.local>
On Wed, Apr 04, 2018 at 07:59:12PM -0700, Taylor Blau wrote:
Show 13 quoted lines
> @@ -286,6 +288,16 @@ static int get_value(const char *key_, const char *regex_)
> config_with_options(collect_config, &values,
> &given_config_source, &config_options);
>
> + if (!values.nr && default_value) {
> + struct strbuf *item;
> + ALLOC_GROW(values.items, values.nr + 1, values.alloc);
> + item = &values.items[values.nr++];
> + strbuf_init(item, 0);
> + if (format_config(item, key_, default_value) < 0) {
> + exit(1);
> + }
> + }Calling exit() explicitly is unusual for our code. Usually we would either die() or propagate the error. Most of the types in format_config() would die on bogus input, but a few code paths will return an error.
What happens if a non-default value has a bogus format? E.g.:
$ git config foo.bar '~NoSuchUser' $ git config --path foo.bar fatal: failed to expand user dir in: '~NoSuchUser'
Oops. Despite us checking for an error return from git_config_pathname(), it will always either return 0 or die(). So that's not a good example. ;)
Let's try expiry-date:
$ git config foo.bar 'the first of octember' $ git config --expiry-date foo.bar error: 'the first of octember' for 'foo.bar' is not a valid timestamp fatal: bad config line 7 in file .git/config
OK. So we call format_config() there from the actual collect_config() callback, and the error gets propagated back to the config parser, which then gives us an informative die(). What happens with your new code:
$ ./git config --default 'the first of octember' --type=expiry-date no.such.key error: 'the first of octember' for 'no.such.key' is not a valid timestamp
It's obvious in this toy example, but that config call may be buried deep in a script. It'd probably be nicer for that exit(1) to be something like:
die(_("failed to format default config value"));> +test_expect_success 'does not allow --default without --get' ' > + test_must_fail git config --default quux --unset a >output 2>&1 && > + test_i18ngrep "\-\-default is only applicable to" output > +'
I think "a" here needs to be "a.section". I get:
error: key does not contain a section: a
-Peff