[PATCH] parse-options: detect attempt to add a duplicate short option name
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 3, 2014, 19:42 UTC
- Message-ID
- <xmqq1trsxzgy.fsf_-_@gitster.dls.corp.google.com>
- In-Reply-To
- <xmqq7g1kxzxi.fsf@gitster.dls.corp.google.com>
Junio C Hamano <gitster@pobox.com> writes:
Show 15 quoted lines
>> diff --git a/builtin/revert.c b/builtin/revert.c
>> index f9ed5bd..831c2cd 100644
>> --- a/builtin/revert.c
>> +++ b/builtin/revert.c
>> @@ -91,6 +91,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
>> N_("option for merge strategy"), option_parse_x),
>> { OPTION_STRING, 'S', "gpg-sign", &opts->gpg_sign, N_("key-id"),
>> N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
>> + OPT_BOOL('n', "no-verify", &opts->no_verify, N_("bypass pre-commit hook")),
>
> I doubt we want this option to squat on '-n'; besides, it is already
> taken by a more often used "--no-commit".
>
> I thought that we added sanity checker for the options[] array to parse-options
> API. I wonder why it did not kick in...... because we didn't, not quite.
Perhaps like this?
-- >8 -- It is easy to overlook an already assigned single-letter option name and try to use it for a new one. Help the developer to catch it before such a mistake escapes the lab.
Signed-off-by: Junio C Hamano <gitster@pobox.com> ---
diff --git a/parse-options.c b/parse-options.c index e7dafa8..b7925c5 100644 --- a/parse-options.c +++ b/parse-options.c @@ -347,12 +347,17 @@ static void check_typos(const char *arg, const struct option *options) static void parse_options_check(const struct option *opts) { int err = 0; + char short_opts[128]; + + memset(short_opts, '\0', sizeof(short_opts)); for (; opts->type != OPTION_END; opts++) { if ((opts->flags & PARSE_OPT_LASTARG_DEFAULT) && (opts->flags & PARSE_OPT_OPTARG)) err |= optbug(opts, "uses incompatible flags " "LASTARG_DEFAULT and OPTARG"); + if (opts->short_name && short_opts[opts->short_name]++) + err |= optbug(opts, "short name already used"); if (opts->flags & PARSE_OPT_NODASH && ((opts->flags & PARSE_OPT_OPTARG) || !(opts->flags & PARSE_OPT_NOARG) ||