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 <christian.halstrick@sap.com>
Signed-off-by: Philipp Thun <philipp.thun@sap.com>
This commit is contained in:
Christian Halstrick 2010-11-26 00:44:05 +01:00
parent 049827d708
commit 12a5c8d413
2 changed files with 23 additions and 4 deletions

View File

@ -165,6 +165,25 @@ public void testSeperateModifications() throws IOException {
assertEquals(t("aZcYe"), merge("abcde", "aZcde", "abcYe")); 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 { private String merge(String commonBase, String ours, String theirs) throws IOException {
MergeResult r = new MergeAlgorithm().merge(RawTextComparator.DEFAULT, MergeResult r = new MergeAlgorithm().merge(RawTextComparator.DEFAULT,
T(commonBase), T(ours), T(theirs)); T(commonBase), T(ours), T(theirs));

View File

@ -50,24 +50,24 @@
import org.eclipse.jgit.diff.DiffAlgorithm; import org.eclipse.jgit.diff.DiffAlgorithm;
import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.diff.Edit;
import org.eclipse.jgit.diff.EditList; 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.Sequence;
import org.eclipse.jgit.diff.SequenceComparator; import org.eclipse.jgit.diff.SequenceComparator;
import org.eclipse.jgit.merge.MergeChunk.ConflictState; import org.eclipse.jgit.merge.MergeChunk.ConflictState;
/** /**
* Provides the merge algorithm which does a three-way merge on content provided * 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 { public final class MergeAlgorithm {
private final DiffAlgorithm diffAlg; 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 * algorithm
*/ */
public MergeAlgorithm() { public MergeAlgorithm() {
this(MyersDiff.INSTANCE); this(new HistogramDiff());
} }
/** /**