1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-23 11:26:09 +02:00

parse-options: PARSE_OPT_KEEP_UNKNOWN only applies to --options

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>
This commit is contained in:
SZEDER Gábor 2022-08-19 18:03:57 +02:00 committed by Junio C Hamano
parent 80882bc5e7
commit 99d86d60e5
17 changed files with 33 additions and 31 deletions

View File

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

View File

@ -75,7 +75,7 @@ static int run_remote_archiver(int argc, const char **argv,
#define PARSE_OPT_KEEP_ALL ( PARSE_OPT_KEEP_DASHDASH | \ #define PARSE_OPT_KEEP_ALL ( PARSE_OPT_KEEP_DASHDASH | \
PARSE_OPT_KEEP_ARGV0 | \ PARSE_OPT_KEEP_ARGV0 | \
PARSE_OPT_KEEP_UNKNOWN | \ PARSE_OPT_KEEP_UNKNOWN_OPT | \
PARSE_OPT_NO_INTERNAL_HELP ) PARSE_OPT_NO_INTERNAL_HELP )
int cmd_archive(int argc, const char **argv, const char *prefix) int cmd_archive(int argc, const char **argv, const char *prefix)

View File

@ -1324,7 +1324,7 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, argc = parse_options(argc, argv, prefix, options,
git_bisect_helper_usage, git_bisect_helper_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN_OPT);
if (!cmdmode) if (!cmdmode)
usage_with_options(git_bisect_helper_usage, options); usage_with_options(git_bisect_helper_usage, options);

View File

@ -716,7 +716,7 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
symlinks = has_symlinks; symlinks = has_symlinks;
argc = parse_options(argc, argv, prefix, builtin_difftool_options, 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); PARSE_OPT_KEEP_DASHDASH);
if (tool_help) if (tool_help)

View File

@ -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, argc = parse_options(argc, argv, prefix, opts, env__helper_usage,
PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_UNKNOWN_OPT);
if (env_default && !*env_default) if (env_default && !*env_default)
usage_with_options(env__helper_usage, opts); usage_with_options(env__helper_usage, opts);
if (!cmdmode) if (!cmdmode)

View File

@ -1221,7 +1221,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
revs.sources = &revision_sources; revs.sources = &revision_sources;
revs.rewrite_parents = 1; revs.rewrite_parents = 1;
argc = parse_options(argc, argv, prefix, options, fast_export_usage, 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); argc = setup_revisions(argc, argv, &revs, NULL);
if (argc > 1) if (argc > 1)
usage_with_options (fast_export_usage, options); usage_with_options (fast_export_usage, options);

View File

@ -199,7 +199,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
mailmap = use_mailmap_config; mailmap = use_mailmap_config;
argc = parse_options(argc, argv, prefix, argc = parse_options(argc, argv, prefix,
builtin_log_options, builtin_log_usage, 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); PARSE_OPT_KEEP_DASHDASH);
if (quiet) if (quiet)
@ -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, argc = parse_options(argc, argv, prefix, builtin_format_patch_options,
builtin_format_patch_usage, 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); PARSE_OPT_KEEP_DASHDASH);
/* Make sure "0000-$sub.patch" gives non-negative length for $sub */ /* Make sure "0000-$sub.patch" gives non-negative length for $sub */

View File

