]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/commit-graph.c: let parse-options parse subcommands
authorSZEDER Gábor <szeder.dev@gmail.com>
Fri, 19 Aug 2022 16:04:02 +0000 (18:04 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Aug 2022 18:13:15 +0000 (11:13 -0700)
'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>
builtin/commit-graph.c
t/t5318-commit-graph.sh

index 51c4040ea6c879bda3631343643f3a52063a1bdc..1eb5492cbda49bcd050b37c2ca29f483a0c71867 100644 (file)
@@ -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;
@@ -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;
@@ -307,26 +307,22 @@ cleanup:
 
 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);
 }
index be0b5641ffc39c65a3f790ed8edda2e227201540..7e040eb1edba3c321526b6e306d0ce6058b2aeb0 100755 (executable)
@@ -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 &&