Skip to content

Commit

Permalink
parse-options: PARSE_OPT_KEEP_UNKNOWN only applies to --options
Browse files Browse the repository at this point in the history
The description of 'PARSE_OPT_KEEP_UNKNOWN' starts with "Keep unknown
arguments instead of erroring out".  This is a bit misleading, as this
flag only applies to unknown --options, while non-option arguments are
kept even without this flag.

Update the description to clarify this, and rename the flag to
PARSE_OPTIONS_KEEP_UNKNOWN_OPT to make this obvious just by looking at
the flag name.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
szeder authored and gitster committed Aug 19, 2022
1 parent 80882bc commit 99d86d6
Show file tree
Hide file tree
Showing 17 changed files with 33 additions and 31 deletions.
6 changes: 4 additions & 2 deletions Documentation/technical/api-parse-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ Flags are the bitwise-or of:
Keep the first argument, which contains the program name. It's
removed from argv[] by default.

`PARSE_OPT_KEEP_UNKNOWN`::
Keep unknown arguments instead of erroring out. This doesn't
`PARSE_OPT_KEEP_UNKNOWN_OPT`::
Keep unknown options instead of erroring out. This doesn't
work for all combinations of arguments as users might expect
it to do. E.g. if the first argument in `--unknown --known`
takes a value (which we can't know), the second one is
Expand All @@ -101,6 +101,8 @@ Flags are the bitwise-or of:
non-option, not as a value belonging to the unknown option,
the parser early. That's why parse_options() errors out if
both options are set.
Note that non-option arguments are always kept, even without
this flag.

`PARSE_OPT_NO_INTERNAL_HELP`::
By default, parse_options() handles `-h`, `--help` and
Expand Down
2 changes: 1 addition & 1 deletion builtin/archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ static int run_remote_archiver(int argc, const char **argv,

#define PARSE_OPT_KEEP_ALL ( PARSE_OPT_KEEP_DASHDASH | \
PARSE_OPT_KEEP_ARGV0 | \
PARSE_OPT_KEEP_UNKNOWN | \
PARSE_OPT_KEEP_UNKNOWN_OPT | \
PARSE_OPT_NO_INTERNAL_HELP )

int cmd_archive(int argc, const char **argv, const char *prefix)
Expand Down
2 changes: 1 addition & 1 deletion builtin/bisect--helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1324,7 +1324,7 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)

argc = parse_options(argc, argv, prefix, options,
git_bisect_helper_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN_OPT);

if (!cmdmode)
usage_with_options(git_bisect_helper_usage, options);
Expand Down
2 changes: 1 addition & 1 deletion builtin/difftool.c
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
symlinks = has_symlinks;

argc = parse_options(argc, argv, prefix, builtin_difftool_options,
builtin_difftool_usage, PARSE_OPT_KEEP_UNKNOWN |
builtin_difftool_usage, PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_KEEP_DASHDASH);

if (tool_help)
Expand Down
2 changes: 1 addition & 1 deletion builtin/env--helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ int cmd_env__helper(int argc, const char **argv, const char *prefix)
};

argc = parse_options(argc, argv, prefix, opts, env__helper_usage,
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);
if (env_default && !*env_default)
usage_with_options(env__helper_usage, opts);
if (!cmdmode)
Expand Down
2 changes: 1 addition & 1 deletion builtin/fast-export.c
Original file line number Diff line number Diff line change
Expand Up @@ -1221,7 +1221,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
revs.sources = &revision_sources;
revs.rewrite_parents = 1;
argc = parse_options(argc, argv, prefix, options, fast_export_usage,
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT);
argc = setup_revisions(argc, argv, &revs, NULL);
if (argc > 1)
usage_with_options (fast_export_usage, options);
Expand Down
4 changes: 2 additions & 2 deletions builtin/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
mailmap = use_mailmap_config;
argc = parse_options(argc, argv, prefix,
builtin_log_options, builtin_log_usage,
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_KEEP_DASHDASH);

if (quiet)
Expand Down Expand Up @@ -1926,7 +1926,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
*/
argc = parse_options(argc, argv, prefix, builtin_format_patch_options,
builtin_format_patch_usage,
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_KEEP_DASHDASH);

