Browse Source

parse-options: clearer reporting of API misuse

The PARSE_OPT_LASTARG_DEFAULT flag is meant for options like
--contains that (1) traditionally had a mandatory argument and
(2) have some better behavior to use when appearing in the final
position.  It makes no sense to combine this with OPTARG, so ever
since v1.6.4-rc0~71 (parse-options: add parse_options_check to
validate option specs, 2009-07-09) this mistake is flagged with

	error: `--option` uses incompatible flags LASTARG_DEFAULT and OPTARG

and an exit status representing an error in commandline usage.

Unfortunately that which might confuse scripters calling such an
erroneous program into thinking the _script_ contains an error.
Clarify that it is an internal error by dying with a message beginning
"error: BUG: ..." and status 128.

While at it, clean up parse_options_check to prepare for more checks.

Long term, it would be nicer to make such checks happen at compile
time.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jonathan Nieder 14 years ago committed by Junio C Hamano
parent
commit
1e5ce570ca
  1. 23
      parse-options.c

23
parse-options.c

@ -11,6 +11,13 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx, @@ -11,6 +11,13 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx,
#define OPT_SHORT 1
#define OPT_UNSET 2

static int optbug(const struct option *opt, const char *reason)
{
if (opt->long_name)
return error("BUG: option '%s' %s", opt->long_name, reason);
return error("BUG: switch '%c' %s", opt->short_name, reason);
}

static int opterror(const struct option *opt, const char *reason, int flags)
{
if (flags & OPT_SHORT)
@ -320,20 +327,12 @@ static void parse_options_check(const struct option *opts) @@ -320,20 +327,12 @@ static void parse_options_check(const struct option *opts)

for (; opts->type != OPTION_END; opts++) {
if ((opts->flags & PARSE_OPT_LASTARG_DEFAULT) &&
(opts->flags & PARSE_OPT_OPTARG)) {
if (opts->long_name) {
error("`--%s` uses incompatible flags "
"LASTARG_DEFAULT and OPTARG", opts->long_name);
} else {
error("`-%c` uses incompatible flags "
"LASTARG_DEFAULT and OPTARG", opts->short_name);
}
err |= 1;
}
(opts->flags & PARSE_OPT_OPTARG))
err |= optbug(opts, "uses incompatible flags "
"LASTARG_DEFAULT and OPTARG");
}

if (err)
exit(129);
exit(128);
}

void parse_options_start(struct parse_opt_ctx_t *ctx,

Loading…
Cancel
Save