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>
This commit is contained in:
parent
cdd4dc2d6a
commit
45b6370812
27
bisect.c
27
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 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
|
* 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,
|
const char *prefix,
|
||||||
int no_checkout)
|
int no_checkout)
|
||||||
{
|
{
|
||||||
char *filename = git_pathdup("BISECT_ANCESTORS_OK");
|
char *filename;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int fd, rev_nr;
|
int fd, rev_nr;
|
||||||
enum bisect_error res = BISECT_OK;
|
enum bisect_error res = BISECT_OK;
|
||||||
struct commit **rev;
|
struct commit **rev;
|
||||||
|
|
||||||
if (!current_bad_oid)
|
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. */
|
/* Check if file BISECT_ANCESTORS_OK exists. */
|
||||||
if (!stat(filename, &st) && S_ISREG(st.st_mode))
|
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))
|
if (check_ancestors(r, rev_nr, rev, prefix))
|
||||||
res = check_merge_bases(rev_nr, rev, no_checkout);
|
res = check_merge_bases(rev_nr, rev, no_checkout);
|
||||||
free(rev);
|
free(rev);
|
||||||
if (res)
|
|
||||||
exit(res == BISECT_INTERNAL_SUCCESS_MERGE_BASE ? BISECT_OK : -res);
|
|
||||||
|
|
||||||
|
if (!res) {
|
||||||
/* Create file BISECT_ANCESTORS_OK. */
|
/* Create file BISECT_ANCESTORS_OK. */
|
||||||
fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
||||||
if (fd < 0)
|
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'"),
|
warning_errno(_("could not create file '%s'"),
|
||||||
filename);
|
filename);
|
||||||
else
|
else
|
||||||
close(fd);
|
close(fd);
|
||||||
|
}
|
||||||
done:
|
done:
|
||||||
free(filename);
|
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())
|
if (read_bisect_refs())
|
||||||
die(_("reading bisect refs failed"));
|
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);
|
bisect_rev_setup(r, &revs, prefix, "%s", "^%s", 1);
|
||||||
revs.limited = 1;
|
revs.limited = 1;
|
||||||
|
@ -666,7 +666,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
switch (cmdmode) {
|
switch (cmdmode) {
|
||||||
case NEXT_ALL:
|
case NEXT_ALL:
|
||||||
return bisect_next_all(the_repository, prefix, no_checkout);
|
res = bisect_next_all(the_repository, prefix, no_checkout);
|
||||||
|
break;
|
||||||
case WRITE_TERMS:
|
case WRITE_TERMS:
|
||||||
if (argc != 2)
|
if (argc != 2)
|
||||||
return error(_("--write-terms requires two arguments"));
|
return error(_("--write-terms requires two arguments"));
|
||||||
@ -713,5 +714,13 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
|||||||
return error("BUG: unknown subcommand '%d'", cmdmode);
|
return error("BUG: unknown subcommand '%d'", cmdmode);
|
||||||
}
|
}
|
||||||
free_terms(&terms);
|
free_terms(&terms);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle early success
|
||||||
|
* From check_merge_bases > check_good_are_ancestors_of_bad > bisect_next_all
|
||||||
|
*/
|
||||||
|
if (res == BISECT_INTERNAL_SUCCESS_MERGE_BASE)
|
||||||
|
res = BISECT_OK;
|
||||||
|
|
||||||
return abs(res);
|
return abs(res);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user