From: Pranit Bauva <[email protected]>

Reimplement the `bisect_autostart()` shell function in C and add the
C implementation from `bisect_next()` which was previously left
uncovered. Also add a subcommand `--bisect-autostart` to
`git bisect--helper` be called from `bisect_state()` from
git-bisect.sh .

Using `--bisect-autostart` subcommand is a temporary measure to port
shell function to C so as to use the existing test suite. As more
functions are ported, this subcommand will be retired and will be called
by `bisect_state()`.

Mentored-by: Lars Schneider <[email protected]>
Mentored-by: Christian Couder <[email protected]>
Mentored-by: Johannes Schindelin <[email protected]>
Signed-off-by: Pranit Bauva <[email protected]>
Signed-off-by: Tanushree Tumane <[email protected]>
---
 builtin/bisect--helper.c | 39 +++++++++++++++++++++++++++++++++++++++
 git-bisect.sh            | 23 +----------------------
 2 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index 1a525faf27..61c3cc517a 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -30,6 +30,7 @@ static const char * const git_bisect_helper_usage[] = {
                                             "[--no-checkout] [<bad> 
[<good>...]] [--] [<paths>...]"),
        N_("git bisect--helper --bisect-next"),
        N_("git bisect--helper --bisect-auto-next"),
+       N_("git bisect--helper --bisect-autostart"),
        NULL
 };
 
@@ -56,6 +57,8 @@ static void set_terms(struct bisect_terms *terms, const char 
*bad,
 static const char *vocab_bad = "bad|new";
 static const char *vocab_good = "good|old";
 
+static int bisect_autostart(struct bisect_terms *terms);
+
 /*
  * Check whether the string `term` belongs to the set of strings
  * included in the variable arguments.
@@ -530,6 +533,7 @@ static int bisect_next(struct bisect_terms *terms, const 
char *prefix)
 {
        int res, no_checkout;
 
+       bisect_autostart(terms);
        if (bisect_next_check(terms, terms->term_good))
                return -1;
 
@@ -788,6 +792,32 @@ static int bisect_start(struct bisect_terms *terms, int 
no_checkout,
        return res;
 }
 
+static int bisect_autostart(struct bisect_terms *terms)
+{
+       if (is_empty_or_missing_file(git_path_bisect_start())) {
+               const char *yesno;
+               const char *argv[] = {NULL};
+               fprintf(stderr, _("You need to start by \"git bisect "
+                                 "start\"\n"));
+
+               if (!isatty(STDIN_FILENO))
+                       return 1;
+
+               /*
+                * TRANSLATORS: Make sure to include [Y] and [n] in your
+                * translation. The program will only accept English input
+                * at this point.
+                */
+               yesno = git_prompt(_("Do you want me to do it for you "
+                                    "[Y/n]? "), PROMPT_ECHO);
+               if (starts_with(yesno, _("n")) || starts_with(yesno, _("N")))
+                       return 1;
+
+               return bisect_start(terms, 0, argv, 0);
+       }
+       return 0;
+}
+
 int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 {
        enum {
@@ -801,6 +831,7 @@ int cmd_bisect__helper(int argc, const char **argv, const 
char *prefix)
                BISECT_START,
                BISECT_NEXT,
                BISECT_AUTO_NEXT,
+               BISECT_AUTOSTART,
        } cmdmode = 0;
        int no_checkout = 0, res = 0, nolog = 0;
        struct option options[] = {
@@ -824,6 +855,8 @@ int cmd_bisect__helper(int argc, const char **argv, const 
char *prefix)
                         N_("find the next bisection commit"), BISECT_NEXT),
                OPT_CMDMODE(0, "bisect-auto-next", &cmdmode,
                         N_("verify the next bisection state then checkout the 
next bisection commit"), BISECT_AUTO_NEXT),
+               OPT_CMDMODE(0, "bisect-autostart", &cmdmode,
+                        N_("start the bisection if BISECT_START is empty or 
missing"), BISECT_AUTOSTART),
                OPT_BOOL(0, "no-checkout", &no_checkout,
                         N_("update BISECT_HEAD instead of checking out the 
current commit")),
                OPT_BOOL(0, "no-log", &nolog,
@@ -890,6 +923,12 @@ int cmd_bisect__helper(int argc, const char **argv, const 
char *prefix)
                get_terms(&terms);
                res = bisect_auto_next(&terms, prefix);
                break;
+       case BISECT_AUTOSTART:
+               if (argc)
+                       return error(_("--bisect-autostart requires 0 
arguments"));
+               set_terms(&terms, "bad", "good");
+               res = bisect_autostart(&terms);
+               break;
        default:
                return error("BUG: unknown subcommand '%d'", cmdmode);
        }
diff --git a/git-bisect.sh b/git-bisect.sh
index fec527e1ef..97bb15b38f 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -49,27 +49,6 @@ bisect_head()
        fi
 }
 
-bisect_autostart() {
-       test -s "$GIT_DIR/BISECT_START" || {
-               gettextln "You need to start by \"git bisect start\"" >&2
-               if test -t 0
-               then
-                       # TRANSLATORS: Make sure to include [Y] and [n] in your
-                       # translation. The program will only accept English 
input
-                       # at this point.
-                       gettext "Do you want me to do it for you [Y/n]? " >&2
-                       read yesno
-                       case "$yesno" in
-                       [Nn]*)
-                               exit ;;
-                       esac
-                       git bisect--helper --bisect-start
-               else
-                       exit 1
-               fi
-       }
-}
-
 bisect_skip() {
        all=''
        for arg in "$@"
@@ -86,7 +65,7 @@ bisect_skip() {
 }
 
 bisect_state() {
-       bisect_autostart
+       git bisect--helper --bisect-autostart
        state=$1
        git bisect--helper --check-and-set-terms $state $TERM_GOOD $TERM_BAD || 
exit
        get_terms
-- 
gitgitgadget

Reply via email to