@ -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_options(argc, argv, prefix, options, reflog_show_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_UNKNOWN_OPT);
return cmd_log_reflog(argc, argv, prefix); return cmd_log_reflog(argc, argv, prefix);
} }
@ -410,7 +410,7 @@ int cmd_reflog(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, reflog_usage, argc = parse_options(argc, argv, prefix, options, reflog_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_NO_INTERNAL_HELP); PARSE_OPT_NO_INTERNAL_HELP);
/* /*

View File

@ -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, argc = parse_options(argc, argv, NULL, options, usage_str,
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_ARGV0 |
PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_UNKNOWN_OPT);
prepare_repo_settings(the_repository); prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0; the_repository->settings.command_requires_full_index = 0;

View File

@ -767,7 +767,7 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, argc = parse_options(argc, argv, prefix,
builtin_sparse_checkout_add_options, builtin_sparse_checkout_add_options,
builtin_sparse_checkout_add_usage, builtin_sparse_checkout_add_usage,
PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_UNKNOWN_OPT);
sanitize_paths(argc, argv, prefix, add_opts.skip_checks); sanitize_paths(argc, argv, prefix, add_opts.skip_checks);
@ -813,7 +813,7 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, argc = parse_options(argc, argv, prefix,
builtin_sparse_checkout_set_options, builtin_sparse_checkout_set_options,
builtin_sparse_checkout_set_usage, 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)) if (update_modes(&set_opts.cone_mode, &set_opts.sparse_index))
return 1; return 1;

View File

@ -782,7 +782,7 @@ static int list_stash(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, argc = parse_options(argc, argv, prefix, options,
git_stash_list_usage, git_stash_list_usage,
PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_UNKNOWN_OPT);
if (!ref_exists(ref_stash)) if (!ref_exists(ref_stash))
return 0; return 0;
@ -873,7 +873,7 @@ static int show_stash(int argc, const char **argv, const char *prefix)
init_revisions(&rev, prefix); init_revisions(&rev, prefix);
argc = parse_options(argc, argv, prefix, options, git_stash_show_usage, 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); PARSE_OPT_KEEP_DASHDASH);
strvec_push(&revision_args, argv[0]); strvec_push(&revision_args, argv[0]);
@ -979,7 +979,7 @@ static int store_stash(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, argc = parse_options(argc, argv, prefix, options,
git_stash_store_usage, git_stash_store_usage,
PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_UNKNOWN_OPT);
if (argc != 1) { if (argc != 1) {
if (!quiet) if (!quiet)
@ -1795,7 +1795,7 @@ int cmd_stash(int argc, const char **argv, const char *prefix)
git_config(git_stash_config, NULL); git_config(git_stash_config, NULL);
argc = parse_options(argc, argv, prefix, options, git_stash_usage, 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); prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0; the_repository->settings.command_requires_full_index = 0;

2
diff.c
View File

@ -5661,7 +5661,7 @@ int diff_opt_parse(struct diff_options *options,
ac = parse_options(ac, av, prefix, options->parseopts, NULL, ac = parse_options(ac, av, prefix, options->parseopts, NULL,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_DASHDASH |
PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_UNKNOWN_OPT |
PARSE_OPT_NO_INTERNAL_HELP | PARSE_OPT_NO_INTERNAL_HELP |
PARSE_OPT_ONE_SHOT | PARSE_OPT_ONE_SHOT |
PARSE_OPT_STOP_AT_NON_OPTION); PARSE_OPT_STOP_AT_NON_OPTION);

View File

@ -332,7 +332,7 @@ static enum parse_opt_result parse_long_opt(
rest = NULL; rest = NULL;
if (!rest) { if (!rest) {
/* abbreviated? */ /* abbreviated? */
if (!(p->flags & PARSE_OPT_KEEP_UNKNOWN) && if (!(p->flags & PARSE_OPT_KEEP_UNKNOWN_OPT) &&
!strncmp(long_name, arg, arg_end - arg)) { !strncmp(long_name, arg, arg_end - arg)) {
is_abbreviated: is_abbreviated:
if (abbrev_option && if (abbrev_option &&
@ -515,7 +515,7 @@ static void parse_options_start_1(struct parse_opt_ctx_t *ctx,
ctx->prefix = prefix; ctx->prefix = prefix;
ctx->cpidx = ((flags & PARSE_OPT_KEEP_ARGV0) != 0); ctx->cpidx = ((flags & PARSE_OPT_KEEP_ARGV0) != 0);
ctx->flags = flags; 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_STOP_AT_NON_OPTION) &&
!(flags & PARSE_OPT_ONE_SHOT)) !(flags & PARSE_OPT_ONE_SHOT))
BUG("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together"); BUG("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
@ -839,7 +839,7 @@ enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
unknown: unknown:
if (ctx->flags & PARSE_OPT_ONE_SHOT) if (ctx->flags & PARSE_OPT_ONE_SHOT)
break; break;
if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN)) if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN_OPT))
return PARSE_OPT_UNKNOWN; return PARSE_OPT_UNKNOWN;
ctx->out[ctx->cpidx++] = ctx->argv[0]; ctx->out[ctx->cpidx++] = ctx->argv[0];
ctx->opt = NULL; ctx->opt = NULL;

