summaryrefslogtreecommitdiff
path: root/bisect.c
diff options
context:
space:
mode:
authorPranit Bauva <pranit.bauva@gmail.com>2020-02-17 08:40:37 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-02-19 17:37:14 (GMT)
commit45b6370812cb9bc50212d50f071c8ae5dd851698 (patch)
tree42c80045e6a4bd009b75d51d219fc4e4010d67de /bisect.c
parentcdd4dc2d6a3e420178100efc780a987495a1a3bd (diff)
downloadgit-45b6370812cb9bc50212d50f071c8ae5dd851698.zip
git-45b6370812cb9bc50212d50f071c8ae5dd851698.tar.gz
git-45b6370812cb9bc50212d50f071c8ae5dd851698.tar.bz2
bisect: libify `check_good_are_ancestors_of_bad` and its dependents
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. Code that turns BISECT_INTERNAL_SUCCESS_MERGE_BASE (-11) to BISECT_OK (0) from `check_good_are_ancestors_of_bad()` has been moved to `cmd_bisect__helper()`. Update all callers to handle the error returns. 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> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'bisect.c')
-rw-r--r--bisect.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/bisect.c b/bisect.c
index 382e0b4..f5ce3a4 100644
--- a/bisect.c
+++ b/bisect.c
@@ -872,20 +872,23 @@ static int check_ancestors(struct repository *r, int rev_nr,
*
* If that's not the case, we need to check the merge bases.
* If a merge base must be tested by the user, its source code will be
- * checked out to be tested by the user and we will exit.
+ * checked out to be tested by the user and we will return.
*/
-static void check_good_are_ancestors_of_bad(struct repository *r,
+
+static enum bisect_error check_good_are_ancestors_of_bad(struct repository *r,
const char *prefix,
int no_checkout)
{
- char *filename = git_pathdup("BISECT_ANCESTORS_OK");
+ char *filename;
struct stat st;
int fd, rev_nr;
enum bisect_error res = BISECT_OK;
struct commit **rev;
if (!current_bad_oid)
- die(_("a %s revision is needed"), term_bad);
+ return error(_("a %s revision is needed"), term_bad);
+
+ filename = git_pathdup("BISECT_ANCESTORS_OK");
/* Check if file BISECT_ANCESTORS_OK exists. */
if (!stat(filename, &st) && S_ISREG(st.st_mode))
@@ -901,18 +904,26 @@ static void check_good_are_ancestors_of_bad(struct repository *r,
if (check_ancestors(r, rev_nr, rev, prefix))
res = check_merge_bases(rev_nr, rev, no_checkout);
free(rev);
- if (res)
- exit(res == BISECT_INTERNAL_SUCCESS_MERGE_BASE ? BISECT_OK : -res);
- /* Create file BISECT_ANCESTORS_OK. */
- fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0600);
- if (fd < 0)
- warning_errno(_("could not create file '%s'"),
- filename);
- else
- close(fd);
+ if (!res) {
+ /* Create file BISECT_ANCESTORS_OK. */
+ fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0600);
+ if (fd < 0)
+ /*
+ * BISECT_ANCESTORS_OK file is not absolutely necessary,
+ * the bisection process will continue at the next
+ * bisection step.
+ * So, just signal with a warning that something
+ * might be wrong.
+ */
+ warning_errno(_("could not create file '%s'"),
+ filename);
+ else
+ close(fd);
+ }
done:
free(filename);
+ return res;
}
/*
@@ -984,7 +995,9 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix, int
if (read_bisect_refs())
die(_("reading bisect refs failed"));
- check_good_are_ancestors_of_bad(r, prefix, no_checkout);
+ res = check_good_are_ancestors_of_bad(r, prefix, no_checkout);
+ if (res)
+ return res;
bisect_rev_setup(r, &revs, prefix, "%s", "^%s", 1);
revs.limited = 1;