Jeff King <[email protected]> writes:
> If we don't mind a one-time pain, I think we can just convert the
> existing usage() to something more like usage_with_options(). The patch
> below does that (and teaches the latter to handle a NULL options field).
>
> The diff is ugly, and the conversion is mostly mechanical. But I think
> some sites can be improved. For example, look at the change in bundle.c,
> which now hands a set of strings rather than formatting the whole "or:"
> chain manually.
> ...
> With bonus points for actually describing each option (though at that
> point it may be as much work to just convert the thing to parse-options,
> which would also be fine with me).
>
> That's tedious work which would need attention paid to each individual
> command. So I'd probably do a single mechanical patch like this one
> (that keeps the output identical), and then let people fix each one up
> on top.
Yup. Unlike my other hack, this does look more useful to me. It
was kind of surprising that the change to parse-options is just a
single liner, but it's just "no input resulting in no output" ;-)
> diff --git a/git.c b/git.c
> index 1b8b7f51a..3496f8a23 100644
> --- a/git.c
> +++ b/git.c
> @@ -3,12 +3,14 @@
> #include "help.h"
> #include "run-command.h"
>
> -const char git_usage_string[] =
> +const char *git_usage_string[] = {
> "git [--version] [--help] [-C <path>] [-c name=value]\n"
> " [--exec-path[=<path>]] [--html-path] [--man-path]
> [--info-path]\n"
> " [-p | --paginate | --no-pager] [--no-replace-objects]
> [--bare]\n"
> " [--git-dir=<path>] [--work-tree=<path>]
> [--namespace=<name>]\n"
> - " <command> [<args>]";
> + " <command> [<args>]",
> + NULL
> +};
>
> const char git_more_info_string[] =
> N_("'git help -a' and 'git help -g' list available subcommands and
> some\n"
> @@ -694,7 +696,7 @@ int cmd_main(int argc, const char **argv)
> } else {
> /* The user didn't specify a command; give them help */
> commit_pager_choice();
> - printf("usage: %s\n\n", git_usage_string);
> + printf("usage: %s\n\n", git_usage_string[0]);
> list_common_cmds_help();
> printf("\n%s\n", _(git_more_info_string));
> exit(1);
> diff --git a/parse-options.c b/parse-options.c
> index a23a1e67f..b0cc2a410 100644
> --- a/parse-options.c
> +++ b/parse-options.c
> @@ -600,6 +600,9 @@ static int usage_with_options_internal(struct
> parse_opt_ctx_t *ctx,
> usagestr++;
> }
>
> + if (!opts)
> + return PARSE_OPT_HELP;
> +
> if (opts->type != OPTION_GROUP)
> fputc('\n', outfile);