merge: do not override user modifications when resolving non-conflicting changes

This commit is contained in:
Aleksey Pivovarov
2017-03-06 16:50:40 +03:00
committed by Aleksey Pivovarov
parent e91402bb87
commit 533b211368
3 changed files with 102 additions and 2 deletions
@@ -878,7 +878,8 @@ public class TextMergeViewer implements MergeTool.MergeViewer {
}
else {
return !change.isResolved() &&
change.isChange(side);
change.isChange(side) &&
!isChangeRangeModified(change);
}
});
}
@@ -903,6 +904,7 @@ public class TextMergeViewer implements MergeTool.MergeViewer {
else {
if (change.isResolved(side)) return;
if (!change.isChange(side)) return;
if (isChangeRangeModified(change)) return;
Side masterSide = side.select(Side.LEFT,
change.isChange(Side.LEFT) ? Side.LEFT : Side.RIGHT,
Side.RIGHT);
@@ -1157,7 +1159,8 @@ public class TextMergeViewer implements MergeTool.MergeViewer {
return canResolveConflictedChange(change);
}
else {
return !change.isResolved();
return !change.isResolved() &&
!isChangeRangeModified(change);
}
}
@@ -386,6 +386,53 @@ class MergeTest : MergeTestBase() {
assertContent("y z_Y_y")
}
test1("y z", "x y z", "x y") {
assertTrue(0.canResolveConflict())
replaceText(2, 3, "U")
assertContent("x U z")
assertFalse(0.canResolveConflict())
}
test2("y z_Y_x y", "x y z_Y_x y z", "x y_Y_y z") {
assertTrue(0.canResolveConflict())
assertTrue(1.canResolveConflict())
replaceText(2, 3, "U")
assertFalse(0.canResolveConflict())
assertTrue(1.canResolveConflict())
assertContent("x U z_Y_x y z")
checkUndo(1) {
1.resolve()
}
1.assertResolved(BOTH)
1.assertContent("y")
assertFalse(0.canResolveConflict())
assertFalse(1.canResolveConflict())
assertContent("x U z_Y_y")
replaceText(2, 3, "y")
assertTrue(0.canResolveConflict())
assertFalse(1.canResolveConflict())
checkUndo(1) {
0.resolve()
}
assertFalse(0.canResolveConflict())
assertFalse(1.canResolveConflict())
assertContent("y_Y_y")
}
}
fun testUndoSimple() {
@@ -634,5 +681,50 @@ class MergeTest : MergeTestBase() {
delete modify
7 ======""".trimIndent())
}
testN(text1, text2, text3) {
replaceText(!5 - 0, !5 - 0, "USER ")
checkUndo(1) {
runApplyNonConflictsAction(ThreeSide.BASE)
}
assertChangesCount(2)
assertContent("""
1 ======
insert left
2 ======
3 ======
new both
4 ======
USER modify
5 ======
modify right
6 ======
delete modify
7 ======""".trimIndent())
}
testN(text1, text2, text3) {
replaceText(!7 - 0, !7 - 0, "USER ")
checkUndo(1) {
runApplyNonConflictsAction(ThreeSide.RIGHT)
}
assertChangesCount(3)
assertContent("""
1 ======
2 ======
3 ======
new both
4 ======
modify both
5 ======
USER modify
6 ======
delete modify
7 ======""".trimIndent())
}
}
}
@@ -169,6 +169,11 @@ abstract class MergeTestBase : DiffTestCase() {
}
}
fun Int.canResolveConflict(): Boolean {
val change = change(this)
return viewer.canResolveConflictedChange(change)
}
//
// Text modification
//