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

[PATCH v2 11/11] bisect: libify `bisect_next_all`

From
Miriam Rubio <mirucam@gmail.com>
Date
Jan 28, 2020, 14:40 UTC
Message-ID
<20200128144026.53128-12-mirucam@gmail.com>
In-Reply-To
<20200128144026.53128-1-mirucam@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 <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>
---
 bisect.c | 40 +++++++++++++++++++++++++++++-----------
 bisect.h | 23 +++++++++++++++++++++++
 2 files changed, 52 insertions(+), 11 deletions(-)
diff --git a/bisect.c b/bisect.c
index 43baa3df28..d4b883f67d 100644
--- a/bisect.c
+++ b/bisect.c
@@ -967,10 +967,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
- * the bisection process finished successfully.
- * In this case the calling shell script should exit 0.
- *
+ * We use the convention that return -10 means the bisection process
+ * finished successfully.
+ * In this case the calling function or command should not turn a -10
+ * 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.
  */
@@ -1000,23 +1000,35 @@ int bisect_next_all(struct repository *r, const char *prefix, int no_checkout)
 
 	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);
+
+		/*
+		 * 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 -1;
 	}
 
 	if (!all) {
 		fprintf(stderr, _("No testable commit found.\n"
 			"Maybe you started with bad path parameters?\n"));
-		exit(4);
+
+		/*
+		 * 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 -4;
 	}
 
 	bisect_rev = &revs.commits->item->object.oid;
@@ -1024,12 +1036,18 @@ int bisect_next_all(struct repository *r, const char *prefix, int no_checkout)
 	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 -10 so that the call chain can simply check
+		 * for negative return values for early returns up
+		 * until the cmd_bisect__helper() caller.
+		 */
+		return -10;
 	}
 
 	nr = all - reaches - 1;
diff --git a/bisect.h b/bisect.h
index 4e69a11ea8..f640c4f963 100644
--- a/bisect.h
+++ b/bisect.h
@@ -31,6 +31,29 @@ struct rev_list_info {
 	const char *header_prefix;
 };
 
+/*
+ * bisect_next_all() could return the following codes:
+ * 0 success code (from bisect_checkout()): a new commit to test
+ * has been found (and possibly checked out too).
+ * -1 error code (from bisect_next_all()): default error code.
+ * -2 error code (from error_if_skipped_commits()): only skipped
+ * commits left to be tested.
+ * -3 error code (from handle_bad_merge_base() through
+ * check_merge_bases() and check_good_are_ancestors_of_bad()): merge
+ * base check failed.
+ * -4 error code (from bisect_next_all()): no testable commit found.
+ * -10 early success code (from bisect_next_all()): first term_bad
+ * commit found.
+ * This value is checked in builtin/bisect_helper::bisect_next().
+ * -11 early success code (from check_merge_bases() through
+ * check_good_are_ancestors_of_bad()): successfully tested
+ * merge base.
+ * Early success codes -10 and -11 should be only internal codes and
+ * converted to a 0 status code when the bisecting command exits.
+ * Different error codes might enable a bisecting script calling the
+ * bisect command that uses this function to do different things
+ * depending on the exit status of the bisect command.
+ */
 int bisect_next_all(struct repository *r,
 		    const char *prefix,
 		    int no_checkout);
-- 
2.21.1 (Apple Git-122.3)
Previous: Junio C HamanoNext: Miriam Rubio
Message 16 of 29 in “Finish converting git bisect to C part 1”
  1. Miriam RubioJan 28, 2020
  2. 01/11 bisect--helper: convert `vocab_*` char pointers to char arraysMiriam Rubio, Jan 28, 2020
  3. 02/11 bisect--helper: change `retval` to `res`Miriam Rubio, Jan 28, 2020
  4. 03/11 bisect: use the standard 'if (!var)' way to check for 0Miriam Rubio, Jan 28, 2020
  5. 04/11 run-command: make `exists_in_PATH()` non-staticMiriam Rubio, Jan 28, 2020
  6. Johannes SchindelinJan 30, 2020
  7. 05/11 bisect--helper: introduce new `decide_next()` functionMiriam Rubio, Jan 28, 2020
  8. Johannes SchindelinJan 30, 2020
  9. Miriam R.Jan 30, 2020
  10. 06/11 bisect: libify `exit_if_skipped_commits` to `error_if_skipped*` and its dependentsMiriam Rubio, Jan 28, 2020
  11. Junio C HamanoJan 31, 2020
  12. 07/11 bisect: libify `bisect_checkout`Miriam Rubio, Jan 28, 2020
  13. Junio C HamanoJan 31, 2020
  14. 08/11 bisect: libify `check_merge_bases` and its dependentsMiriam Rubio, Jan 28, 2020
  15. Junio C HamanoJan 31, 2020
  16. 11/11 bisect: libify `bisect_next_all`Miriam Rubio, Jan 28, 2020
  17. 10/11 bisect: libify `handle_bad_merge_base` and its dependentsMiriam Rubio, Jan 28, 2020
  18. 09/11 bisect: libify `check_good_are_ancestors_of_bad` and its dependentsMiriam Rubio, Jan 28, 2020
  19. Johannes SchindelinJan 30, 2020
  20. Miriam R.Jan 30, 2020
  21. Johannes SchindelinJan 30, 2020
  22. Miriam R.Jan 30, 2020
  23. Christian CouderJan 30, 2020
  24. Johannes SchindelinJan 31, 2020
  25. Christian CouderJan 31, 2020
  26. Johannes SchindelinJan 30, 2020
  27. Miriam R.Jan 30, 2020
  28. Fwd: [PATCH v2 04/11] run-command: make `exists_in_PATH()` non-staticMiriam R., Jan 30, 2020
  29. Fwd: [PATCH v2 09/11] bisect: libify `check_good_are_ancestors_of_bad` and its dependentsMiriam R., Jan 31, 2020

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.