Browse Source

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>
maint
SZEDER Gábor 3 years ago committed by Junio C Hamano
parent
commit
99d86d60e5
  1. 6
      Documentation/technical/api-parse-options.txt
  2. 2
      builtin/archive.c
  3. 2
      builtin/bisect--helper.c
  4. 2
      builtin/difftool.c
  5. 2
      builtin/env--helper.c
  6. 2
      builtin/fast-export.c
  7. 4
      builtin/log.c
  8. 4
      builtin/reflog.c
  9. 2
      builtin/revert.c
  10. 4
      builtin/sparse-checkout.c
  11. 8
      builtin/stash.c
  12. 2
      diff.c
  13. 6
      parse-options.c
  14. 2
      parse-options.h
  15. 6
      t/helper/test-parse-options.c
  16. 2
      t/helper/test-serve-v2.c
  17. 8
      t/t0040-parse-options.sh

6
Documentation/technical/api-parse-options.txt

@ -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

2
builtin/archive.c

@ -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)

2
builtin/bisect--helper.c

@ -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);

2
builtin/difftool.c

@ -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)

2
builtin/env--helper.c

@ -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)

2
builtin/fast-export.c

@ -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);

4
builtin/log.c

@ -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 */

4
builtin/reflog.c

@ -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);


/* /*

2
builtin/revert.c

@ -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;

4
builtin/sparse-checkout.c

@ -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;

8
builtin/stash.c

@ -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

@ -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);

6
parse-options.c

@ -332,7 +332,7 @@ again:
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;

2
parse-options.h

@ -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,

6
t/helper/test-parse-options.c

@ -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),

2
t/helper/test-serve-v2.c

@ -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();

8
t/t0040-parse-options.sh

@ -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

Loading…
Cancel
Save