From: Tanay Abhra <tanayabh@gmail.com>
To: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Cc: git@vger.kernel.org, Ramkumar Ramachandra <artagnon@gmail.com>
Subject: Re: [PATCH v6 6/7] config: add `git_die_config()` to the config-set API
Date: Fri, 01 Aug 2014 14:34:47 +0530 [thread overview]
Message-ID: <53DB582F.8040501@gmail.com> (raw)
In-Reply-To: <vpqoaw55q16.fsf@anie.imag.fr>
On 8/1/2014 12:11 AM, Matthieu Moy wrote:
> Tanay Abhra <tanayabh@gmail.com> writes:
>
>> On 7/31/2014 11:39 PM, Matthieu Moy wrote:
>>
>>> This is the part I find weird. You're calling git_die_config_exact() on
>>> the first boggus value, and git_die_config_exact() will notify an error
>>> at the line of the last boggus value.
>>
>> Hmn, we may have some confusion here. I meant the implementation of
>> git_config_exact() to look like this,
>>
>> void git_die_config_exact(const char *key, const char *value)
>> {
>> int i;
>> const struct string_list *values;
>> struct key_value_info *kv_info;
>> values = git_config_get_value_multi(key);
>> for (i = 0; i < values.nr; i++) {
>> kv_info = values->items[i].util;
>> /* A null check will be here also */
>> if (!strcmp(value, values->items[i].string)) {
>> if (!kv_info->linenr)
>> die(_("unable to parse '%s' from command-line config"), key);
>> else
>> die(_("bad config variable '%s' at file line %d in %s"),
>> key,
>> kv_info->linenr,
>> kv_info->filename);
>> }
>> }
>> }
>>
>> The above code would print the info on first bogus value.
>
> OK, I got confused because git_die_config() errors out at the first
> error. So, your version works, but I do not see any added value in this
> extra complexity.
>
> To be cleary, my version would be
>
> NORETURN static /* not sure about the "static" */
> void git_die_config_linenr(const char *key,
> const char *filename, int linenr)
> {
> if (!linenr)
> die(_("unable to parse '%s' from command-line config"), key);
> else
> die(_("bad config variable '%s' at file line %d in %s"),
> key,
> linenr,
> filename);
> }
>
> (hmm, I actually do not need the value, it's not printed)
>
> NORETURN
> void git_die_config(const char *key)
> {
> const struct string_list *values;
> struct key_value_info *kv_info;
> values = git_config_get_value_multi(key);
> kv_info = values->items[values->nr - 1].util;
> git_die_config_linenr(key, kv_info->linenr, kv_info->filename);
> }
>
> (we forgot the NORETURN in previous version BTW. It should be there in
> both functions here and in the .h file)
>
> In my version, git_die_config uses git_die_config_linenr, and there's no
> issue with first/last boggus value. Callers of git_die_config_linenr
> have all the information to call it directly.
>
> There are 3 code path that leads to the final die() calls, and having
> this little helper allows making sure the messages are the same for
> every callers, by construction (as opposed to cut-and-pasting).
>
> Really, I don't see any reason to do anything more complex.
>
Thanks, I am sending your version with the reroll.
Also, for clarity the multi value use case would look like,
struct key_value_info *kv_info;
if (load_config_refs) {
values = git_config_get_value_multi("notes.displayref");
if (values) {
for (i = 0; i < values->nr; i++) {
if (!values->items[i].string) {
config_error_nonbool("notes.displayref");
kv_info = values->items[i].util;
git_die_config_linenr("notes.displayref",
kv_info->filename,
kv_info->linenr);
}
else
string_list_add_refs_by_glob(&display_notes_refs,
values->items[i].string);
}
}
}
with my function it would have looked like,
if (load_config_refs) {
values = git_config_get_value_multi("notes.displayref");
if (values) {
for (i = 0; i < values->nr; i++) {
if (!values->items[i].string) {
config_error_nonbool("notes.displayref");
git_die_config_exact("notes.displayref", values->items[i].string);
}
else
string_list_add_refs_by_glob(&display_notes_refs,
values->items[i].string);
}
}
}
Thanks.
next prev parent reply other threads:[~2014-08-01 9:04 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-31 15:47 [PATCH v6 0/7] Rewrite `git_config()` using config-set API Tanay Abhra
2014-07-31 15:47 ` [PATCH v6 1/7] config.c: fix accuracy of line number in errors Tanay Abhra
2014-07-31 15:47 ` [PATCH v6 2/7] add line number and file name info to `config_set` Tanay Abhra
2014-07-31 15:47 ` [PATCH v6 3/7] change `git_config()` return value to void Tanay Abhra
2014-07-31 15:47 ` [PATCH v6 4/7] rewrite git_config() to use the config-set API Tanay Abhra
2014-07-31 15:47 ` [PATCH v6 5/7] add a test for semantic errors in config files Tanay Abhra
2014-07-31 15:47 ` [PATCH v6 6/7] config: add `git_die_config()` to the config-set API Tanay Abhra
2014-07-31 15:55 ` Matthieu Moy
2014-07-31 16:44 ` Tanay Abhra
2014-07-31 16:52 ` Matthieu Moy
2014-07-31 17:25 ` Tanay Abhra
2014-07-31 18:09 ` Matthieu Moy
2014-07-31 18:26 ` Tanay Abhra
2014-07-31 18:41 ` Matthieu Moy
2014-07-31 21:17 ` Junio C Hamano
2014-08-01 8:33 ` Matthieu Moy
2014-08-01 9:04 ` Tanay Abhra [this message]
2014-08-01 9:22 ` Matthieu Moy
2014-07-31 15:47 ` [PATCH v6 7/7] add tests for `git_config_get_string_const()` Tanay Abhra
2014-07-31 15:56 ` [PATCH v6 0/7] Rewrite `git_config()` using config-set API Matthieu Moy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53DB582F.8040501@gmail.com \
--to=tanayabh@gmail.com \
--cc=Matthieu.Moy@grenoble-inp.fr \
--cc=artagnon@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.