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"));
}
/**
* 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));

View File

@ -50,24 +50,24 @@
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());
}
/**