builtin/sparse-checkout.c: let parse-options parse subcommands

'git sparse-checkout' parses its subcommands with a couple of if
statements.  parse-options has just learned to parse subcommands, so
let's use that facility instead, with the benefits of shorter code,
handling missing or unknown subcommands, and listing subcommands for
Bash completion.

Note that some of the functions implementing each subcommand only
accept the 'argc' and '**argv' parameters, so add a (unused) '*prefix'
parameter to make them match the type expected by parse-options, and
thus avoid casting function pointers.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
SZEDER Gábor 2022-08-19 18:04:09 +02:00 committed by Junio C Hamano
parent b26a412f1e
commit 1c3502b198

View File

@ -48,7 +48,7 @@ static char const * const builtin_sparse_checkout_list_usage[] = {
NULL
};
static int sparse_checkout_list(int argc, const char **argv)
static int sparse_checkout_list(int argc, const char **argv, const char *prefix)
{
static struct option builtin_sparse_checkout_list_options[] = {
OPT_END(),
@ -431,7 +431,7 @@ static struct sparse_checkout_init_opts {
int sparse_index;
} init_opts;
static int sparse_checkout_init(int argc, const char **argv)
static int sparse_checkout_init(int argc, const char **argv, const char *prefix)
{
struct pattern_list pl;
char *sparse_filename;
@ -843,7 +843,8 @@ static struct sparse_checkout_reapply_opts {
int sparse_index;
} reapply_opts;
static int sparse_checkout_reapply(int argc, const char **argv)
static int sparse_checkout_reapply(int argc, const char **argv,
const char *prefix)
{
static struct option builtin_sparse_checkout_reapply_options[] = {
OPT_BOOL(0, "cone", &reapply_opts.cone_mode,
@ -876,7 +877,8 @@ static char const * const builtin_sparse_checkout_disable_usage[] = {
NULL
};
static int sparse_checkout_disable(int argc, const char **argv)
static int sparse_checkout_disable(int argc, const char **argv,
const char *prefix)
{
static struct option builtin_sparse_checkout_disable_options[] = {
OPT_END(),
@ -922,39 +924,25 @@ static int sparse_checkout_disable(int argc, const char **argv)
int cmd_sparse_checkout(int argc, const char **argv, const char *prefix)
{
static struct option builtin_sparse_checkout_options[] = {
parse_opt_subcommand_fn *fn = NULL;
struct option builtin_sparse_checkout_options[] = {
OPT_SUBCOMMAND("list", &fn, sparse_checkout_list),
OPT_SUBCOMMAND("init", &fn, sparse_checkout_init),
OPT_SUBCOMMAND("set", &fn, sparse_checkout_set),
OPT_SUBCOMMAND("add", &fn, sparse_checkout_add),
OPT_SUBCOMMAND("reapply", &fn, sparse_checkout_reapply),
OPT_SUBCOMMAND("disable", &fn, sparse_checkout_disable),
OPT_END(),
};
if (argc == 2 && !strcmp(argv[1], "-h"))
usage_with_options(builtin_sparse_checkout_usage,
builtin_sparse_checkout_options);
argc = parse_options(argc, argv, prefix,
builtin_sparse_checkout_options,
builtin_sparse_checkout_usage,
PARSE_OPT_STOP_AT_NON_OPTION);
builtin_sparse_checkout_usage, 0);
git_config(git_default_config, NULL);
prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
if (argc > 0) {
if (!strcmp(argv[0], "list"))
return sparse_checkout_list(argc, argv);
if (!strcmp(argv[0], "init"))
return sparse_checkout_init(argc, argv);
if (!strcmp(argv[0], "set"))
return sparse_checkout_set(argc, argv, prefix);
if (!strcmp(argv[0], "add"))
return sparse_checkout_add(argc, argv, prefix);
if (!strcmp(argv[0], "reapply"))
return sparse_checkout_reapply(argc, argv);
if (!strcmp(argv[0], "disable"))
return sparse_checkout_disable(argc, argv);
}
usage_with_options(builtin_sparse_checkout_usage,
builtin_sparse_checkout_options);
return fn(argc, argv, prefix);
}