1
0
mirror of https://github.com/git/git synced 2024-07-02 15:48:44 +00:00

commit-reach(repo_get_merge_bases_many): pass on "missing commits" errors

The `merge_bases_many()` function was just taught to indicate parsing
errors, and now the `repo_get_merge_bases_many()` function is aware of
that, too.

Naturally, there are a lot of callers that need to be adjusted now, too.

Next stop: `repo_get_merge_bases_dirty()`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2024-02-28 09:44:16 +00:00 committed by Junio C Hamano
parent f87056ce40
commit 5317380521
6 changed files with 31 additions and 28 deletions

View File

@ -836,10 +836,11 @@ static void handle_skipped_merge_base(const struct object_id *mb)
static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int no_checkout) static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int no_checkout)
{ {
enum bisect_error res = BISECT_OK; enum bisect_error res = BISECT_OK;
struct commit_list *result; struct commit_list *result = NULL;
result = repo_get_merge_bases_many(the_repository, rev[0], rev_nr - 1, if (repo_get_merge_bases_many(the_repository, rev[0], rev_nr - 1,
rev + 1); rev + 1, &result) < 0)
exit(128);
for (; result; result = result->next) { for (; result; result = result->next) {
const struct object_id *mb = &result->item->object.oid; const struct object_id *mb = &result->item->object.oid;

View File

@ -1658,7 +1658,7 @@ static struct commit *get_base_commit(const char *base_commit,
struct branch *curr_branch = branch_get(NULL); struct branch *curr_branch = branch_get(NULL);
const char *upstream = branch_get_upstream(curr_branch, NULL); const char *upstream = branch_get_upstream(curr_branch, NULL);
if (upstream) { if (upstream) {
struct commit_list *base_list; struct commit_list *base_list = NULL;
struct commit *commit; struct commit *commit;
struct object_id oid; struct object_id oid;
@ -1669,11 +1669,12 @@ static struct commit *get_base_commit(const char *base_commit,
return NULL; return NULL;
} }
commit = lookup_commit_or_die(&oid, "upstream base"); commit = lookup_commit_or_die(&oid, "upstream base");
base_list = repo_get_merge_bases_many(the_repository, if (repo_get_merge_bases_many(the_repository,
commit, total, commit, total,
list); list,
/* There should be one and only one merge base. */ &base_list) < 0 ||
if (!base_list || base_list->next) { /* There should be one and only one merge base. */
!base_list || base_list->next) {
if (die_on_failure) { if (die_on_failure) {
die(_("could not find exact merge base")); die(_("could not find exact merge base"));
} else { } else {

View File

@ -461,17 +461,13 @@ static int get_merge_bases_many_0(struct repository *r,
return 0; return 0;
} }
struct commit_list *repo_get_merge_bases_many(struct repository *r, int repo_get_merge_bases_many(struct repository *r,
struct commit *one, struct commit *one,
int n, int n,
struct commit **twos) struct commit **twos,
struct commit_list **result)
{ {
struct commit_list *result = NULL; return get_merge_bases_many_0(r, one, n, twos, 1, result);
if (get_merge_bases_many_0(r, one, n, twos, 1, &result) < 0) {
free_commit_list(result);
return NULL;
}
return result;
} }
struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r,

View File

@ -13,9 +13,10 @@ int repo_get_merge_bases(struct repository *r,
struct commit *rev1, struct commit *rev1,
struct commit *rev2, struct commit *rev2,
struct commit_list **result); struct commit_list **result);
struct commit_list *repo_get_merge_bases_many(struct repository *r, int repo_get_merge_bases_many(struct repository *r,
struct commit *one, int n, struct commit *one, int n,
struct commit **twos); struct commit **twos,
struct commit_list **result);
/* To be used only when object flags after this call no longer matter */ /* To be used only when object flags after this call no longer matter */
struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r,
struct commit *one, int n, struct commit *one, int n,

View File

@ -1052,7 +1052,7 @@ struct commit *get_fork_point(const char *refname, struct commit *commit)
{ {
struct object_id oid; struct object_id oid;
struct rev_collect revs; struct rev_collect revs;
struct commit_list *bases; struct commit_list *bases = NULL;
int i; int i;
struct commit *ret = NULL; struct commit *ret = NULL;
char *full_refname; char *full_refname;
@ -1077,8 +1077,9 @@ struct commit *get_fork_point(const char *refname, struct commit *commit)
for (i = 0; i < revs.nr; i++) for (i = 0; i < revs.nr; i++)
revs.commit[i]->object.flags &= ~TMP_MARK; revs.commit[i]->object.flags &= ~TMP_MARK;
bases = repo_get_merge_bases_many(the_repository, commit, revs.nr, if (repo_get_merge_bases_many(the_repository, commit, revs.nr,
revs.commit); revs.commit, &bases) < 0)
exit(128);
/* /*
* There should be one and only one merge base, when we found * There should be one and only one merge base, when we found

View File

@ -115,9 +115,12 @@ int cmd__reach(int ac, const char **av)
else if (!strcmp(av[1], "is_descendant_of")) else if (!strcmp(av[1], "is_descendant_of"))
printf("%s(A,X):%d\n", av[1], repo_is_descendant_of(r, A, X)); printf("%s(A,X):%d\n", av[1], repo_is_descendant_of(r, A, X));
else if (!strcmp(av[1], "get_merge_bases_many")) { else if (!strcmp(av[1], "get_merge_bases_many")) {
struct commit_list *list = repo_get_merge_bases_many(the_repository, struct commit_list *list = NULL;
A, X_nr, if (repo_get_merge_bases_many(the_repository,
X_array); A, X_nr,
X_array,
&list) < 0)
exit(128);
printf("%s(A,X):\n", av[1]); printf("%s(A,X):\n", av[1]);
print_sorted_commit_ids(list); print_sorted_commit_ids(list);
} else if (!strcmp(av[1], "reduce_heads")) { } else if (!strcmp(av[1], "reduce_heads")) {