]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bisect: libify `bisect_next_all`
authorPranit Bauva <pranit.bauva@gmail.com>
Mon, 17 Feb 2020 08:40:39 +0000 (09:40 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 19 Feb 2020 17:37:15 +0000 (09:37 -0800)
Since we want to get rid of git-bisect.sh, it would be necessary to
convert those exit() calls to return statements so that errors can be
reported.

Emulate try catch in C by converting `exit(<positive-value>)` to
`return <negative-value>`. Follow POSIX conventions to return
<negative-value> to indicate error.

All the functions calling `bisect_next_all()` are already able to
handle return values from it.

Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Pranit Bauva <pranit.bauva@gmail.com>
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>
bisect.c
bisect.h

index 837332a428161841dfae544b2b34aa9803283a00..9154f810f76af3cdbf82b8bb509f47aa392b0e01 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -976,10 +976,10 @@ void read_bisect_terms(const char **read_bad, const char **read_good)
 }
 
 /*
- * We use the convention that exiting with an exit code 10 means that
+ * We use the convention that return BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND (-10) means
  * the bisection process finished successfully.
- * In this case the calling shell script should exit 0.
- *
+ * In this case the calling function or command should not turn a
+ * BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND return code into an error or a non zero exit code.
  * If no_checkout is non-zero, the bisection process does not
  * checkout the trial commit but instead simply updates BISECT_HEAD.
  */
@@ -1010,23 +1010,25 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix, int
 
        if (!revs.commits) {
                /*
-                * We should exit here only if the "bad"
+                * We should return error here only if the "bad"
                 * commit is also a "skip" commit.
                 */
                res = error_if_skipped_commits(tried, NULL);
                if (res < 0)
-                       exit(-res);
+                       return res;
                printf(_("%s was both %s and %s\n"),
                       oid_to_hex(current_bad_oid),
                       term_good,
                       term_bad);
-               exit(1);
+
+               return BISECT_FAILED;
        }
 
        if (!all) {
                fprintf(stderr, _("No testable commit found.\n"
                        "Maybe you started with bad path parameters?\n"));
-               exit(4);
+
+               return BISECT_NO_TESTABLE_COMMIT;
        }
 
        bisect_rev = &revs.commits->item->object.oid;
@@ -1034,12 +1036,19 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix, int
        if (oideq(bisect_rev, current_bad_oid)) {
                res = error_if_skipped_commits(tried, current_bad_oid);
                if (res)
-                       exit(-res);
+                       return res;
                printf("%s is the first %s commit\n", oid_to_hex(bisect_rev),
                        term_bad);
+
                show_diff_tree(r, prefix, revs.commits->item);
-               /* This means the bisection process succeeded. */
-               exit(10);
+               /*
+                * This means the bisection process succeeded.
+                * Using BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND (-10)
+                * so that the call chain can simply check
+                * for negative return values for early returns up
+                * until the cmd_bisect__helper() caller.
+                */
+               return BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND;
        }
 
        nr = all - reaches - 1;
index 0d9758179f1a6eb85fb1276d506bc77a6b192e97..8bad8d8391546f347ec91324eca21f74bda8e68f 100644 (file)
--- a/bisect.h
+++ b/bisect.h
@@ -39,16 +39,22 @@ struct rev_list_info {
  * BISECT_FAILED error code: default error code.
  * BISECT_ONLY_SKIPPED_LEFT error code: only skipped
  * commits left to be tested.
+ * BISECT_MERGE_BASE_CHECK error code: merge base check failed.
+ * BISECT_NO_TESTABLE_COMMIT error code: no testable commit found.
+ * BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND early success code:
+ * first term_bad commit found.
  * BISECT_INTERNAL_SUCCESS_MERGE_BASE early success
  * code: found merge base that should be tested.
- * Early success code BISECT_INTERNAL_SUCCESS_MERGE_BASE
- * should be only an internal code.
+ * Early success codes BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND and
+ * BISECT_INTERNAL_SUCCESS_MERGE_BASE should be only internal codes.
  */
 enum bisect_error {
        BISECT_OK = 0,
        BISECT_FAILED = -1,
        BISECT_ONLY_SKIPPED_LEFT = -2,
        BISECT_MERGE_BASE_CHECK = -3,
+       BISECT_NO_TESTABLE_COMMIT = -4,
+       BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND = -10,
        BISECT_INTERNAL_SUCCESS_MERGE_BASE = -11
 };