Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2020-12-13 11:04:17 +0300
committerJunio C Hamano <gitster@pobox.com>2020-12-14 01:18:20 +0300
commit291f29caf6b045576f9953f0ea41fc8367966750 (patch)
tree4c5fdd208705d855195f8b45c399967dd330a25d /merge-ort.c
parent98bf98416726430b6cbc8670725f008588e478a7 (diff)
merge-ort: avoid recursing into identical trees
When all three trees have the same oid, there is no need to recurse into these trees to find that all files within them happen to match. We can just record any one of the trees as the resolution of merging that particular path. Immediately resolving trees for other types of trivial tree merges (such as one side matches the merge base, or the two sides match each other) would prevent us from detecting renames for some paths, and thus prevent us from doing three-way content merges for those paths whose renames we did not detect. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'merge-ort.c')
-rw-r--r--merge-ort.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/merge-ort.c b/merge-ort.c
index bbfc056300..868ac65091 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -368,6 +368,19 @@ static int collect_merge_info_callback(int n,
make_traverse_path(fullpath, len + 1, info, p->path, p->pathlen);
/*
+ * If mbase, side1, and side2 all match, we can resolve early. Even
+ * if these are trees, there will be no renames or anything
+ * underneath.
+ */
+ if (side1_matches_mbase && side2_matches_mbase) {
+ /* mbase, side1, & side2 all match; use mbase as resolution */
+ setup_path_info(opt, &pi, dirname, info->pathlen, fullpath,
+ names, names+0, mbase_null, 0,
+ filemask, dirmask, 1);
+ return mask;
+ }
+
+ /*
* Record information about the path so we can resolve later in
* process_entries.
*/