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:
parent
049827d708
commit
12a5c8d413
|
@ -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));
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue