]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: add an err() function similar to one from merge-recursive
authorElijah Newren <newren@gmail.com>
Sun, 13 Dec 2020 08:04:12 +0000 (08:04 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 13 Dec 2020 22:18:19 +0000 (14:18 -0800)
Various places in merge-recursive used an err() function when it hit
some kind of unrecoverable error.  That code was from the reusable bits
of merge-recursive.c that we liked, such as merge_3way, writing object
files to the object store, reading blobs from the object store, etc.  So
create a similar function to allow us to port that code over, and use it
for when we detect problems returned from collect_merge_info()'s
traverse_trees() call, which we will be adding next.

While we are at it, also add more documentation for the "clean" field
from struct merge_result, particularly since the name suggests a boolean
but it is not quite one and this is our first non-boolean usage.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
merge-ort.c
merge-ort.h

index 85942cfa7c75f992e3fb71f98ae1dd7519afbc1f..76c0f934279eeb93002931d80850c5e63e7909f5 100644 (file)
@@ -168,12 +168,27 @@ struct conflict_info {
        unsigned match_mask:3;
 };
 
+static int err(struct merge_options *opt, const char *err, ...)
+{
+       va_list params;
+       struct strbuf sb = STRBUF_INIT;
+
+       strbuf_addstr(&sb, "error: ");
+       va_start(params, err);
+       strbuf_vaddf(&sb, err, params);
+       va_end(params);
+
+       error("%s", sb.buf);
+       strbuf_release(&sb);
+
+       return -1;
+}
+
 static int collect_merge_info(struct merge_options *opt,
                              struct tree *merge_base,
                              struct tree *side1,
                              struct tree *side2)
 {
-       /* TODO: Implement this using traverse_trees() */
        die("Not yet implemented.");
 }
 
@@ -276,7 +291,19 @@ static void merge_ort_nonrecursive_internal(struct merge_options *opt,
 {
        struct object_id working_tree_oid;
 
-       collect_merge_info(opt, merge_base, side1, side2);
+       if (collect_merge_info(opt, merge_base, side1, side2) != 0) {
+               /*
+                * TRANSLATORS: The %s arguments are: 1) tree hash of a merge
+                * base, and 2-3) the trees for the two trees we're merging.
+                */
+               err(opt, _("collecting merge info failed for trees %s, %s, %s"),
+                   oid_to_hex(&merge_base->object.oid),
+                   oid_to_hex(&side1->object.oid),
+                   oid_to_hex(&side2->object.oid));
+               result->clean = -1;
+               return;
+       }
+
        result->clean = detect_and_process_renames(opt, merge_base,
                                                   side1, side2);
        process_entries(opt, &working_tree_oid);
index 74adccad162b655e2174354eab093217dbd5b124..55ae7ee865d0faa51ae84b70f1faf6b6e9a3df6d 100644 (file)
@@ -7,7 +7,14 @@ struct commit;
 struct tree;
 
 struct merge_result {
-       /* Whether the merge is clean */
+       /*
+        * Whether the merge is clean; possible values:
+        *    1: clean
+        *    0: not clean (merge conflicts)
+        *   <0: operation aborted prematurely.  (object database
+        *       unreadable, disk full, etc.)  Worktree may be left in an
+        *       inconsistent state if operation failed near the end.
+        */
        int clean;
 
        /*