[PATCH 06/11] merge-ort: support subtree shifting
- From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Mar 5, 2021, 00:55 UTC
- Message-ID
- <d04ddabde124c165a1096c1a1d72490b2e399138.1614905738.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.973.git.git.1614905738.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>
merge-recursive has some simple code to support subtree shifting; copy it over to merge-ort. This fixes t6409.12 under GIT_TEST_MERGE_ALGORITHM=ort.
Signed-off-by: Elijah Newren <newren@gmail.com> --- merge-ort.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/merge-ort.c b/merge-ort.c index c4bd88b9d3db..a998f843a1da 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -3417,6 +3417,23 @@ void merge_finalize(struct merge_options *opt, /*** Function Grouping: helper functions for merge_incore_*() ***/ +static struct tree *shift_tree_object(struct repository *repo, + struct tree *one, struct tree *two, + const char *subtree_shift) +{ + struct object_id shifted; + + if (!*subtree_shift) { + shift_tree(repo, &one->object.oid, &two->object.oid, &shifted, 0); + } else { + shift_tree_by(repo, &one->object.oid, &two->object.oid, &shifted, + subtree_shift); + } + if (oideq(&two->object.oid, &shifted)) + return two; + return lookup_tree(repo, &shifted); +} + static inline void set_commit_tree(struct commit *c, struct tree *t) { c->maybe_tree = t; @@ -3544,6 +3561,13 @@ static void merge_ort_nonrecursive_internal(struct merge_options *opt, { struct object_id working_tree_oid; + if (opt->subtree_shift) { + side2 = shift_tree_object(opt->repo, side1, side2, + opt->subtree_shift); + merge_base = shift_tree_object(opt->repo, side1, merge_base, + opt->subtree_shift); + } + trace2_region_enter("merge", "collect_merge_info", opt->repo); if (collect_merge_info(opt, merge_base, side1, side2) != 0) { /*
-- gitgitgadget