git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 06/26] bisect.c: libify `check_merge_bases` and its dependents.

From
Pranit Bauva via GitGitGadget <gitgitgadget@gmail.com>
Date
Feb 24, 2019, 10:11 UTC
Message-ID
<1a955345100ed3e953bc7b9f0c6ce66f6b2b4e2a.1551003074.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.117.git.gitgitgadget@gmail.com>
From: Pranit Bauva <pranit.bauva@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 <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>
---
 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
Previous: Pranit Bauva via GitGitGadgetNext: Pranit Bauva via GitGitGadget
Message 6 of 27 in “Git bisect part3”
  1. 00/26 Git bisect part3Tanushree Tumane via GitGitGadget, Feb 24, 2019
  2. 01/26 bisect--helper: refer branch.buf before strbuf_release(...)Tanushree Tumane via GitGitGadget, Feb 24, 2019
  3. 02/26 bisect--helper: change `retval` to `res`Tanushree Tumane via GitGitGadget, Feb 24, 2019
  4. 05/26 bisect.c: libify `bisect_checkout` and its dependantsPranit Bauva via GitGitGadget, Feb 24, 2019
  5. 04/26 bisect.c: libify `exit_if_skipped_commits` to `error_if_skipped...`Pranit Bauva via GitGitGadget, Feb 24, 2019
  6. 06/26 bisect.c: libify `check_merge_bases` and its dependents.Pranit Bauva via GitGitGadget, Feb 24, 2019
  7. 08/26 bisect.c: libify `handle_bad_merge_base` and its dependantsPranit Bauva via GitGitGadget, Feb 24, 2019
  8. 07/26 bisect.c: libify `check_good_are_ancestors_of_bad` and its dependentsPranit Bauva via GitGitGadget, Feb 24, 2019
  9. 09/26 bisect.c: libify `bisect_next_all` and its dependantsPranit Bauva via GitGitGadget, Feb 24, 2019
  10. 11/26 bisect--helper: Finish `bisect_start()` conversionPranit Bauva via GitGitGadget, Feb 24, 2019
  11. 12/26 bisect--helper: dequote arguments in `bisect-start`Pranit Bauva via GitGitGadget, Feb 24, 2019
  12. 10/26 bisect--helper: `bisect_next` and `bisect_auto_next` shell function in CPranit Bauva via GitGitGadget, Feb 24, 2019
  13. 03/26 bisect--helper: `decide_next()` helper function.Tanushree Tumane via GitGitGadget, Feb 24, 2019
  14. 23/26 bisect--helper: retire `--bisect-auto-next` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019
  15. 21/26 bisect--helper: retire `--bisect-write` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019
  16. 20/26 bisect--helper: `bisect_replay` shell function in CPranit Bauva via GitGitGadget, Feb 24, 2019
  17. 22/26 bisect--helper: retire `--bisect-autostart` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019
  18. 19/26 bisect--helper: `bisect_log` shell function in CPranit Bauva via GitGitGadget, Feb 24, 2019
  19. 17/26 bisect--helper: retire `--check-expected-revs` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019
  20. 18/26 bisect--helper: retire `--write-terms` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019
  21. 16/26 bisect--helper: `bisect_state` & `bisect_head` shell function in CPranit Bauva via GitGitGadget, Feb 24, 2019
  22. 24/26 bisect--helper: remove the dequote in bisect_start()Pranit Bauva via GitGitGadget, Feb 24, 2019
  23. 25/26 bisect--helper: `bisect_skip` shell function in CPranit Bauva via GitGitGadget, Feb 24, 2019
  24. 15/26 bisect--helper: `bisect_autostart` shell function in CPranit Bauva via GitGitGadget, Feb 24, 2019
  25. 26/26 bisect--helper: retire `--check-and-set-terms` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019
  26. 14/26 bisect--helper: retire `--next-all` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019
  27. 13/26 bisect--helper: retire `--bisect-clean-state` subcommandPranit Bauva via GitGitGadget, Feb 24, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.