From: "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>, Elijah Newren <newren@gmail.com>
Subject: [PATCH v2 0/3] merge-ort: implement recursive merges
Date: Wed, 16 Dec 2020 05:52:41 +0000 [thread overview]
Message-ID: <pull.814.v2.git.1608097965.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.814.git.1608054807.gitgitgadget@gmail.com>
This series depends on en/merge-ort-2 (it does NOT depend on en/merge-ort-3
and can thus be reviewed/merged independently of it).
This short series adds handling of recursive merges (merging of multiple
merge-bases to create a virtual merge base) to merge-ort. With this short
series the number of test failures under GIT_TEST_MERGE_ALGORITHM=ort drops
by 801 (from 1448 to 647).
Changes since v1 (based on review comments from Junio):
* add documentation on why we reverse the commit_list of merge bases
* modify the special override for allowing opt->ancestor to be set before
merge_incore_recursive() and document its rationale
Elijah Newren (3):
merge-ort: copy a few small helper functions from merge-recursive.c
merge-ort: make clear_internal_opts() aware of partial clearing
merge-ort: implement merge_incore_recursive()
merge-ort.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++---
merge-ort.h | 10 ++++
2 files changed, 152 insertions(+), 7 deletions(-)
base-commit: c5a6f65527aa3b6f5d7cf25437a88d8727ab0646
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-814%2Fnewren%2Fort-recursive-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-814/newren/ort-recursive-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/814
Range-diff vs v1:
1: 0b455bd6fe7 = 1: 0b455bd6fe7 merge-ort: copy a few small helper functions from merge-recursive.c
2: fc26c1a11db = 2: fc26c1a11db merge-ort: make clear_internal_opts() aware of partial clearing
3: 82a773d8972 ! 3: d8f79450a40 merge-ort: implement merge_incore_recursive()
@@ merge-ort.c: static void merge_ort_nonrecursive_internal(struct merge_options *o
+
+ if (!merge_bases) {
+ merge_bases = get_merge_bases(h1, h2);
++ /* See merge-ort.h:merge_incore_recursive() declaration NOTE */
+ merge_bases = reverse_commit_list(merge_bases);
+ }
+
@@ merge-ort.c: void merge_incore_recursive(struct merge_options *opt,
- (void)reverse_commit_list;
- (void)make_virtual_commit;
- die("Not yet implemented");
-+ assert(opt->ancestor == NULL ||
-+ !strcmp(opt->ancestor, "constructed merge base"));
++ /*
++ * merge_incore_nonrecursive() exists for cases where we always
++ * know there is a well-defined single merge base. However,
++ * despite a similar structure, merge-recursive.c noted that some
++ * callers preferred to call the recursive logic anyway and still
++ * set a special name for opt->ancestor that would appear in
++ * merge.conflictStyle=diff3 output.
++ *
++ * git-am was one such example (it wanted to set opt->ancestor to
++ * "constructed merge base", since it created a fake merge base);
++ * it called the recursive merge logic through a special
++ * merge_recursive_generic() wrapper.
++ *
++ * Allow the same kind of special case here.
++ */
++ int num_merge_bases_is_1 = (merge_bases && !merge_bases->next);
++ assert(opt->ancestor == NULL || num_merge_bases_is_1);
+
+ merge_start(opt, result);
+ merge_ort_internal(opt, merge_bases, side1, side2, result);
}
+
+ ## merge-ort.h ##
+@@ merge-ort.h: struct merge_result {
+ /*
+ * rename-detecting three-way merge with recursive ancestor consolidation.
+ * working tree and index are untouched.
++ *
++ * merge_bases will be consumed (emptied) so make a copy if you need it.
++ *
++ * NOTE: empirically, the recursive algorithm will perform better if you
++ * pass the merge_bases in the order of oldest commit to the
++ * newest[1][2].
++ *
++ * [1] https://lore.kernel.org/git/nycvar.QRO.7.76.6.1907252055500.21907@tvgsbejvaqbjf.bet/
++ * [2] commit 8918b0c9c2 ("merge-recur: try to merge older merge bases
++ * first", 2006-08-09)
+ */
+ void merge_incore_recursive(struct merge_options *opt,
+ struct commit_list *merge_bases,
--
gitgitgadget
next prev parent reply other threads:[~2020-12-16 5:53 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-15 17:53 [PATCH 0/3] merge-ort: implement recursive merges Elijah Newren via GitGitGadget
2020-12-15 17:53 ` [PATCH 1/3] merge-ort: copy a few small helper functions from merge-recursive.c Elijah Newren via GitGitGadget
2020-12-16 1:16 ` Junio C Hamano
2020-12-16 16:12 ` Johannes Schindelin
2020-12-16 16:24 ` Elijah Newren
2020-12-16 13:30 ` Derrick Stolee
2020-12-16 17:43 ` Junio C Hamano
2020-12-16 18:54 ` Felipe Contreras
2020-12-16 19:20 ` Elijah Newren
2020-12-16 20:41 ` Junio C Hamano
2020-12-16 21:25 ` Felipe Contreras
2020-12-16 21:34 ` Elijah Newren
2020-12-15 17:53 ` [PATCH 2/3] merge-ort: make clear_internal_opts() aware of partial clearing Elijah Newren via GitGitGadget
2020-12-15 17:53 ` [PATCH 3/3] merge-ort: implement merge_incore_recursive() Elijah Newren via GitGitGadget
2020-12-16 2:07 ` Junio C Hamano
2020-12-16 4:09 ` Elijah Newren
2020-12-16 4:44 ` Elijah Newren
2020-12-16 5:52 ` Elijah Newren via GitGitGadget [this message]
2020-12-16 5:52 ` [PATCH v2 1/3] merge-ort: copy a few small helper functions from merge-recursive.c Elijah Newren via GitGitGadget
2020-12-16 5:52 ` [PATCH v2 2/3] merge-ort: make clear_internal_opts() aware of partial clearing Elijah Newren via GitGitGadget
2020-12-16 5:52 ` [PATCH v2 3/3] merge-ort: implement merge_incore_recursive() Elijah Newren via GitGitGadget
2020-12-16 18:09 ` Junio C Hamano
2020-12-16 18:37 ` Elijah Newren
2020-12-16 17:17 ` [PATCH v3 0/3] merge-ort: implement recursive merges Elijah Newren via GitGitGadget
2020-12-16 17:17 ` [PATCH v3 1/3] merge-ort: copy a few small helper functions from merge-recursive.c Elijah Newren via GitGitGadget
2020-12-16 17:17 ` [PATCH v3 2/3] merge-ort: make clear_internal_opts() aware of partial clearing Elijah Newren via GitGitGadget
2020-12-16 17:17 ` [PATCH v3 3/3] merge-ort: implement merge_incore_recursive() Elijah Newren via GitGitGadget
2020-12-16 20:35 ` [PATCH v4 0/3] merge-ort: implement recursive merges Elijah Newren via GitGitGadget
2020-12-16 20:35 ` [PATCH v4 1/3] merge-ort: copy a few small helper functions from merge-recursive.c Elijah Newren via GitGitGadget
2020-12-16 20:35 ` [PATCH v4 2/3] merge-ort: make clear_internal_opts() aware of partial clearing Elijah Newren via GitGitGadget
2020-12-16 20:35 ` [PATCH v4 3/3] merge-ort: implement merge_incore_recursive() Elijah Newren via GitGitGadget
2020-12-16 22:27 ` [PATCH v5 0/4] merge-ort: implement recursive merges Elijah Newren via GitGitGadget
2020-12-16 22:27 ` [PATCH v5 1/4] commit: move reverse_commit_list() from merge-recursive Elijah Newren via GitGitGadget
2020-12-17 14:03 ` Derrick Stolee
2020-12-16 22:28 ` [PATCH v5 2/4] merge-ort: copy a few small helper functions from merge-recursive.c Elijah Newren via GitGitGadget
2020-12-16 22:28 ` [PATCH v5 3/4] merge-ort: make clear_internal_opts() aware of partial clearing Elijah Newren via GitGitGadget
2020-12-16 22:28 ` [PATCH v5 4/4] merge-ort: implement merge_incore_recursive() Elijah Newren via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.814.v2.git.1608097965.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=newren@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.