]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bisect--helper: introduce new `decide_next()` function
authorTanushree Tumane <tanushreetumane@gmail.com>
Mon, 17 Feb 2020 08:40:31 +0000 (09:40 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 19 Feb 2020 17:37:14 +0000 (09:37 -0800)
Let's refactor code from bisect_next_check() into a new
decide_next() helper function.

This removes some goto statements and makes the code simpler,
clearer and easier to understand.

While at it `bad_ref` and `good_glob` are not const any more
to void casting them inside `free()`.

Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Tanushree Tumane <tanushreetumane@gmail.com>
Signed-off-by: Miriam Rubio <mirucam@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/bisect--helper.c

index 21de5c096cf4b47a75341fba13adfbfc21a260ab..e21d3d1a4c16c4c2e497b7f1d374f2f1d36e16a1 100644 (file)
@@ -291,26 +291,14 @@ static const char need_bisect_start_warning[] =
           "You then need to give me at least one %s and %s revision.\n"
           "You can use \"git bisect %s\" and \"git bisect %s\" for that.");
 
-static int bisect_next_check(const struct bisect_terms *terms,
-                            const char *current_term)
+static int decide_next(const struct bisect_terms *terms,
+                      const char *current_term, int missing_good,
+                      int missing_bad)
 {
-       int missing_good = 1, missing_bad = 1, res = 0;
-       const char *bad_ref = xstrfmt("refs/bisect/%s", terms->term_bad);
-       const char *good_glob = xstrfmt("%s-*", terms->term_good);
-
-       if (ref_exists(bad_ref))
-               missing_bad = 0;
-
-       for_each_glob_ref_in(mark_good, good_glob, "refs/bisect/",
-                            (void *) &missing_good);
-
        if (!missing_good && !missing_bad)
-               goto finish;
-
-       if (!current_term) {
-               res = -1;
-               goto finish;
-       }
+               return 0;
+       if (!current_term)
+               return -1;
 
        if (missing_good && !missing_bad &&
            !strcmp(current_term, terms->term_good)) {
@@ -321,7 +309,7 @@ static int bisect_next_check(const struct bisect_terms *terms,
                 */
                warning(_("bisecting only with a %s commit"), terms->term_bad);
                if (!isatty(0))
-                       goto finish;
+                       return 0;
                /*
                 * TRANSLATORS: Make sure to include [Y] and [n] in your
                 * translation. The program will only accept English input
@@ -329,21 +317,35 @@ static int bisect_next_check(const struct bisect_terms *terms,
                 */
                yesno = git_prompt(_("Are you sure [Y/n]? "), PROMPT_ECHO);
                if (starts_with(yesno, "N") || starts_with(yesno, "n"))
-                       res = -1;
-               goto finish;
-       }
-       if (!is_empty_or_missing_file(git_path_bisect_start())) {
-               res = error(_(need_bad_and_good_revision_warning),
-                              vocab_bad, vocab_good, vocab_bad, vocab_good);
-       } else {
-               res = error(_(need_bisect_start_warning),
-                              vocab_good, vocab_bad, vocab_good, vocab_bad);
+                       return -1;
+               return 0;
        }
 
-finish:
-       free((void *) good_glob);
-       free((void *) bad_ref);
-       return res;
+       if (!is_empty_or_missing_file(git_path_bisect_start()))
+               return error(_(need_bad_and_good_revision_warning),
+                            vocab_bad, vocab_good, vocab_bad, vocab_good);
+       else
+               return error(_(need_bisect_start_warning),
+                            vocab_good, vocab_bad, vocab_good, vocab_bad);
+}
+
+static int bisect_next_check(const struct bisect_terms *terms,
+                            const char *current_term)
+{
+       int missing_good = 1, missing_bad = 1;
+       char *bad_ref = xstrfmt("refs/bisect/%s", terms->term_bad);
+       char *good_glob = xstrfmt("%s-*", terms->term_good);
+
+       if (ref_exists(bad_ref))
+               missing_bad = 0;
+
+       for_each_glob_ref_in(mark_good, good_glob, "refs/bisect/",
+                            (void *) &missing_good);
+
+       free(good_glob);
+       free(bad_ref);
+
+       return decide_next(terms, current_term, missing_good, missing_bad);
 }
 
 static int get_terms(struct bisect_terms *terms)