Re: [PATCH] parse-options: detect attempt to add a duplicate short option name
- From
René Scharfe <l.s.r@web.de>
- Date
- Sep 3, 2014, 20:29 UTC
- Message-ID
- <54077A3E.20703@web.de>
- In-Reply-To
- <xmqq1trsxzgy.fsf_-_@gitster.dls.corp.google.com>
Am 03.09.2014 um 21:42 schrieb Junio C Hamano:
Show 52 quoted lines
> Junio C Hamano <gitster@pobox.com> writes:
>
>>> 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) ||
> Compact and useful, I like it.
You might want to squash in something like this, though. Without it t1502 fails because -b is defined twice there.
--- t/t1502-rev-parse-parseopt.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index 922423e..ebe7c3b 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -19,7 +19,7 @@ sed -e 's/^|//' >expect <<\END_EXPECT | -d, --data[=...] short and long option with an optional argument | |Argument hints -| -b <arg> short option required argument +| -B <arg> short option required argument | --bar2 <arg> long option required argument | -e, --fuz <with-space> | short and long option required argument @@ -51,7 +51,7 @@ sed -e 's/^|//' >optionspec <<\EOF |d,data? short and long option with an optional argument | | Argument hints -|b=arg short option required argument +|B=arg short option required argument |bar2=arg long option required argument |e,fuz=with-space short and long option required argument |s?some short option optional argument
-- 2.1.0