Skip to content

Commit 76e2a09

Browse files
dschogitster
authored andcommitted
commit-reach(repo_get_merge_bases): pass on "missing commits" errors
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 `repo_get_merge_bases()` macro) is aware of that, too. Naturally, there are a lot of callers that need to be adjusted now, too. Next step: adjust the callers of `get_octopus_merge_bases()`. Signed-off-by: Johannes Schindelin <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 8226e15 commit 76e2a09

17 files changed

+96
-51
lines changed

builtin/log.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,11 +1704,11 @@ static struct commit *get_base_commit(const char *base_commit,
17041704
*/
17051705
while (rev_nr > 1) {
17061706
for (i = 0; i < rev_nr / 2; i++) {
1707-
struct commit_list *merge_base;
1708-
merge_base = repo_get_merge_bases(the_repository,
1709-
rev[2 * i],
1710-
rev[2 * i + 1]);
1711-
if (!merge_base || merge_base->next) {
1707+
struct commit_list *merge_base = NULL;
1708+
if (repo_get_merge_bases(the_repository,
1709+
rev[2 * i],
1710+
rev[2 * i + 1], &merge_base) < 0 ||
1711+
!merge_base || merge_base->next) {
17121712
if (die_on_failure) {
17131713
die(_("failed to find exact merge base"));
17141714
} else {

builtin/merge-tree.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,9 @@ static int real_merge(struct merge_tree_options *o,
462462
* Get the merge bases, in reverse order; see comment above
463463
* merge_incore_recursive in merge-ort.h
464464
*/
465-
merge_bases = repo_get_merge_bases(the_repository, parent1,
466-
parent2);
465+
if (repo_get_merge_bases(the_repository, parent1,
466+
parent2, &merge_bases) < 0)
467+
exit(128);
467468
if (!merge_bases && !o->allow_unrelated_histories)
468469
die(_("refusing to merge unrelated histories"));
469470
merge_bases = reverse_commit_list(merge_bases);

builtin/merge.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,10 +1514,13 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
15141514

15151515
if (!remoteheads)
15161516
; /* already up-to-date */
1517-
else if (!remoteheads->next)
1518-
common = repo_get_merge_bases(the_repository, head_commit,
1519-
remoteheads->item);
1520-
else {
1517+
else if (!remoteheads->next) {
1518+
if (repo_get_merge_bases(the_repository, head_commit,
1519+
remoteheads->item, &common) < 0) {
1520+
ret = 2;
1521+
goto done;
1522+
}
1523+
} else {
15211524
struct commit_list *list = remoteheads;
15221525
commit_list_insert(head_commit, &list);
15231526
common = get_octopus_merge_bases(list);
@@ -1627,17 +1630,18 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
16271630
struct commit_list *j;
16281631

16291632
for (j = remoteheads; j; j = j->next) {
1630-
struct commit_list *common_one;
1633+
struct commit_list *common_one = NULL;
16311634
struct commit *common_item;
16321635

16331636
/*
16341637
* Here we *have* to calculate the individual
16351638
* merge_bases again, otherwise "git merge HEAD^
16361639
* HEAD^^" would be missed.
16371640
*/
1638-
common_one = repo_get_merge_bases(the_repository,
1639-
head_commit,
1640-
j->item);
1641+
if (repo_get_merge_bases(the_repository, head_commit,
1642+
j->item, &common_one) < 0)
1643+
exit(128);
1644+
16411645
common_item = common_one->item;
16421646
free_commit_list(common_one);
16431647
if (!oideq(&common_item->object.oid, &j->item->object.oid)) {

builtin/rebase.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,8 @@ static int can_fast_forward(struct commit *onto, struct commit *upstream,
867867
if (!upstream)
868868
goto done;
869869

870-
merge_bases = repo_get_merge_bases(the_repository, upstream, head);
870+
if (repo_get_merge_bases(the_repository, upstream, head, &merge_bases) < 0)
871+
exit(128);
871872
if (!merge_bases || merge_bases->next)
872873
goto done;
873874

@@ -886,8 +887,9 @@ static void fill_branch_base(struct rebase_options *options,
886887
{
887888
struct commit_list *merge_bases = NULL;
888889

889-
merge_bases = repo_get_merge_bases(the_repository, options->onto,
890-
options->orig_head);
890+
if (repo_get_merge_bases(the_repository, options->onto,
891+
options->orig_head, &merge_bases) < 0)
892+
exit(128);
891893
if (!merge_bases || merge_bases->next)
892894
oidcpy(branch_base, null_oid());
893895
else

builtin/rev-parse.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,15 +297,16 @@ static int try_difference(const char *arg)
297297
show_rev(NORMAL, &end_oid, end);
298298
show_rev(symmetric ? NORMAL : REVERSED, &start_oid, start);
299299
if (symmetric) {
300-
struct commit_list *exclude;
300+
struct commit_list *exclude = NULL;
301301
struct commit *a, *b;
302302
a = lookup_commit_reference(the_repository, &start_oid);
303303
b = lookup_commit_reference(the_repository, &end_oid);
304304
if (!a || !b) {
305305
*dotdot = '.';
306306
return 0;
307307
}
308-
exclude = repo_get_merge_bases(the_repository, a, b);
308+
if (repo_get_merge_bases(the_repository, a, b, &exclude) < 0)
309+
exit(128);
309310
while (exclude) {
310311
struct commit *commit = pop_commit(&exclude);
311312
show_rev(REVERSED, &commit->object.oid, NULL);

commit-reach.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,12 @@ struct commit_list *get_octopus_merge_bases(struct commit_list *in)
188188
struct commit_list *new_commits = NULL, *end = NULL;
189189

190190
for (j = ret; j; j = j->next) {
191-
struct commit_list *bases;
192-
bases = repo_get_merge_bases(the_repository, i->item,
193-
j->item);
191+
struct commit_list *bases = NULL;
192+
if (repo_get_merge_bases(the_repository, i->item,
193+
j->item, &bases) < 0) {
194+
free_commit_list(bases);
195+
return NULL;
196+
}
194197
if (!new_commits)
195198
new_commits = bases;
196199
else
@@ -482,16 +485,12 @@ struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r,
482485
return result;
483486
}
484487

485-
struct commit_list *repo_get_merge_bases(struct repository *r,
486-
struct commit *one,
487-
struct commit *two)
488+
int repo_get_merge_bases(struct repository *r,
489+
struct commit *one,
490+
struct commit *two,
491+
struct commit_list **result)
488492
{
489-
struct commit_list *result = NULL;
490-
if (get_merge_bases_many_0(r, one, 1, &two, 1, &result) < 0) {
491-
free_commit_list(result);
492-
return NULL;
493-
}
494-
return result;
493+
return get_merge_bases_many_0(r, one, 1, &two, 1, result);
495494
}
496495

497496
/*

commit-reach.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ struct ref_filter;
99
struct object_id;
1010
struct object_array;
1111

12-
struct commit_list *repo_get_merge_bases(struct repository *r,
13-
struct commit *rev1,
14-
struct commit *rev2);
12+
int repo_get_merge_bases(struct repository *r,
13+
struct commit *rev1,
14+
struct commit *rev2,
15+
struct commit_list **result);
1516
struct commit_list *repo_get_merge_bases_many(struct repository *r,
1617
struct commit *one, int n,
1718
struct commit **twos);

diff-lib.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb)
570570
{
571571
int i;
572572
struct commit *mb_child[2] = {0};
573-
struct commit_list *merge_bases;
573+
struct commit_list *merge_bases = NULL;
574574

575575
for (i = 0; i < revs->pending.nr; i++) {
576576
struct object *obj = revs->pending.objects[i].item;
@@ -597,7 +597,8 @@ void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb)
597597
mb_child[1] = lookup_commit_reference(the_repository, &oid);
598598
}
599599

600-
merge_bases = repo_get_merge_bases(the_repository, mb_child[0], mb_child[1]);
600+
if (repo_get_merge_bases(the_repository, mb_child[0], mb_child[1], &merge_bases) < 0)
601+
exit(128);
601602
if (!merge_bases)
602603
die(_("no merge base found"));
603604
if (merge_bases->next)

log-tree.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ static int do_remerge_diff(struct rev_info *opt,
10111011
struct object_id *oid)
10121012
{
10131013
struct merge_options o;
1014-
struct commit_list *bases;
1014+
struct commit_list *bases = NULL;
10151015
struct merge_result res = {0};
10161016
struct pretty_print_context ctx = {0};
10171017
struct commit *parent1 = parents->item;
@@ -1036,7 +1036,8 @@ static int do_remerge_diff(struct rev_info *opt,
10361036
/* Parse the relevant commits and get the merge bases */
10371037
parse_commit_or_die(parent1);
10381038
parse_commit_or_die(parent2);
1039-
bases = repo_get_merge_bases(the_repository, parent1, parent2);
1039+
if (repo_get_merge_bases(the_repository, parent1, parent2, &bases) < 0)
1040+
exit(128);
10401041

10411042
/* Re-merge the parents */
10421043
merge_incore_recursive(&o, bases, parent1, parent2, &res);

merge-ort.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5068,7 +5068,11 @@ static void merge_ort_internal(struct merge_options *opt,
50685068
struct strbuf merge_base_abbrev = STRBUF_INIT;
50695069

50705070
if (!merge_bases) {
5071-
merge_bases = repo_get_merge_bases(the_repository, h1, h2);
5071+
if (repo_get_merge_bases(the_repository, h1, h2,
5072+
&merge_bases) < 0) {
5073+
result->clean = -1;
5074+
return;
5075+
}
50725076
/* See merge-ort.h:merge_incore_recursive() declaration NOTE */
50735077
merge_bases = reverse_commit_list(merge_bases);
50745078
}

0 commit comments

Comments
 (0)