merge-ort: add an err() function similar to one from merge-recursive

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>

Elijah Newren committed Dec 13, 2020 at 08:04 UTC 0c0d705b5cba39c70b01b8b21e2c4d3ca014daf3
2 files changed +37 -3
merge-ort.c
+29 -2
@@ -168,12 +168,27 @@ struct conflict_info {
168 unsigned match_mask:3;
169 };
170
171 +static int err(struct merge_options *opt, const char *err, ...)
172 +{
173 + va_list params;
174 + struct strbuf sb = STRBUF_INIT;
175 +
176 + strbuf_addstr(&sb, "error: ");
177 + va_start(params, err);
178 + strbuf_vaddf(&sb, err, params);
179 + va_end(params);
180 +
181 + error("%s", sb.buf);
182 + strbuf_release(&sb);
183 +
184 + return -1;
185 +}
186 +
187 static int collect_merge_info(struct merge_options *opt,
188 struct tree *merge_base,
189 struct tree *side1,
190 struct tree *side2)
191 {
176 - /* TODO: Implement this using traverse_trees() */
192 die("Not yet implemented.");
193 }
194
@@ -276,7 +291,19 @@ static void merge_ort_nonrecursive_internal(struct merge_options *opt,
291 {
292 struct object_id working_tree_oid;
293
279 - collect_merge_info(opt, merge_base, side1, side2);
294 + if (collect_merge_info(opt, merge_base, side1, side2) != 0) {
295 + /*
296 + * TRANSLATORS: The %s arguments are: 1) tree hash of a merge
297 + * base, and 2-3) the trees for the two trees we're merging.
298 + */
299 + err(opt, _("collecting merge info failed for trees %s, %s, %s"),
300 + oid_to_hex(&merge_base->object.oid),
301 + oid_to_hex(&side1->object.oid),
302 + oid_to_hex(&side2->object.oid));
303 + result->clean = -1;
304 + return;
305 + }
306 +
307 result->clean = detect_and_process_renames(opt, merge_base,
308 side1, side2);
309 process_entries(opt, &working_tree_oid);
merge-ort.h
+8 -1
@@ -7,7 +7,14 @@ struct commit;
7 struct tree;
8
9 struct merge_result {
10 - /* Whether the merge is clean */
10 + /*
11 + * Whether the merge is clean; possible values:
12 + * 1: clean
13 + * 0: not clean (merge conflicts)
14 + * <0: operation aborted prematurely. (object database
15 + * unreadable, disk full, etc.) Worktree may be left in an
16 + * inconsistent state if operation failed near the end.
17 + */
18 int clean;
19
20 /*