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

[PATCH v2 06/11] bisect: libify `exit_if_skipped_commits` to `error_if_skipped*` and its dependents

From
Miriam Rubio <mirucam@gmail.com>
Date
Jan 28, 2020, 14:40 UTC
Message-ID
<20200128144026.53128-7-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.

Handle this return in dependent function `bisect_next_all()`.
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 | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/bisect.c b/bisect.c
index 83cb5b3a98..a7a5d158e6 100644
--- a/bisect.c
+++ b/bisect.c
@@ -661,11 +661,11 @@ static void bisect_common(struct rev_info *revs)
 		mark_edges_uninteresting(revs, NULL, 0);
 }
 
-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);
@@ -676,7 +676,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(struct repository *r, 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(struct repository *r, 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 < 0)
+			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(struct repository *r, 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(r, prefix, revs.commits->item);
-- 
2.21.1 (Apple Git-122.3)
Previous: Miriam R.Next: Junio C Hamano
Message 10 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.