From ef7b831411dafb302d15877fa60e2c4412f3ee17 Mon Sep 17 00:00:00 2001 From: Martin von Zweigbergk Date: Sun, 14 May 2023 22:24:06 -0700 Subject: [PATCH] merge: optimize 3-way merge case I haven't done any profiling to see if this is actually useful, but it's also pretty simple to do. --- lib/src/merge.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/src/merge.rs b/lib/src/merge.rs index a6838076c..b3418a95e 100644 --- a/lib/src/merge.rs +++ b/lib/src/merge.rs @@ -29,6 +29,19 @@ where "trivial_merge() requires exactly one more adds than removes" ); + // Optimize the common case of a 3-way merge + if adds.len() == 2 { + return if adds[0] == adds[1] { + Some(adds[0].clone()) + } else if adds[0] == removes[0] { + Some(adds[1].clone()) + } else if adds[1] == removes[0] { + Some(adds[0].clone()) + } else { + None + }; + } + // Check if all sides made the same change. // This matches what Git and Mercurial do (in the 3-way case at least), but not // what Darcs and Pijul do. It means that repeated 3-way merging of multiple