mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
merge: do not override user modifications when resolving non-conflicting changes
This commit is contained in:
committed by
Aleksey Pivovarov
parent
e91402bb87
commit
533b211368
@@ -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
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user