Browse Source

Merge "Optimize MergeAlgorithm if ours or theirs is empty"

stable-1.0
Robin Rosenberg 14 years ago committed by Code Review
parent
commit
d781554b79
  1. 20
      org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java
  2. 31
      org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java

20
org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java

@ -198,6 +198,25 @@ public class MergeAlgorithmTest {
} }
/**
* 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 class MergeAlgorithmTest {
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)));
} }
} }

31
org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeAlgorithm.java

@ -103,6 +103,37 @@ public final class MergeAlgorithm {
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…
Cancel
Save