]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort-wrappers: new convience wrappers to mimic the old merge API
authorElijah Newren <newren@gmail.com>
Tue, 27 Oct 2020 02:08:08 +0000 (02:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 27 Oct 2020 05:36:14 +0000 (22:36 -0700)
There are a few differences between the new API in merge-ort and the old
API in merge-recursive.  While the new API is more flexible, it might
feel like more work at times than the old API.  merge-ort-wrappers
creates two convenience wrappers taking the exact same arguments as the
old merge_trees() and merge_recursive() functions and implements them
via the new API.  This makes converting existing callsites easier, and
serves to highlight some of the differences in the API.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
merge-ort-wrappers.c [new file with mode: 0644]
merge-ort-wrappers.h [new file with mode: 0644]

index bb9181e3af0022676f8ff04534c6ae32437357b6..9eb8e9628baecd86faa61d46cc2b0bb3ee60a9ad 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -922,6 +922,7 @@ LIB_OBJS += match-trees.o
 LIB_OBJS += mem-pool.o
 LIB_OBJS += merge-blobs.o
 LIB_OBJS += merge-ort.o
+LIB_OBJS += merge-ort-wrappers.o
 LIB_OBJS += merge-recursive.o
 LIB_OBJS += merge.o
 LIB_OBJS += mergesort.o
diff --git a/merge-ort-wrappers.c b/merge-ort-wrappers.c
new file mode 100644 (file)
index 0000000..7eec25f
--- /dev/null
@@ -0,0 +1,62 @@
+#include "cache.h"
+#include "merge-ort.h"
+#include "merge-ort-wrappers.h"
+
+#include "commit.h"
+
+static int unclean(struct merge_options *opt, struct tree *head)
+{
+       /* Sanity check on repo state; index must match head */
+       struct strbuf sb = STRBUF_INIT;
+
+       if (head && repo_index_has_changes(opt->repo, head, &sb)) {
+               fprintf(stderr, _("Your local changes to the following files would be overwritten by merge:\n  %s"),
+                   sb.buf);
+               strbuf_release(&sb);
+               return -1;
+       }
+
+       return 0;
+}
+
+int merge_ort_nonrecursive(struct merge_options *opt,
+                          struct tree *head,
+                          struct tree *merge,
+                          struct tree *merge_base)
+{
+       struct merge_result result;
+
+       if (unclean(opt, head))
+               return -1;
+
+       if (oideq(&merge_base->object.oid, &merge->object.oid)) {
+               printf(_("Already up to date!"));
+               return 1;
+       }
+
+       memset(&result, 0, sizeof(result));
+       merge_incore_nonrecursive(opt, merge_base, head, merge, &result);
+       merge_switch_to_result(opt, head, &result, 1, 1);
+
+       return result.clean;
+}
+
+int merge_ort_recursive(struct merge_options *opt,
+                       struct commit *side1,
+                       struct commit *side2,
+                       struct commit_list *merge_bases,
+                       struct commit **result)
+{
+       struct tree *head = repo_get_commit_tree(opt->repo, side1);
+       struct merge_result tmp;
+
+       if (unclean(opt, head))
+               return -1;
+
+       memset(&tmp, 0, sizeof(tmp));
+       merge_incore_recursive(opt, merge_bases, side1, side2, &tmp);
+       merge_switch_to_result(opt, head, &tmp, 1, 1);
+       *result = NULL;
+
+       return tmp.clean;
+}
diff --git a/merge-ort-wrappers.h b/merge-ort-wrappers.h
new file mode 100644 (file)
index 0000000..0c4c57a
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef MERGE_ORT_WRAPPERS_H
+#define MERGE_ORT_WRAPPERS_H
+
+#include "merge-recursive.h"
+
+/*
+ * rename-detecting three-way merge, no recursion.
+ * Wrapper mimicking the old merge_trees() function.
+ */
+int merge_ort_nonrecursive(struct merge_options *opt,
+                          struct tree *head,
+                          struct tree *merge,
+                          struct tree *common);
+
+/*
+ * rename-detecting three-way merge with recursive ancestor consolidation.
+ * Wrapper mimicking the old merge_recursive() function.
+ */
+int merge_ort_recursive(struct merge_options *opt,
+                       struct commit *h1,
+                       struct commit *h2,
+                       struct commit_list *ancestors,
+                       struct commit **result);
+
+#endif