summaryrefslogtreecommitdiff
path: root/merge-ort.c
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2021-07-16 05:22:31 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-07-20 21:47:39 (GMT)
commit785bf2088e54ed8a450edb5c7371286ff6405605 (patch)
treed0b6736e7b21d62e4c071a3456dd9d3149ded086 /merge-ort.c
parentdaab8a564f8bbac55f70f8bf86c070e001a9b006 (diff)
downloadgit-785bf2088e54ed8a450edb5c7371286ff6405605.zip
git-785bf2088e54ed8a450edb5c7371286ff6405605.tar.gz
git-785bf2088e54ed8a450edb5c7371286ff6405605.tar.bz2
merge-ort: resolve paths early when we have sufficient information
When there are no directories involved at a given path, and all three sides have a file at that path, and two of the three sides of history match, we can immediately resolve the merge of that path in collect_merge_info() and do not need to wait until process_entries(). This is actually a very minor improvement: half the time when I run it, I see an improvement; the other half a slowdown. It seems to be in the range of noise. However, this idea serves as the beginning of some bigger optimizations coming in the following patches. 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.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/merge-ort.c b/merge-ort.c
index 8cfa0cc..5704326 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -1024,6 +1024,43 @@ static int collect_merge_info_callback(int n,
}
/*
+ * If the sides match, and all three paths are present and are
+ * files, then we can take either as the resolution. We can't do
+ * this with trees, because there may be rename sources from the
+ * merge_base.
+ */
+ if (sides_match && filemask == 0x07) {
+ /* use side1 (== side2) version as resolution */
+ setup_path_info(opt, &pi, dirname, info->pathlen, fullpath,
+ names, names+1, side1_null, 0,
+ filemask, dirmask, 1);
+ return mask;
+ }
+
+ /*
+ * If side1 matches mbase and all three paths are present and are
+ * files, then we can use side2 as the resolution. We cannot
+ * necessarily do so this for trees, because there may be rename
+ * destinations within side2.
+ */
+ if (side1_matches_mbase && filemask == 0x07) {
+ /* use side2 version as resolution */
+ setup_path_info(opt, &pi, dirname, info->pathlen, fullpath,
+ names, names+2, side2_null, 0,
+ filemask, dirmask, 1);
+ return mask;
+ }
+
+ /* Similar to above but swapping sides 1 and 2 */
+ if (side2_matches_mbase && filemask == 0x07) {
+ /* use side1 version as resolution */
+ setup_path_info(opt, &pi, dirname, info->pathlen, fullpath,
+ names, names+1, side1_null, 0,
+ filemask, dirmask, 1);
+ return mask;
+ }
+
+ /*
* Gather additional information used in rename detection.
*/
collect_rename_info(opt, names, dirname, fullpath,