]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-reach(get_octopus_merge_bases): pass on "missing commits" errors
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 28 Feb 2024 09:44:15 +0000 (09:44 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 29 Feb 2024 16:06:01 +0000 (08:06 -0800)
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>
builtin/merge-base.c
builtin/merge.c
builtin/pull.c
commit-reach.c
commit-reach.h

index b0b3838d5f148e07969e3a45460680216126ec6c..4d1ff840bdbd846176e99186f1061b381b57f255 100644 (file)
@@ -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);
 
index 7c0189fb8f199902d8749af7c94b6f905e031530..52828edee098739d383d2f33942690a4eff2c689 100644 (file)
@@ -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);
        }
 
index 3daff0e8b90713d9b613ada38e77d8d64fdc2aed..72cbb76d520718cfc2f23093dd5ef76ea2d682bf 100644 (file)
@@ -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);
@@ -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);
 
index ff2c5ce89f3c64c3e14f1ec58cb34c0ac74b51e7..5010fb8ad5ba89ddc6f41986d6ef9c0b3994b021 100644 (file)
@@ -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;
@@ -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,
index 2c6fcdd34f6774e7e86b302311838fc9158e77f6..4690b6ecd0c01ea87410f495f00a57c5740bc602 100644 (file)
@@ -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,