diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-09-19 11:38:38 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-09-19 11:38:38 -0700 |
commit | 5dbdb3bed63ab1bb0b44a398322d736aafbeb841 (patch) | |
tree | af17db9e4d0847e570893ebd5e9491d5192286d9 /parse-options.c | |
parent | 49cbc11ddb10e01e569e03b300fd2b4130f1ebba (diff) | |
parent | af465af8deda8ad685f7704a2dc787845eb317ed (diff) | |
download | git-5dbdb3bed63ab1bb0b44a398322d736aafbeb841.tar.gz |
Merge branch 'jc/parseopt-verify-short-name'
Add checks for a common programming mistake to assign the same
short option name to two separate options to help developers.
* jc/parseopt-verify-short-name:
parse-options: detect attempt to add a duplicate short option name
Diffstat (limited to 'parse-options.c')
-rw-r--r-- | parse-options.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/parse-options.c b/parse-options.c index e7dafa80d5..80106c06bc 100644 --- a/parse-options.c +++ b/parse-options.c @@ -14,8 +14,12 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx, int optbug(const struct option *opt, const char *reason) { - if (opt->long_name) + if (opt->long_name) { + if (opt->short_name) + return error("BUG: switch '%c' (--%s) %s", + opt->short_name, opt->long_name, reason); return error("BUG: option '%s' %s", opt->long_name, reason); + } return error("BUG: switch '%c' %s", opt->short_name, reason); } @@ -347,12 +351,20 @@ 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) { + if (0x7F <= opts->short_name) + err |= optbug(opts, "invalid short name"); + else if (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) || |