Reimplement the `get_terms` and `bisect_terms` shell function in C and add `bisect-terms` subcommand to `git bisect--helper` to call it from git-bisect.sh . Using `--bisect-terms` subcommand is a temporary measure to port shell function in C so as to use the existing test suite. As more functions are ported, this subcommand will be retired but its implementation will be called by some other methods. Mentored-by: Lars Schneider <larsxschneider@xxxxxxxxx> Mentored-by: Christian Couder <chriscool@xxxxxxxxxxxxx> Signed-off-by: Pranit Bauva <pranit.bauva@xxxxxxxxx> --- builtin/bisect--helper.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++-- git-bisect.sh | 35 ++-------------------------- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c index b6e9973..f912010 100644 --- a/builtin/bisect--helper.c +++ b/builtin/bisect--helper.c @@ -26,6 +26,7 @@ static const char * const git_bisect_helper_usage[] = { N_("git bisect--helper --bisect-write <state> <revision> <TERM_GOOD> <TERM_BAD> [<nolog>]"), N_("git bisect--helper --bisect-check-and-set-terms <command> <TERM_GOOD> <TERM_BAD>"), N_("git bisect--helper --bisect-next-check [<term>] <TERM_GOOD> <TERM_BAD"), + N_("git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --term-new]"), NULL }; @@ -384,6 +385,52 @@ static int bisect_next_check(const struct bisect_terms *terms, return 0; } +static int get_terms(struct bisect_terms *terms) +{ + FILE *fp; + int res; + fp = fopen(git_path_bisect_terms(), "r"); + if (!fp) + return -1; + + bisect_terms_reset(terms); + res = strbuf_getline(&terms->term_bad, fp) == EOF || + strbuf_getline(&terms->term_good, fp) == EOF; + + fclose(fp); + return res ? -1 : 0; +} + +static int bisect_terms(struct bisect_terms *terms, const char **argv, int argc) +{ + int i; + + if (get_terms(terms)) { + fprintf(stderr, N_("no terms defined\n")); + return -1; + } + if (argc == 0) { + printf(N_("Your current terms are %s for the old state\nand " + "%s for the new state.\n"), terms->term_good.buf, + terms->term_bad.buf); + return 0; + } + + for (i = 0; i < argc; i++) { + if (!strcmp(argv[i], "--term-good")) + printf(N_("%s\n"), terms->term_good.buf); + else if (!strcmp(argv[i], "--term-bad")) + printf(N_("%s\n"), terms->term_bad.buf); + else + printf(N_("invalid argument %s for 'git bisect " + "terms'.\nSupported options are: " + "--term-good|--term-old and " + "--term-bad|--term-new."), argv[i]); + } + + return 0; +} + int cmd_bisect__helper(int argc, const char **argv, const char *prefix) { enum { @@ -394,7 +441,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) CHECK_EXPECTED_REVS, BISECT_WRITE, CHECK_AND_SET_TERMS, - BISECT_NEXT_CHECK + BISECT_NEXT_CHECK, + BISECT_TERMS } cmdmode = 0; int no_checkout = 0, res = 0; struct option options[] = { @@ -414,6 +462,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) N_("check and set terms in a bisection state"), CHECK_AND_SET_TERMS), OPT_CMDMODE(0, "bisect-next-check", &cmdmode, N_("check whether bad or good terms exist"), BISECT_NEXT_CHECK), + OPT_CMDMODE(0, "bisect-terms", &cmdmode, + N_("print out the bisect terms"), BISECT_TERMS), OPT_BOOL(0, "no-checkout", &no_checkout, N_("update BISECT_HEAD instead of checking out the current commit")), OPT_END() @@ -422,7 +472,7 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) bisect_terms_init(&terms); argc = parse_options(argc, argv, prefix, options, - git_bisect_helper_usage, 0); + git_bisect_helper_usage, PARSE_OPT_KEEP_UNKNOWN); if (!cmdmode) usage_with_options(git_bisect_helper_usage, options); @@ -471,6 +521,11 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) strbuf_addstr(&terms.term_bad, argv[1]); res = bisect_next_check(&terms, argc == 3 ? argv[2] : NULL); break; + case BISECT_TERMS: + if (argc > 1) + die(_("--bisect-terms requires 0 or 1 argument")); + res = bisect_terms(&terms, argv, argc); + break; default: die("BUG: unknown subcommand '%d'", cmdmode); } diff --git a/git-bisect.sh b/git-bisect.sh index c2d6319..aea97c5f 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -355,7 +355,7 @@ bisect_replay () { "$TERM_GOOD"|"$TERM_BAD"|skip) git bisect--helper --bisect-write "$command" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit;; terms) - bisect_terms $rev ;; + git bisect--helper --bisect-terms $rev || exit;; *) die "$(gettext "?? what are you talking about?")" ;; esac @@ -437,37 +437,6 @@ get_terms () { fi } -bisect_terms () { - get_terms - if ! test -s "$GIT_DIR/BISECT_TERMS" - then - die "$(gettext "no terms defined")" - fi - case "$#" in - 0) - gettextln "Your current terms are $TERM_GOOD for the old state -and $TERM_BAD for the new state." - ;; - 1) - arg=$1 - case "$arg" in - --term-good|--term-old) - printf '%s\n' "$TERM_GOOD" - ;; - --term-bad|--term-new) - printf '%s\n' "$TERM_BAD" - ;; - *) - die "$(eval_gettext "invalid argument \$arg for 'git bisect terms'. -Supported options are: --term-good|--term-old and --term-bad|--term-new.")" - ;; - esac - ;; - *) - usage ;; - esac -} - case "$#" in 0) usage ;; @@ -498,7 +467,7 @@ case "$#" in run) bisect_run "$@" ;; terms) - bisect_terms "$@" ;; + git bisect--helper --bisect-terms "$@" || exit;; *) usage ;; esac -- https://github.com/git/git/pull/281 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html