From: Pranit Bauva <pranit.ba...@gmail.com>

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 <negetive-value>`. Follow POSIX conventions to return
<negative-value> to indicate error.

Turn `exit()` to `return` calls in `check_merge_bases()`.

In `check_merge_bases()` there is an early success special case,
so we have introduced special error code `-11` which indicates early
success. This `-11` is converted back to `0` in 
`check_good_are_ancestors_of_bad()`.

Mentored-by: Christian Couder <chrisc...@tuxfamily.org>
Mentored by: Johannes Schindelin <johannes.schinde...@gmx.de>
Signed-off-by: Pranit Bauva <pranit.ba...@gmail.com>
Signed-off-by: Tanushree Tumane <tanushreetum...@gmail.com>
---
 bisect.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/bisect.c b/bisect.c
index 1f2f3201a3..1134854fe2 100644
--- a/bisect.c
+++ b/bisect.c
@@ -801,13 +801,16 @@ static void handle_skipped_merge_base(const struct 
object_id *mb)
  * "check_merge_bases" checks that merge bases are not "bad" (or "new").
  *
  * - If one is "bad" (or "new"), it means the user assumed something wrong
- * and we must exit with a non 0 error code.
+ * and we must return error with a non 0 error code.
  * - If one is "good" (or "old"), that's good, we have nothing to do.
  * - If one is "skipped", we can't know but we should warn.
  * - If we don't know, we should check it out and ask the user to test.
+ * - If a merge base must be tested, on success return -11 a special condition
+ * for early success, this will be converted back to 0 in cmd_bisect__helper.
  */
-static void check_merge_bases(int rev_nr, struct commit **rev, int no_checkout)
+static int check_merge_bases(int rev_nr, struct commit **rev, int no_checkout)
 {
+       int res = 0;
        struct commit_list *result;
 
        result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1);
@@ -822,11 +825,16 @@ static void check_merge_bases(int rev_nr, struct commit 
**rev, int no_checkout)
                        handle_skipped_merge_base(mb);
                } else {
                        printf(_("Bisecting: a merge base must be tested\n"));
-                       exit(-bisect_checkout(mb, no_checkout));
+                       res = bisect_checkout(mb, no_checkout);
+                       if (!res)
+                               /* indicate early success */
+                               res = -11;
+                       break;
                }
        }
 
        free_commit_list(result);
+       return res;
 }
 
 static int check_ancestors(int rev_nr, struct commit **rev, const char *prefix)
@@ -857,7 +865,7 @@ static void check_good_are_ancestors_of_bad(const char 
*prefix, int no_checkout)
 {
        char *filename = git_pathdup("BISECT_ANCESTORS_OK");
        struct stat st;
-       int fd, rev_nr;
+       int fd, rev_nr, res = 0;
        struct commit **rev;
 
        if (!current_bad_oid)
@@ -874,8 +882,10 @@ static void check_good_are_ancestors_of_bad(const char 
*prefix, int no_checkout)
        /* Check if all good revs are ancestor of the bad rev. */
        rev = get_bad_and_good_commits(&rev_nr);
        if (check_ancestors(rev_nr, rev, prefix))
-               check_merge_bases(rev_nr, rev, no_checkout);
+               res = check_merge_bases(rev_nr, rev, no_checkout);
        free(rev);
+       if(res)
+               exit(res == -11 ? 0 : -res);
 
        /* Create file BISECT_ANCESTORS_OK. */
        fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0600);
-- 
gitgitgadget

Reply via email to