View File

@ -30,7 +30,7 @@ enum parse_opt_flags {
PARSE_OPT_KEEP_DASHDASH = 1 << 0, PARSE_OPT_KEEP_DASHDASH = 1 << 0,
PARSE_OPT_STOP_AT_NON_OPTION = 1 << 1, PARSE_OPT_STOP_AT_NON_OPTION = 1 << 1,
PARSE_OPT_KEEP_ARGV0 = 1 << 2, 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_NO_INTERNAL_HELP = 1 << 4,
PARSE_OPT_ONE_SHOT = 1 << 5, PARSE_OPT_ONE_SHOT = 1 << 5,
PARSE_OPT_SHELL_EVAL = 1 << 6, PARSE_OPT_SHELL_EVAL = 1 << 6,

View File

@ -232,9 +232,9 @@ static const struct option test_flag_options[] = {
OPT_BIT(0, "keep-argv0", &test_flags, OPT_BIT(0, "keep-argv0", &test_flags,
"pass PARSE_OPT_KEEP_ARGV0 to parse_options()", "pass PARSE_OPT_KEEP_ARGV0 to parse_options()",
PARSE_OPT_KEEP_ARGV0), PARSE_OPT_KEEP_ARGV0),
OPT_BIT(0, "keep-unknown", &test_flags, OPT_BIT(0, "keep-unknown-opt", &test_flags,
"pass PARSE_OPT_KEEP_UNKNOWN to parse_options()", "pass PARSE_OPT_KEEP_UNKNOWN_OPT to parse_options()",
PARSE_OPT_KEEP_UNKNOWN), PARSE_OPT_KEEP_UNKNOWN_OPT),
OPT_BIT(0, "no-internal-help", &test_flags, OPT_BIT(0, "no-internal-help", &test_flags,
"pass PARSE_OPT_NO_INTERNAL_HELP to parse_options()", "pass PARSE_OPT_NO_INTERNAL_HELP to parse_options()",
PARSE_OPT_NO_INTERNAL_HELP), PARSE_OPT_NO_INTERNAL_HELP),

View File

@ -24,7 +24,7 @@ int cmd__serve_v2(int argc, const char **argv)
/* ignore all unknown cmdline switches for now */ /* ignore all unknown cmdline switches for now */
argc = parse_options(argc, argv, prefix, options, serve_usage, argc = parse_options(argc, argv, prefix, options, serve_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_DASHDASH |
PARSE_OPT_KEEP_UNKNOWN); PARSE_OPT_KEEP_UNKNOWN_OPT);
if (advertise_capabilities) if (advertise_capabilities)
protocol_v2_advertise_capabilities(); protocol_v2_advertise_capabilities();

View File

@ -488,8 +488,8 @@ test_expect_success 'STOP_AT_NON_OPTION works' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'KEEP_UNKNOWN works' ' test_expect_success 'KEEP_UNKNOWN_OPT works' '
test-tool parse-options-flags --keep-unknown cmd --unknown=1 --opt=6 -u2 >actual && test-tool parse-options-flags --keep-unknown-opt cmd --unknown=1 --opt=6 -u2 >actual &&
cat >expect <<-\EOF && cat >expect <<-\EOF &&
opt: 6 opt: 6
arg 00: --unknown=1 arg 00: --unknown=1
@ -515,8 +515,8 @@ do
" "
done done
test_expect_success 'KEEP_UNKNOWN | NO_INTERNAL_HELP works' ' test_expect_success 'KEEP_UNKNOWN_OPT | NO_INTERNAL_HELP works' '
test-tool parse-options-flags --keep-unknown --no-internal-help cmd -h --help --help-all >actual && test-tool parse-options-flags --keep-unknown-opt --no-internal-help cmd -h --help --help-all >actual &&
cat >expect <<-\EOF && cat >expect <<-\EOF &&
opt: 0 opt: 0
arg 00: -h arg 00: -h