From: Pranit Bauva <[email protected]>

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.
Modify `cmd_bisect_helper()` to handle these negative returns.

Turn `exit()` to `return` calls in `exit_if_skipped_commits()` and rename
the method to `error_if_skipped_commits()`.

Handle this return in dependant method `bisect_next_all()`.

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]>
---
 bisect.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/bisect.c b/bisect.c
index 487675c672..bb926f09d0 100644
--- a/bisect.c
+++ b/bisect.c
@@ -659,11 +659,11 @@ static void bisect_common(struct rev_info *revs)
                mark_edges_uninteresting(revs, NULL);
 }
 
-static void exit_if_skipped_commits(struct commit_list *tried,
+static int error_if_skipped_commits(struct commit_list *tried,
                                    const struct object_id *bad)
 {
        if (!tried)
-               return;
+               return 0;
 
        printf("There are only 'skip'ped commits left to test.\n"
               "The first %s commit could be any of:\n", term_bad);
@@ -674,7 +674,13 @@ static void exit_if_skipped_commits(struct commit_list 
*tried,
        if (bad)
                printf("%s\n", oid_to_hex(bad));
        printf(_("We cannot bisect more!\n"));
-       exit(2);
+
+       /*
+        * We don't want to clean the bisection state
+        * as we need to get back to where we started
+        * by using `git bisect reset`.
+        */
+       return -2;
 }
 
 static int is_expected_rev(const struct object_id *oid)
@@ -949,7 +955,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
 {
        struct rev_info revs;
        struct commit_list *tried;
-       int reaches = 0, all = 0, nr, steps;
+       int reaches = 0, all = 0, nr, steps, res;
        struct object_id *bisect_rev;
        char *steps_msg;
 
@@ -972,8 +978,9 @@ int bisect_next_all(const char *prefix, int no_checkout)
                 * We should exit here only if the "bad"
                 * commit is also a "skip" commit.
                 */
-               exit_if_skipped_commits(tried, NULL);
-
+               res = error_if_skipped_commits(tried, NULL);
+               if (res)
+                       exit(-res);
                printf(_("%s was both %s and %s\n"),
                       oid_to_hex(current_bad_oid),
                       term_good,
@@ -990,7 +997,9 @@ int bisect_next_all(const char *prefix, int no_checkout)
        bisect_rev = &revs.commits->item->object.oid;
 
        if (oideq(bisect_rev, current_bad_oid)) {
-               exit_if_skipped_commits(tried, current_bad_oid);
+               res = error_if_skipped_commits(tried, current_bad_oid);
+               if (res)
+                       exit(-res);
                printf("%s is the first %s commit\n", oid_to_hex(bisect_rev),
                        term_bad);
                show_diff_tree(prefix, revs.commits->item);
-- 
gitgitgadget

Reply via email to