Re: [RFC PATCH v3 5/6] parse-options: parse into argv_array
From: Junio C Hamano <hidden>
Date: 2020-07-29 19:33:47
Emily Shaffer [off-list ref] writes:
parse-options already knows how to read into a string_list, and it knows
how to read into an argv_array as a passthrough (that is, including the
argument as well as its value). string_list and argv_array serve similar
purposes but are somewhat painful to convert between; so, let's teach
parse-options to read values of string arguments directly into an
argv_array without preserving the argument name.
This is useful if collecting generic arguments to pass through to
another command, for example, 'git hook run --arg "--quiet" --arg
"--format=pretty" some-hook'. The resulting argv_array would contain
{ "--quiet", "--format=pretty" }.
The implementation is based on that of OPT_STRING_LIST.Be it argv_array or strvec, I think this is a useful thing to do. I grepped for the users of OPT_STRING_LIST() to see if some of them are better served by this, but none of them stood out as candidates that are particularly good match.
+int parse_opt_argv_array(const struct option *opt, const char *arg, int unset)
+{
+ struct argv_array *v = opt->value;
+
+ if (unset) {
+ argv_array_clear(v);
+ return 0;
+ }
+
+ if (!arg)
+ return -1;I think the calling parse_options() loop would catch this negative return and raise an error, but is it better for this code to stay silent or would it be better to say that opt->long_name/short_name is not a boolean?
+ argv_array_push(v, arg); + return 0; +}