/* Make sure "0000-$sub.patch" gives non-negative length for $sub */
Expand Down
4 changes: 2 additions & 2 deletions builtin/reflog.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ static int cmd_reflog_show(int argc, const char **argv, const char *prefix)

parse_options(argc, argv, prefix, options, reflog_show_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);

return cmd_log_reflog(argc, argv, prefix);
}
Expand Down Expand Up @@ -410,7 +410,7 @@ int cmd_reflog(int argc, const char **argv, const char *prefix)

argc = parse_options(argc, argv, prefix, options, reflog_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN |
PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_NO_INTERNAL_HELP);

/*
Expand Down
2 changes: 1 addition & 1 deletion builtin/revert.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)

argc = parse_options(argc, argv, NULL, options, usage_str,
PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);

prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
Expand Down
4 changes: 2 additions & 2 deletions builtin/sparse-checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix,
builtin_sparse_checkout_add_options,
builtin_sparse_checkout_add_usage,
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);

sanitize_paths(argc, argv, prefix, add_opts.skip_checks);

Expand Down Expand Up @@ -813,7 +813,7 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix,
builtin_sparse_checkout_set_options,
builtin_sparse_checkout_set_usage,
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);

if (update_modes(&set_opts.cone_mode, &set_opts.sparse_index))
return 1;
Expand Down
8 changes: 4 additions & 4 deletions builtin/stash.c
Original file line number Diff line number Diff line change
Expand Up @@ -782,7 +782,7 @@ static int list_stash(int argc, const char **argv, const char *prefix)

argc = parse_options(argc, argv, prefix, options,
git_stash_list_usage,
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);

if (!ref_exists(ref_stash))
return 0;
Expand Down Expand Up @@ -873,7 +873,7 @@ static int show_stash(int argc, const char **argv, const char *prefix)
init_revisions(&rev, prefix);

argc = parse_options(argc, argv, prefix, options, git_stash_show_usage,
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_KEEP_DASHDASH);

strvec_push(&revision_args, argv[0]);
Expand Down Expand Up @@ -979,7 +979,7 @@ static int store_stash(int argc, const char **argv, const char *prefix)

argc = parse_options(argc, argv, prefix, options,
git_stash_store_usage,
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);

if (argc != 1) {
if (!quiet)
Expand Down Expand Up @@ -1795,7 +1795,7 @@ int cmd_stash(int argc, const char **argv, const char *prefix)
git_config(git_stash_config, NULL);

argc = parse_options(argc, argv, prefix, options, git_stash_usage,
PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_DASHDASH);
PARSE_OPT_KEEP_UNKNOWN_OPT | PARSE_OPT_KEEP_DASHDASH);

prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
Expand Down
2 changes: 1 addition & 1 deletion diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -5661,7 +5661,7 @@ int diff_opt_parse(struct diff_options *options,

ac = parse_options(ac, av, prefix, options->parseopts, NULL,
PARSE_OPT_KEEP_DASHDASH |
PARSE_OPT_KEEP_UNKNOWN |
PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_NO_INTERNAL_HELP |
PARSE_OPT_ONE_SHOT |
PARSE_OPT_STOP_AT_NON_OPTION);
Expand Down
6 changes: 3 additions & 3 deletions parse-options.c
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ static enum parse_opt_result parse_long_opt(
rest = NULL;
if (!rest) {
/* abbreviated? */
if (!(p->flags & PARSE_OPT_KEEP_UNKNOWN) &&
if (!(p->flags & PARSE_OPT_KEEP_UNKNOWN_OPT) &&
!strncmp(long_name, arg, arg_end - arg)) {
is_abbreviated:
if (abbrev_option &&
Expand Down Expand Up @@ -515,7 +515,7 @@ static void parse_options_start_1(struct parse_opt_ctx_t *ctx,
ctx->prefix = prefix;
ctx->cpidx = ((flags & PARSE_OPT_KEEP_ARGV0) != 0);
ctx->flags = flags;
if ((flags & PARSE_OPT_KEEP_UNKNOWN) &&
if ((flags & PARSE_OPT_KEEP_UNKNOWN_OPT) &&
(flags & PARSE_OPT_STOP_AT_NON_OPTION) &&
!(flags & PARSE_OPT_ONE_SHOT))
BUG("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
Expand Down Expand Up @@ -839,7 +839,7 @@ enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
unknown:
if (ctx->flags & PARSE_OPT_ONE_SHOT)
break;
if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN))
if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN_OPT))
return PARSE_OPT_UNKNOWN;
ctx->out[ctx->cpidx++] = ctx->argv[0];
ctx->opt = NULL;
Expand Down
2 changes: 1 addition & 1 deletion parse-options.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ enum parse_opt_flags {
PARSE_OPT_KEEP_DASHDASH = 1 << 0,
PARSE_OPT_STOP_AT_NON_OPTION = 1 << 1,
PARSE_OPT_KEEP_ARGV0 = 1 << 2,
PARSE_OPT_KEEP_UNKNOWN = 1 << 3,
PARSE_OPT_KEEP_UNKNOWN_OPT = 1 << 3,
PARSE_OPT_NO_INTERNAL_HELP = 1 << 4,
PARSE_OPT_ONE_SHOT = 1 << 5,
PARSE_OPT_SHELL_EVAL = 1 << 6,
Expand Down
6 changes: 3 additions & 3 deletions t/helper/test-parse-options.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,9 +232,9 @@ static const struct option test_flag_options[] = {
OPT_BIT(0, "keep-argv0", &test_flags,
"pass PARSE_OPT_KEEP_ARGV0 to parse_options()",
PARSE_OPT_KEEP_ARGV0),
OPT_BIT(0, "keep-unknown", &test_flags,
"pass PARSE_OPT_KEEP_UNKNOWN to parse_options()",
PARSE_OPT_KEEP_UNKNOWN),
OPT_BIT(0, "keep-unknown-opt", &test_flags,
"pass PARSE_OPT_KEEP_UNKNOWN_OPT to parse_options()",
PARSE_OPT_KEEP_UNKNOWN_OPT),
OPT_BIT(0, "no-internal-help", &test_flags,
"pass PARSE_OPT_NO_INTERNAL_HELP to parse_options()",
PARSE_OPT_NO_INTERNAL_HELP),
Expand Down
2 changes: 1 addition & 1 deletion t/helper/test-serve-v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ int cmd__serve_v2(int argc, const char **argv)
/* ignore all unknown cmdline switches for now */
argc = parse_options(argc, argv, prefix, options, serve_usage,
PARSE_OPT_KEEP_DASHDASH |
PARSE_OPT_KEEP_UNKNOWN);
PARSE_OPT_KEEP_UNKNOWN_OPT);

if (advertise_capabilities)
protocol_v2_advertise_capabilities();
Expand Down
8 changes: 4 additions & 4 deletions t/t0040-parse-options.sh
Original file line number Diff line number Diff line change
Expand Up @@ -488,8 +488,8 @@ test_expect_success 'STOP_AT_NON_OPTION works' '
test_cmp expect actual
'

test_expect_success 'KEEP_UNKNOWN works' '
test-tool parse-options-flags --keep-unknown cmd --unknown=1 --opt=6 -u2 >actual &&
test_expect_success 'KEEP_UNKNOWN_OPT works' '
test-tool parse-options-flags --keep-unknown-opt cmd --unknown=1 --opt=6 -u2 >actual &&
cat >expect <<-\EOF &&
opt: 6
arg 00: --unknown=1
Expand All @@ -515,8 +515,8 @@ do
"
done

test_expect_success 'KEEP_UNKNOWN | NO_INTERNAL_HELP works' '
test-tool parse-options-flags --keep-unknown --no-internal-help cmd -h --help --help-all >actual &&
test_expect_success 'KEEP_UNKNOWN_OPT | NO_INTERNAL_HELP works' '
test-tool parse-options-flags --keep-unknown-opt --no-internal-help cmd -h --help --help-all >actual &&
cat >expect <<-\EOF &&
opt: 0
arg 00: -h
Expand Down

0 comments on commit 99d86d6

Please sign in to comment.