Skip to content

Commit

Permalink
builtin/commit-graph.c: let parse-options parse subcommands
Browse files Browse the repository at this point in the history
'git commit-graph' parses its subcommands with an if-else if
statement.  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 aef7d75 commit 1c3b051
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 19 deletions.
30 changes: 13 additions & 17 deletions builtin/commit-graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ static struct option *add_common_options(struct option *to)
return parse_options_concat(common_opts, to);
}

static int graph_verify(int argc, const char **argv)
static int graph_verify(int argc, const char **argv, const char *prefix)
{
struct commit_graph *graph = NULL;
struct object_directory *odb = NULL;
Expand Down Expand Up @@ -190,7 +190,7 @@ static int git_commit_graph_write_config(const char *var, const char *value,
return 0;
}

static int graph_write(int argc, const char **argv)
static int graph_write(int argc, const char **argv, const char *prefix)
{
struct string_list pack_indexes = STRING_LIST_INIT_DUP;
struct strbuf buf = STRBUF_INIT;
Expand Down Expand Up @@ -307,26 +307,22 @@ static int graph_write(int argc, const char **argv)

int cmd_commit_graph(int argc, const char **argv, const char *prefix)
{
struct option *builtin_commit_graph_options = common_opts;
parse_opt_subcommand_fn *fn = NULL;
struct option builtin_commit_graph_options[] = {
OPT_SUBCOMMAND("verify", &fn, graph_verify),
OPT_SUBCOMMAND("write", &fn, graph_write),
OPT_END(),
};
struct option *options = parse_options_concat(builtin_commit_graph_options, common_opts);

git_config(git_default_config, NULL);
argc = parse_options(argc, argv, prefix,
builtin_commit_graph_options,
builtin_commit_graph_usage,
PARSE_OPT_STOP_AT_NON_OPTION);
if (!argc)
goto usage;

read_replace_refs = 0;
save_commit_buffer = 0;

if (!strcmp(argv[0], "verify"))
return graph_verify(argc, argv);
else if (argc && !strcmp(argv[0], "write"))
return graph_write(argc, argv);
argc = parse_options(argc, argv, prefix, options,
builtin_commit_graph_usage, 0);
FREE_AND_NULL(options);

error(_("unrecognized subcommand: %s"), argv[0]);
usage:
usage_with_options(builtin_commit_graph_usage,
builtin_commit_graph_options);
return fn(argc, argv, prefix);
}
4 changes: 2 additions & 2 deletions t/t5318-commit-graph.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ test_expect_success 'usage' '

test_expect_success 'usage shown without sub-command' '
test_expect_code 129 git commit-graph 2>err &&
! grep error: err
grep usage: err
'

test_expect_success 'usage shown with an error on unknown sub-command' '
cat >expect <<-\EOF &&
error: unrecognized subcommand: unknown
error: unknown subcommand: `unknown'\''
EOF
test_expect_code 129 git commit-graph unknown 2>stderr &&
grep error stderr >actual &&
Expand Down

0 comments on commit 1c3b051

Please sign in to comment.