bisect--helper: move all subcommands into their own functions

In a later change, we will use OPT_SUBCOMMAND to parse sub-commands to
avoid consuming non-option opts.

Since OPT_SUBCOMMAND needs a function pointer to operate,
let's move it now.

Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
This commit is contained in:
Đoàn Trần Công Danh 2022-11-10 23:36:21 +07:00 committed by Taylor Blau
parent 58786d73ba
commit 464ce0aba8

View file

@ -1277,6 +1277,117 @@ static int bisect_run(struct bisect_terms *terms, const char **argv, int argc)
return res; return res;
} }
static int cmd_bisect__reset(int argc, const char **argv, const char *prefix UNUSED)
{
if (argc > 1)
return error(_("--bisect-reset requires either no argument or a commit"));
return bisect_reset(argc ? argv[0] : NULL);
}
static int cmd_bisect__terms(int argc, const char **argv, const char *prefix UNUSED)
{
int res;
struct bisect_terms terms = { 0 };
if (argc > 1)
return error(_("--bisect-terms requires 0 or 1 argument"));
res = bisect_terms(&terms, argc == 1 ? argv[0] : NULL);
free_terms(&terms);
return res;
}
static int cmd_bisect__start(int argc, const char **argv, const char *prefix UNUSED)
{
int res;
struct bisect_terms terms = { 0 };
set_terms(&terms, "bad", "good");
res = bisect_start(&terms, argv, argc);
free_terms(&terms);
return res;
}
static int cmd_bisect__next(int argc, const char **argv UNUSED, const char *prefix)
{
int res;
struct bisect_terms terms = { 0 };
if (argc)
return error(_("--bisect-next requires 0 arguments"));
get_terms(&terms);
res = bisect_next(&terms, prefix);
free_terms(&terms);
return res;
}
static int cmd_bisect__state(int argc, const char **argv, const char *prefix UNUSED)
{
int res;
struct bisect_terms terms = { 0 };
set_terms(&terms, "bad", "good");
get_terms(&terms);
res = bisect_state(&terms, argv, argc);
free_terms(&terms);
return res;
}
static int cmd_bisect__log(int argc, const char **argv UNUSED, const char *prefix UNUSED)
{
if (argc)
return error(_("--bisect-log requires 0 arguments"));
return bisect_log();
}
static int cmd_bisect__replay(int argc, const char **argv, const char *prefix UNUSED)
{
int res;
struct bisect_terms terms = { 0 };
if (argc != 1)
return error(_("no logfile given"));
set_terms(&terms, "bad", "good");
res = bisect_replay(&terms, argv[0]);
free_terms(&terms);
return res;
}
static int cmd_bisect__skip(int argc, const char **argv, const char *prefix UNUSED)
{
int res;
struct bisect_terms terms = { 0 };
set_terms(&terms, "bad", "good");
get_terms(&terms);
res = bisect_skip(&terms, argv, argc);
free_terms(&terms);
return res;
}
static int cmd_bisect__visualize(int argc, const char **argv, const char *prefix UNUSED)
{
int res;
struct bisect_terms terms = { 0 };
get_terms(&terms);
res = bisect_visualize(&terms, argv, argc);
free_terms(&terms);
return res;
}
static int cmd_bisect__run(int argc, const char **argv, const char *prefix UNUSED)
{
int res;
struct bisect_terms terms = { 0 };
if (!argc)
return error(_("bisect run failed: no command provided."));
get_terms(&terms);
res = bisect_run(&terms, argv, argc);
free_terms(&terms);
return res;
}
int cmd_bisect__helper(int argc, const char **argv, const char *prefix) int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
{ {
enum { enum {
@ -1316,8 +1427,6 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
N_("use <cmd>... to automatically bisect"), BISECT_RUN), N_("use <cmd>... to automatically bisect"), BISECT_RUN),
OPT_END() OPT_END()
}; };
struct bisect_terms terms = { .term_good = NULL, .term_bad = NULL };
argc = parse_options(argc, argv, prefix, options, argc = parse_options(argc, argv, prefix, options,
git_bisect_helper_usage, git_bisect_helper_usage,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN_OPT); PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN_OPT);
@ -1327,60 +1436,38 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
switch (cmdmode) { switch (cmdmode) {
case BISECT_RESET: case BISECT_RESET:
if (argc > 1) res = cmd_bisect__reset(argc, argv, prefix);
return error(_("--bisect-reset requires either no argument or a commit"));
res = bisect_reset(argc ? argv[0] : NULL);
break; break;
case BISECT_TERMS: case BISECT_TERMS:
if (argc > 1) res = cmd_bisect__terms(argc, argv, prefix);
return error(_("--bisect-terms requires 0 or 1 argument"));
res = bisect_terms(&terms, argc == 1 ? argv[0] : NULL);
break; break;
case BISECT_START: case BISECT_START:
set_terms(&terms, "bad", "good"); res = cmd_bisect__start(argc, argv, prefix);
res = bisect_start(&terms, argv, argc);
break; break;
case BISECT_NEXT: case BISECT_NEXT:
if (argc) res = cmd_bisect__next(argc, argv, prefix);
return error(_("--bisect-next requires 0 arguments"));
get_terms(&terms);
res = bisect_next(&terms, prefix);
break; break;
case BISECT_STATE: case BISECT_STATE:
set_terms(&terms, "bad", "good"); res = cmd_bisect__state(argc, argv, prefix);
get_terms(&terms);
res = bisect_state(&terms, argv, argc);
break; break;
case BISECT_LOG: case BISECT_LOG:
if (argc) res = cmd_bisect__log(argc, argv, prefix);
return error(_("--bisect-log requires 0 arguments"));
res = bisect_log();
break; break;
case BISECT_REPLAY: case BISECT_REPLAY:
if (argc != 1) res = cmd_bisect__replay(argc, argv, prefix);
return error(_("no logfile given"));
set_terms(&terms, "bad", "good");
res = bisect_replay(&terms, argv[0]);
break; break;
case BISECT_SKIP: case BISECT_SKIP:
set_terms(&terms, "bad", "good"); res = cmd_bisect__skip(argc, argv, prefix);
get_terms(&terms);
res = bisect_skip(&terms, argv, argc);
break; break;
case BISECT_VISUALIZE: case BISECT_VISUALIZE:
get_terms(&terms); res = cmd_bisect__visualize(argc, argv, prefix);
res = bisect_visualize(&terms, argv, argc);
break; break;
case BISECT_RUN: case BISECT_RUN:
if (!argc) res = cmd_bisect__run(argc, argv, prefix);
return error(_("bisect run failed: no command provided."));
get_terms(&terms);
res = bisect_run(&terms, argv, argc);
break; break;
default: default:
BUG("unknown subcommand %d", cmdmode); BUG("unknown subcommand %d", cmdmode);
} }
free_terms(&terms);
/* /*
* Handle early success * Handle early success