Skip to content

Commit 154aee0

Browse files
bk2204gitster
authored andcommitted
parse-options: add a separate case for help output on error
When we parse a command line option such as -h or --help, we currently exit 129, since that is the exit code when help output is printed. In a future commit, we'll change this to exit 0 instead, since we're doing what the user wanted successfully. However, there are some cases where we print help output because the user has provided ambiguous or invalid input, such as an ambiguous option, and we'll want to exit unsuccessfully there. Make this easier by defining a new return code, PARSE_OPT_HELP_ERROR, that can be used in this case, while reserving PARSE_OPT_HELP for those cases where the user has requested help directly. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 5df632c commit 154aee0

5 files changed

Lines changed: 13 additions & 4 deletions

File tree

builtin/blame.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,7 @@ int cmd_blame(int argc,
10131013
case PARSE_OPT_UNKNOWN:
10141014
break;
10151015
case PARSE_OPT_HELP:
1016+
case PARSE_OPT_HELP_ERROR:
10161017
case PARSE_OPT_ERROR:
10171018
case PARSE_OPT_SUBCOMMAND:
10181019
exit(129);

builtin/shortlog.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ int cmd_shortlog(int argc,
433433
case PARSE_OPT_UNKNOWN:
434434
break;
435435
case PARSE_OPT_HELP:
436+
case PARSE_OPT_HELP_ERROR:
436437
case PARSE_OPT_ERROR:
437438
case PARSE_OPT_SUBCOMMAND:
438439
exit(129);

builtin/update-index.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,7 @@ int cmd_update_index(int argc,
11331133
break;
11341134
switch (parseopt_state) {
11351135
case PARSE_OPT_HELP:
1136+
case PARSE_OPT_HELP_ERROR:
11361137
case PARSE_OPT_ERROR:
11371138
exit(129);
11381139
case PARSE_OPT_COMPLETE:

parse-options.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ static enum parse_opt_result parse_long_opt(
583583
ambiguous.option->long_name,
584584
(abbrev.flags & OPT_UNSET) ? "no-" : "",
585585
abbrev.option->long_name);
586-
return PARSE_OPT_HELP;
586+
return PARSE_OPT_HELP_ERROR;
587587
}
588588
if (abbrev.option) {
589589
if (*arg_end)
@@ -1037,6 +1037,7 @@ enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
10371037
usage_with_options(usagestr, options);
10381038
case PARSE_OPT_COMPLETE:
10391039
case PARSE_OPT_HELP:
1040+
case PARSE_OPT_HELP_ERROR:
10401041
case PARSE_OPT_ERROR:
10411042
case PARSE_OPT_DONE:
10421043
case PARSE_OPT_NON_OPTION:
@@ -1072,6 +1073,7 @@ enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
10721073
case PARSE_OPT_NON_OPTION:
10731074
case PARSE_OPT_SUBCOMMAND:
10741075
case PARSE_OPT_HELP:
1076+
case PARSE_OPT_HELP_ERROR:
10751077
case PARSE_OPT_COMPLETE:
10761078
BUG("parse_short_opt() cannot return these");
10771079
case PARSE_OPT_DONE:
@@ -1099,6 +1101,7 @@ enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
10991101
case PARSE_OPT_SUBCOMMAND:
11001102
case PARSE_OPT_COMPLETE:
11011103
case PARSE_OPT_HELP:
1104+
case PARSE_OPT_HELP_ERROR:
11021105
BUG("parse_short_opt() cannot return these");
11031106
case PARSE_OPT_DONE:
11041107
break;
@@ -1132,6 +1135,7 @@ enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
11321135
case PARSE_OPT_UNKNOWN:
11331136
goto unknown;
11341137
case PARSE_OPT_HELP:
1138+
case PARSE_OPT_HELP_ERROR:
11351139
goto show_usage;
11361140
case PARSE_OPT_NON_OPTION:
11371141
case PARSE_OPT_SUBCOMMAND:
@@ -1197,6 +1201,7 @@ int parse_options(int argc, const char **argv,
11971201
parse_options_start_1(&ctx, argc, argv, prefix, options, flags);
11981202
switch (parse_options_step(&ctx, options, usagestr)) {
11991203
case PARSE_OPT_HELP:
1204+
case PARSE_OPT_HELP_ERROR:
12001205
case PARSE_OPT_ERROR:
12011206
exit(129);
12021207
case PARSE_OPT_COMPLETE:
@@ -1363,7 +1368,7 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
13631368
parse_options_check_harder(opts);
13641369

13651370
if (!usagestr)
1366-
return PARSE_OPT_HELP;
1371+
return err ? PARSE_OPT_HELP_ERROR : PARSE_OPT_HELP;
13671372

13681373
if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL)
13691374
fprintf(outfile, "cat <<\\EOF\n");
@@ -1476,7 +1481,7 @@ static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t
14761481
if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL)
14771482
fputs("EOF\n", outfile);
14781483

1479-
return PARSE_OPT_HELP;
1484+
return err ? PARSE_OPT_HELP_ERROR : PARSE_OPT_HELP;
14801485
}
14811486

14821487
void NORETURN usage_with_options(const char * const *usagestr,

parse-options.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ enum parse_opt_option_flags {
5757
};
5858

5959
enum parse_opt_result {
60-
PARSE_OPT_COMPLETE = -3,
60+
PARSE_OPT_COMPLETE = -4,
61+
PARSE_OPT_HELP_ERROR = -3,
6162
PARSE_OPT_HELP = -2,
6263
PARSE_OPT_ERROR = -1, /* must be the same as error() */
6364
PARSE_OPT_DONE = 0, /* fixed so that "return 0" works */

0 commit comments

Comments
 (0)