Reimplement the `check_and_set_terms` shell function in C and add `check-and-set-terms` subcommand to `git bisect--helper` to call it from git-bisect.sh Using `--check-and-set-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 and will be called by some other methods. check_and_set_terms() sets and receives two global variables namely TERM_GOOD and TERM_BAD in the shell script. Luckily the file BISECT_TERMS also contains the value of those variables so its appropriate to evoke the method get_terms() after calling the subcommand so that it retrieves the value of TERM_GOOD and TERM_BAD from the file BISECT_TERMS. The two global variables are passed as arguments to the subcommand. A struct is also introduced to be used as a C counter part of the global variables. Mentored-by: Lars Schneider <larsxschneider@xxxxxxxxx> Mentored-by: Christian Couder <chriscool@xxxxxxxxxxxxx> Signed-off-by: Pranit Bauva <pranit.bauva@xxxxxxxxx> --- Collecting reviews. This patch is based on my previous series. I will also include this the next time I reroll the series. builtin/bisect--helper.c | 44 +++++++++++++++++++++++++++++++++++++++++++- git-bisect.sh | 36 ++++-------------------------------- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c index eebfcf0..69cbc93 100644 --- a/builtin/bisect--helper.c +++ b/builtin/bisect--helper.c @@ -26,6 +26,11 @@ static const char * const git_bisect_helper_usage[] = { NULL }; +static struct bisect_term { + char term_good[10]; + char term_bad[10]; +} terms; + /* * Check whether the string `term` belongs to the set of strings * included in the variable arguments. @@ -242,6 +247,36 @@ static int bisect_write(const char *state, const char *rev, return 0; } +static int check_and_set_terms(const char *cmd, const char *term_good, + const char *term_bad) +{ + if (one_of(cmd, "skip", "start", "terms", NULL)) + return 0; + + if (!is_empty_file(git_path_bisect_write_terms()) && + strcmp(cmd, term_bad) && strcmp(cmd, term_good)) + return error(_("Invalid command: you're currently in a" + "'%s' '%s' bisect"), term_bad, term_good); + + if (one_of(cmd, "bad", "good", NULL)) { + if (is_empty_file(git_path_bisect_write_terms())) { + strcpy(terms.term_bad, "bad"); + strcpy(terms.term_good, "good"); + return write_terms(terms.term_bad, terms.term_good); + } + } + + if (one_of(cmd, "new", "old", NULL)) { + if (is_empty_file(git_path_bisect_write_terms())) { + strcpy(terms.term_bad, "new"); + strcpy(terms.term_good, "old"); + return write_terms(terms.term_bad, terms.term_good); + } + } + + return 0; +} + int cmd_bisect__helper(int argc, const char **argv, const char *prefix) { enum { @@ -250,7 +285,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) BISECT_CLEAN_STATE, BISECT_RESET, CHECK_EXPECTED_REVS, - BISECT_WRITE + BISECT_WRITE, + CHECK_AND_SET_TERMS } cmdmode = 0; int no_checkout = 0; struct option options[] = { @@ -266,6 +302,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) N_("check for expected revs"), CHECK_EXPECTED_REVS), OPT_CMDMODE(0, "bisect-write", &cmdmode, N_("write out the bisection state in BISECT_LOG"), BISECT_WRITE), + OPT_CMDMODE(0, "check-and-set-terms", &cmdmode, + N_("check and set terms in a bisection state"), CHECK_AND_SET_TERMS), OPT_BOOL(0, "no-checkout", &no_checkout, N_("update BISECT_HEAD instead of checking out the current commit")), OPT_END() @@ -300,6 +338,10 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) die(_("--bisect-write requires either 4 or 5 arguments")); nolog = (argc == 5) && !strcmp(argv[4], "nolog"); return bisect_write(argv[0], argv[1], argv[2], argv[3], nolog); + case CHECK_AND_SET_TERMS: + if (argc != 3) + die(_("--check-and-set-terms requires 3 arguments")); + return check_and_set_terms(argv[0], argv[1], argv[2]); default: die("BUG: unknown subcommand '%d'", cmdmode); } diff --git a/git-bisect.sh b/git-bisect.sh index b9896a4..63ae742 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -239,7 +239,8 @@ bisect_skip() { bisect_state() { bisect_autostart state=$1 - check_and_set_terms $state + git bisect--helper --check-and-set-terms $state $TERM_GOOD $TERM_BAD + get_terms case "$#,$state" in 0,*) die "$(gettext "Please call 'bisect_state' with at least one argument.")" ;; @@ -390,7 +391,8 @@ bisect_replay () { command="$bisect" fi get_terms - check_and_set_terms "$command" + git bisect--helper --check-and-set-terms "$command" "$TERM_GOOD" "$TERM_BAD" || exit + get_terms case "$command" in start) cmd="bisect_start $rev" @@ -480,36 +482,6 @@ get_terms () { fi } -check_and_set_terms () { - cmd="$1" - case "$cmd" in - skip|start|terms) ;; - *) - if test -s "$GIT_DIR/BISECT_TERMS" && test "$cmd" != "$TERM_BAD" && test "$cmd" != "$TERM_GOOD" - then - die "$(eval_gettext "Invalid command: you're currently in a \$TERM_BAD/\$TERM_GOOD bisect.")" - fi - case "$cmd" in - bad|good) - if ! test -s "$GIT_DIR/BISECT_TERMS" - then - TERM_BAD=bad - TERM_GOOD=good - git bisect--helper --write-terms "$TERM_BAD" "$TERM_GOOD" || exit - fi - ;; - new|old) - if ! test -s "$GIT_DIR/BISECT_TERMS" - then - TERM_BAD=new - TERM_GOOD=old - git bisect--helper --write-terms "$TERM_BAD" "$TERM_GOOD" || exit - fi - ;; - esac ;; - esac -} - bisect_voc () { case "$1" in bad) echo "bad|new" ;; -- 2.9.0 -- 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