From 12a5c8d413baab3f27932a7c850dbfc0407ded78 Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Fri, 26 Nov 2010 00:44:05 +0100 Subject: [PATCH] Change default diff algorithm to histogram and add tests The referenced bug showed that JGit produced different merge results compared to C Git. Unit test was added to reproduce the issue. The problem can be solved by switching to histogram diff algorithm. Bug: 331078 Change-Id: I54f30afb3a9fef1dbca365ca5f98f4cc846092e3 Signed-off-by: Christian Halstrick Signed-off-by: Philipp Thun --- .../jgit/merge/MergeAlgorithmTest.java | 19 +++++++++++++++++++ .../eclipse/jgit/merge/MergeAlgorithm.java | 8 ++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java index b17c5278e..06d4c58e3 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java @@ -165,6 +165,25 @@ public class MergeAlgorithmTest extends TestCase { assertEquals(t("aZcYe"), merge("abcde", "aZcde", "abcYe")); } + /** + * Test merging two contents which do one similar modification and one + * insertion is only done by one side. Between modification and insertion is + * a block which is common between the two contents and the common base + * + * @throws IOException + */ + public void testTwoSimilarModsAndOneInsert() throws IOException { + assertEquals(t("IAAJ"), merge("iA", "IA", "IAAJ")); + assertEquals(t("aBcDde"), merge("abcde", "aBcde", "aBcDde")); + assertEquals(t("IAJ"), merge("iA", "IA", "IAJ")); + assertEquals(t("IAAAJ"), merge("iA", "IA", "IAAAJ")); + assertEquals(t("IAAAJCAB"), merge("iACAB", "IACAB", "IAAAJCAB")); + assertEquals(t("HIAAAJCAB"), merge("HiACAB", "HIACAB", "HIAAAJCAB")); + assertEquals(t("AGADEFHIAAAJCAB"), + merge("AGADEFHiACAB", "AGADEFHIACAB", "AGADEFHIAAAJCAB")); + + } + private String merge(String commonBase, String ours, String theirs) throws IOException { MergeResult r = new MergeAlgorithm().merge(RawTextComparator.DEFAULT, T(commonBase), T(ours), T(theirs)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java index 62febd62c..e6688f5bc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java @@ -50,24 +50,24 @@ import java.util.List; import org.eclipse.jgit.diff.DiffAlgorithm; import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.diff.EditList; -import org.eclipse.jgit.diff.MyersDiff; +import org.eclipse.jgit.diff.HistogramDiff; import org.eclipse.jgit.diff.Sequence; import org.eclipse.jgit.diff.SequenceComparator; import org.eclipse.jgit.merge.MergeChunk.ConflictState; /** * Provides the merge algorithm which does a three-way merge on content provided - * as RawText. By default {@link MyersDiff} is used as diff algorithm. + * as RawText. By default {@link HistogramDiff} is used as diff algorithm. */ public final class MergeAlgorithm { private final DiffAlgorithm diffAlg; /** - * Creates a new MergeAlgorithm which uses {@link MyersDiff} as diff + * Creates a new MergeAlgorithm which uses {@link HistogramDiff} as diff * algorithm */ public MergeAlgorithm() { - this(MyersDiff.INSTANCE); + this(new HistogramDiff()); } /**