parse-options API: remove OPTION_ARGUMENT feature
As was noted in1a85b49b87
(parse-options: make OPT_ARGUMENT() more useful, 2019-03-14) there's only ever been one user of the OPT_ARGUMENT(), that user was added in20de316e33
(difftool: allow running outside Git worktrees with --no-index, 2019-03-14). The OPT_ARGUMENT() feature itself was added way back in580d5bffde
(parse-options: new option type to treat an option-like parameter as an argument., 2008-03-02), but as discussed in1a85b49b87
wasn't used until20de316e33
in 2019. Now that the preceding commit has migrated this code over to using "struct strvec" to manage the "args" member of a "struct child_process", we can just use that directly instead of relying on OPT_ARGUMENT. This has a minor change in behavior in that if we'll pass --no-index we'll now always pass it as the first argument, before we'd pass it in whatever position the caller did. Preserving this was the real value of OPT_ARGUMENT(), but as it turns out we didn't need that either. We can always inject it as the first argument, the other end will parse it just the same. Note that we cannot remove the "out" and "cpidx" members of "struct parse_opt_ctx_t" added in580d5bffde
, while they were introduced with OPT_ARGUMENT() we since used them for other things. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
cc5b594788
commit
4c25356e0e
@ -198,11 +198,6 @@ There are some macros to easily define options:
|
||||
The filename will be prefixed by passing the filename along with
|
||||
the prefix argument of `parse_options()` to `prefix_filename()`.
|
||||
|
||||
`OPT_ARGUMENT(long, &int_var, description)`::
|
||||
Introduce a long-option argument that will be kept in `argv[]`.
|
||||
If this option was seen, `int_var` will be set to one (except
|
||||
if a `NULL` pointer was passed).
|
||||
|
||||
`OPT_NUMBER_CALLBACK(&var, description, func_ptr)`::
|
||||
Recognize numerical options like -123 and feed the integer as
|
||||
if it was an argument to the function given by `func_ptr`.
|
||||
|
@ -709,7 +709,7 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
|
||||
"tool returns a non - zero exit code")),
|
||||
OPT_STRING('x', "extcmd", &extcmd, N_("command"),
|
||||
N_("specify a custom command for viewing diffs")),
|
||||
OPT_ARGUMENT("no-index", &no_index, N_("passed to `diff`")),
|
||||
OPT_BOOL(0, "no-index", &no_index, N_("passed to `diff`")),
|
||||
OPT_END()
|
||||
};
|
||||
struct child_process child = CHILD_PROCESS_INIT;
|
||||
@ -763,6 +763,8 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
|
||||
* each file that changed.
|
||||
*/
|
||||
strvec_push(&child.args, "diff");
|
||||
if (no_index)
|
||||
strvec_push(&child.args, "--no-index");
|
||||
if (dir_diff)
|
||||
strvec_pushl(&child.args, "--raw", "--no-abbrev", "-z", NULL);
|
||||
strvec_pushv(&child.args, argv);
|
||||
|
@ -310,19 +310,6 @@ static enum parse_opt_result parse_long_opt(
|
||||
again:
|
||||
if (!skip_prefix(arg, long_name, &rest))
|
||||
rest = NULL;
|
||||
if (options->type == OPTION_ARGUMENT) {
|
||||
if (!rest)
|
||||
continue;
|
||||
if (*rest == '=')
|
||||
return error(_("%s takes no value"),
|
||||
optname(options, flags));
|
||||
if (*rest)
|
||||
continue;
|
||||
if (options->value)
|
||||
*(int *)options->value = options->defval;
|
||||
p->out[p->cpidx++] = arg - 2;
|
||||
return PARSE_OPT_DONE;
|
||||
}
|
||||
if (!rest) {
|
||||
/* abbreviated? */
|
||||
if (!(p->flags & PARSE_OPT_KEEP_UNKNOWN) &&
|
||||
|
@ -8,7 +8,6 @@
|
||||
enum parse_opt_type {
|
||||
/* special types */
|
||||
OPTION_END,
|
||||
OPTION_ARGUMENT,
|
||||
OPTION_GROUP,
|
||||
OPTION_NUMBER,
|
||||
OPTION_ALIAS,
|
||||
@ -155,8 +154,6 @@ struct option {
|
||||
#define OPT_INTEGER_F(s, l, v, h, f) { OPTION_INTEGER, (s), (l), (v), N_("n"), (h), (f) }
|
||||
|
||||
#define OPT_END() { OPTION_END }
|
||||
#define OPT_ARGUMENT(l, v, h) { OPTION_ARGUMENT, 0, (l), (v), NULL, \
|
||||
(h), PARSE_OPT_NOARG, NULL, 1 }
|
||||
#define OPT_GROUP(h) { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
|
||||
#define OPT_BIT(s, l, v, h, b) OPT_BIT_F(s, l, v, h, b, 0)
|
||||
#define OPT_BITOP(s, l, v, h, set, clear) { OPTION_BITOP, (s), (l), (v), NULL, (h), \
|
||||
|
@ -134,7 +134,6 @@ int cmd__parse_options(int argc, const char **argv)
|
||||
OPT_NOOP_NOARG(0, "obsolete"),
|
||||
OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
|
||||
OPT_GROUP("Magic arguments"),
|
||||
OPT_ARGUMENT("quux", NULL, "means --quux"),
|
||||
OPT_NUMBER_CALLBACK(&integer, "set integer to NUM",
|
||||
number_callback),
|
||||
{ OPTION_COUNTUP, '+', NULL, &boolean, NULL, "same as -b",
|
||||
|
@ -37,7 +37,6 @@ String options
|
||||
--list <str> add str to list
|
||||
|
||||
Magic arguments
|
||||
--quux means --quux
|
||||
-NUM set integer to NUM
|
||||
+ same as -b
|
||||
--ambiguous positive ambiguity
|
||||
@ -263,10 +262,6 @@ test_expect_success 'detect possible typos' '
|
||||
test_cmp typo.err output.err
|
||||
'
|
||||
|
||||
test_expect_success 'keep some options as arguments' '
|
||||
test-tool parse-options --expect="arg 00: --quux" --quux
|
||||
'
|
||||
|
||||
cat >expect <<\EOF
|
||||
Callback: "four", 0
|
||||
boolean: 5
|
||||
|
Loading…
Reference in New Issue
Block a user