Skip to content

Commit

Permalink
commit-reach(get_octopus_merge_bases): pass on "missing commits" errors
Browse files Browse the repository at this point in the history
The `merge_bases_many()` function was just taught to indicate parsing
errors, and now the `repo_get_merge_bases()` function (which is also
surfaced via the `get_merge_bases()` macro) is aware of that, too.

Naturally, the callers need to be adjusted now, too.

Next step: adjust `repo_get_merge_bases_many()`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
dscho authored and gitster committed Feb 29, 2024
1 parent 76e2a09 commit f87056c
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 15 deletions.
8 changes: 6 additions & 2 deletions builtin/merge-base.c
Expand Up @@ -74,13 +74,17 @@ static int handle_independent(int count, const char **args)
static int handle_octopus(int count, const char **args, int show_all)
{
struct commit_list *revs = NULL;
struct commit_list *result, *rev;
struct commit_list *result = NULL, *rev;
int i;

for (i = count - 1; i >= 0; i--)
commit_list_insert(get_commit_reference(args[i]), &revs);

result = get_octopus_merge_bases(revs);
if (get_octopus_merge_bases(revs, &result) < 0) {
free_commit_list(revs);
free_commit_list(result);
return 128;
}
free_commit_list(revs);
reduce_heads_replace(&result);

Expand Down
6 changes: 5 additions & 1 deletion builtin/merge.c
Expand Up @@ -1523,7 +1523,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
} else {
struct commit_list *list = remoteheads;
commit_list_insert(head_commit, &list);
common = get_octopus_merge_bases(list);
if (get_octopus_merge_bases(list, &common) < 0) {
free(list);
ret = 2;
goto done;
}
free(list);
}

Expand Down
5 changes: 3 additions & 2 deletions builtin/pull.c
Expand Up @@ -815,7 +815,7 @@ static int get_octopus_merge_base(struct object_id *merge_base,
const struct object_id *merge_head,
const struct object_id *fork_point)
{
struct commit_list *revs = NULL, *result;
struct commit_list *revs = NULL, *result = NULL;

commit_list_insert(lookup_commit_reference(the_repository, curr_head),
&revs);
Expand All @@ -825,7 +825,8 @@ static int get_octopus_merge_base(struct object_id *merge_base,
commit_list_insert(lookup_commit_reference(the_repository, fork_point),
&revs);

result = get_octopus_merge_bases(revs);
if (get_octopus_merge_bases(revs, &result) < 0)
exit(128);
free_commit_list(revs);
reduce_heads_replace(&result);

Expand Down
20 changes: 11 additions & 9 deletions commit-reach.c
Expand Up @@ -175,24 +175,26 @@ static int merge_bases_many(struct repository *r,
return 0;
}

struct commit_list *get_octopus_merge_bases(struct commit_list *in)
int get_octopus_merge_bases(struct commit_list *in, struct commit_list **result)
{
struct commit_list *i, *j, *k, *ret = NULL;
struct commit_list *i, *j, *k;

if (!in)
return ret;
return 0;

commit_list_insert(in->item, &ret);
commit_list_insert(in->item, result);

for (i = in->next; i; i = i->next) {
struct commit_list *new_commits = NULL, *end = NULL;

for (j = ret; j; j = j->next) {
for (j = *result; j; j = j->next) {
struct commit_list *bases = NULL;
if (repo_get_merge_bases(the_repository, i->item,
j->item, &bases) < 0) {
free_commit_list(bases);
return NULL;
free_commit_list(*result);
*result = NULL;
return -1;
}
if (!new_commits)
new_commits = bases;
Expand All @@ -201,10 +203,10 @@ struct commit_list *get_octopus_merge_bases(struct commit_list *in)
for (k = bases; k; k = k->next)
end = k;
}
free_commit_list(ret);
ret = new_commits;
free_commit_list(*result);
*result = new_commits;
}
return ret;
return 0;
}

static int remove_redundant_no_gen(struct repository *r,
Expand Down
2 changes: 1 addition & 1 deletion commit-reach.h
Expand Up @@ -21,7 +21,7 @@ struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r,
struct commit *one, int n,
struct commit **twos);

struct commit_list *get_octopus_merge_bases(struct commit_list *in);
int get_octopus_merge_bases(struct commit_list *in, struct commit_list **result);

int repo_is_descendant_of(struct repository *r,
struct commit *commit,
Expand Down

0 comments on commit f87056c

Please sign in to comment.