Merge "Optimize MergeAlgorithm if ours or theirs is empty"
This commit is contained in:
commit
d781554b79
|
@ -198,6 +198,25 @@ public void testTwoSimilarModsAndOneInsert() throws IOException {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test situations where (at least) one input value is the empty text
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testEmptyTexts() throws IOException {
|
||||||
|
// test modification against deletion
|
||||||
|
assertEquals(t("<AB=>"), merge("A", "AB", ""));
|
||||||
|
assertEquals(t("<=AB>"), merge("A", "", "AB"));
|
||||||
|
|
||||||
|
// test unmodified against deletion
|
||||||
|
assertEquals(t(""), merge("AB", "AB", ""));
|
||||||
|
assertEquals(t(""), merge("AB", "", "AB"));
|
||||||
|
|
||||||
|
// test deletion against deletion
|
||||||
|
assertEquals(t(""), merge("AB", "", ""));
|
||||||
|
}
|
||||||
|
|
||||||
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));
|
||||||
|
@ -231,5 +250,4 @@ public static String t(String text) {
|
||||||
public static RawText T(String text) {
|
public static RawText T(String text) {
|
||||||
return new RawText(Constants.encode(t(text)));
|
return new RawText(Constants.encode(t(text)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,37 @@ public <S extends Sequence> MergeResult<S> merge(
|
||||||
sequences.add(ours);
|
sequences.add(ours);
|
||||||
sequences.add(theirs);
|
sequences.add(theirs);
|
||||||
MergeResult<S> result = new MergeResult<S>(sequences);
|
MergeResult<S> result = new MergeResult<S>(sequences);
|
||||||
|
|
||||||
|
if (ours.size() == 0) {
|
||||||
|
if (theirs.size() != 0) {
|
||||||
|
EditList theirsEdits = diffAlg.diff(cmp, base, theirs);
|
||||||
|
if (!theirsEdits.isEmpty()) {
|
||||||
|
// we deleted, they modified -> Let their complete content
|
||||||
|
// conflict with empty text
|
||||||
|
result.add(1, 0, 0, ConflictState.FIRST_CONFLICTING_RANGE);
|
||||||
|
result.add(2, 0, theirs.size(),
|
||||||
|
ConflictState.NEXT_CONFLICTING_RANGE);
|
||||||
|
} else
|
||||||
|
// we deleted, they didn't modify -> Let our deletion win
|
||||||
|
result.add(1, 0, 0, ConflictState.NO_CONFLICT);
|
||||||
|
} else
|
||||||
|
// we and they deleted -> return a single chunk of nothing
|
||||||
|
result.add(1, 0, 0, ConflictState.NO_CONFLICT);
|
||||||
|
return result;
|
||||||
|
} else if (theirs.size() == 0) {
|
||||||
|
EditList oursEdits = diffAlg.diff(cmp, base, ours);
|
||||||
|
if (!oursEdits.isEmpty()) {
|
||||||
|
// we modified, they deleted -> Let our complete content
|
||||||
|
// conflict with empty text
|
||||||
|
result.add(1, 0, ours.size(),
|
||||||
|
ConflictState.FIRST_CONFLICTING_RANGE);
|
||||||
|
result.add(2, 0, 0, ConflictState.NEXT_CONFLICTING_RANGE);
|
||||||
|
} else
|
||||||
|
// they deleted, we didn't modify -> Let their deletion win
|
||||||
|
result.add(2, 0, 0, ConflictState.NO_CONFLICT);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
EditList oursEdits = diffAlg.diff(cmp, base, ours);
|
EditList oursEdits = diffAlg.diff(cmp, base, ours);
|
||||||
Iterator<Edit> baseToOurs = oursEdits.iterator();
|
Iterator<Edit> baseToOurs = oursEdits.iterator();
|
||||||
EditList theirsEdits = diffAlg.diff(cmp, base, theirs);
|
EditList theirsEdits = diffAlg.diff(cmp, base, theirs);
|
||||||
|
|
Loading…
Reference in New Issue