Re: [PATCH 6/8] builtin/config: introduce subcommands
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Mar 7, 2024, 07:14 UTC
- Message-ID
- <ZelpcoIh5dalqrRF@tanuki>
- In-Reply-To
- <CAOLa=ZSg35atoTsBVtWj_j94n2Mt8otzfw3DYLYS9FCbNgp_Xg@mail.gmail.com>
On Wed, Mar 06, 2024 at 01:38:25PM -0800, Karthik Nayak wrote:
Show 23 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
>
> > @@ -910,6 +930,20 @@ int cmd_config(int argc, const char **argv, const char *prefix)
> > {
> > given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT));
> >
> > + /*
> > + * This is somewhat hacky: we first parse the command line while
> > + * keeping all args intact in order to determine whether a subcommand
> > + * has been specified. If so, we re-parse it a second time, but this
> > + * time we drop KEEP_ARGV0. This is so that we don't munge the command
> > + * line in case no subcommand was given, which would otherwise confuse
> > + * us when parsing the implicit modes.
> > + */
> > + argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
> > + PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_KEEP_ARGV0|PARSE_OPT_KEEP_UNKNOWN_OPT);
> > + if (subcommand)
> > + argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
> > + PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_KEEP_UNKNOWN_OPT);
> > +
>
> I wonder if we can drop the PARSE_OPT_SUBCOMMAND_OPTIONAL in the second
> iteration to make it stricter. But this is OK.We can't due to a restriction in the parse-options interface: when subcommands are present, then PARSE_OPT_KEEP_UNKNOWN_OPT requires us to also pass PARSE_OPT_SUBCOMMAND_OPTIONAL. Otherwise we trigger a `BUG()`.
Patrick