Skip to content

Commit

Permalink
builtin/multi-pack-index.c: let parse-options parse subcommands
Browse files Browse the repository at this point in the history
'git multi-pack-index' parses its subcommands with a couple of if-else
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 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>
  • Loading branch information
szeder authored and gitster committed Aug 19, 2022
1 parent f83736c commit bf0a6b6
Showing 1 changed file with 22 additions and 29 deletions.
51 changes: 22 additions & 29 deletions builtin/multi-pack-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ static void read_packs_from_stdin(struct string_list *to)
strbuf_release(&buf);
}

static int cmd_multi_pack_index_write(int argc, const char **argv)
static int cmd_multi_pack_index_write(int argc, const char **argv,
const char *prefix)
{
struct option *options;
static struct option builtin_multi_pack_index_write_options[] = {
Expand Down Expand Up @@ -160,7 +161,8 @@ static int cmd_multi_pack_index_write(int argc, const char **argv)
opts.refs_snapshot, opts.flags);
}

static int cmd_multi_pack_index_verify(int argc, const char **argv)
static int cmd_multi_pack_index_verify(int argc, const char **argv,
const char *prefix)
{
struct option *options;
static struct option builtin_multi_pack_index_verify_options[] = {
Expand All @@ -186,7 +188,8 @@ static int cmd_multi_pack_index_verify(int argc, const char **argv)
return verify_midx_file(the_repository, opts.object_dir, opts.flags);
}

static int cmd_multi_pack_index_expire(int argc, const char **argv)
static int cmd_multi_pack_index_expire(int argc, const char **argv,
const char *prefix)
{
struct option *options;
static struct option builtin_multi_pack_index_expire_options[] = {
Expand All @@ -212,7 +215,8 @@ static int cmd_multi_pack_index_expire(int argc, const char **argv)
return expire_midx_packs(the_repository, opts.object_dir, opts.flags);
}

static int cmd_multi_pack_index_repack(int argc, const char **argv)
static int cmd_multi_pack_index_repack(int argc, const char **argv,
const char *prefix)
{
struct option *options;
static struct option builtin_multi_pack_index_repack_options[] = {
Expand Down Expand Up @@ -247,7 +251,15 @@ int cmd_multi_pack_index(int argc, const char **argv,
const char *prefix)
{
int res;
struct option *builtin_multi_pack_index_options = common_opts;
parse_opt_subcommand_fn *fn = NULL;
struct option builtin_multi_pack_index_options[] = {
OPT_SUBCOMMAND("repack", &fn, cmd_multi_pack_index_repack),
OPT_SUBCOMMAND("write", &fn, cmd_multi_pack_index_write),
OPT_SUBCOMMAND("verify", &fn, cmd_multi_pack_index_verify),
OPT_SUBCOMMAND("expire", &fn, cmd_multi_pack_index_expire),
OPT_END(),
};
struct option *options = parse_options_concat(builtin_multi_pack_index_options, common_opts);

git_config(git_default_config, NULL);

Expand All @@ -256,31 +268,12 @@ int cmd_multi_pack_index(int argc, const char **argv,
the_repository->objects->odb)
opts.object_dir = xstrdup(the_repository->objects->odb->path);

argc = parse_options(argc, argv, prefix,
builtin_multi_pack_index_options,
builtin_multi_pack_index_usage,
PARSE_OPT_STOP_AT_NON_OPTION);

if (!argc)
goto usage;

if (!strcmp(argv[0], "repack"))
res = cmd_multi_pack_index_repack(argc, argv);
else if (!strcmp(argv[0], "write"))
res = cmd_multi_pack_index_write(argc, argv);
else if (!strcmp(argv[0], "verify"))
res = cmd_multi_pack_index_verify(argc, argv);
else if (!strcmp(argv[0], "expire"))
res = cmd_multi_pack_index_expire(argc, argv);
else {
error(_("unrecognized subcommand: %s"), argv[0]);
goto usage;
}
argc = parse_options(argc, argv, prefix, options,
builtin_multi_pack_index_usage, 0);
FREE_AND_NULL(options);

res = fn(argc, argv, prefix);

free(opts.object_dir);
return res;

usage:
usage_with_options(builtin_multi_pack_index_usage,
builtin_multi_pack_index_options);
}

0 comments on commit bf0a6b6

Please sign in to comment.