Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ConflictMerger.java')
-rw-r--r--plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ConflictMerger.java49
1 files changed, 41 insertions, 8 deletions
diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ConflictMerger.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ConflictMerger.java
index 9ac9acea9..c2038e3de 100644
--- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ConflictMerger.java
+++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ConflictMerger.java
@@ -16,9 +16,10 @@ import static org.eclipse.emf.compare.DifferenceKind.MOVE;
import static org.eclipse.emf.compare.DifferenceSource.LEFT;
import static org.eclipse.emf.compare.DifferenceSource.RIGHT;
import static org.eclipse.emf.compare.DifferenceState.MERGED;
-import static org.eclipse.emf.compare.DifferenceState.UNRESOLVED;
+import static org.eclipse.emf.compare.merge.IMergeCriterion.NONE;
import java.util.Iterator;
+import java.util.Set;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.compare.Conflict;
@@ -45,7 +46,7 @@ public class ConflictMerger extends AbstractMerger {
@Override
public boolean apply(IMergeCriterion criterion) {
- return criterion == null;
+ return criterion == null || criterion == NONE;
}
/**
@@ -56,8 +57,7 @@ public class ConflictMerger extends AbstractMerger {
*/
@Override
public void copyLeftToRight(Diff target, Monitor monitor) {
- // Don't merge an already merged (or discarded) diff
- if (target.getState() != UNRESOLVED) {
+ if (isInTerminalState(target)) {
return;
}
@@ -88,8 +88,7 @@ public class ConflictMerger extends AbstractMerger {
*/
@Override
public void copyRightToLeft(Diff target, Monitor monitor) {
- // Don't merge an already merged (or discarded) diff
- if (target.getState() != UNRESOLVED) {
+ if (isInTerminalState(target)) {
return;
}
@@ -111,6 +110,40 @@ public class ConflictMerger extends AbstractMerger {
getMergerDelegate(target).copyRightToLeft(target, monitor);
}
+ @Override
+ public Set<Diff> getDirectMergeDependencies(Diff diff, boolean rightToLeft) {
+ Set<Diff> result = super.getDirectMergeDependencies(diff, rightToLeft);
+ // Add each conflicting diff from the other side
+ Conflict conflict = diff.getConflict();
+ if (AbstractMerger.isAccepting(diff, rightToLeft)) {
+ for (Diff conflictingDiff : conflict.getDifferences()) {
+ if (conflictingDiff.getSource() != diff.getSource()
+ && !isConflictVsMoveAndDelete(conflictingDiff, diff, !rightToLeft)
+ && conflictingDiff.getKind() != MOVE) {
+ result.add(conflictingDiff);
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public Set<Diff> getDirectResultingMerges(Diff diff, boolean rightToLeft) {
+ Set<Diff> result = super.getDirectResultingMerges(diff, rightToLeft);
+
+ Conflict conflict = diff.getConflict();
+ if (AbstractMerger.isAccepting(diff, rightToLeft)) {
+ for (Diff conflictingDiff : conflict.getDifferences()) {
+ if (conflictingDiff.getSource() != diff.getSource()
+ && (isConflictVsMoveAndDelete(conflictingDiff, diff, !rightToLeft)
+ || conflictingDiff.getKind() != MOVE)) {
+ result.add(conflictingDiff);
+ }
+ }
+ }
+ return result;
+ }
+
/**
* Detect if the two given diff are diffs on the same object with one move and one delete. The move diff
* must be the one selected by the user for merging.
@@ -166,8 +199,8 @@ public class ConflictMerger extends AbstractMerger {
@Override
protected DelegatingMerger getMergerDelegate(Diff diff) {
- IMergeCriterion criterion = (IMergeCriterion)getMergeOptions().get(
- IMergeCriterion.OPTION_MERGE_CRITERION);
+ IMergeCriterion criterion = (IMergeCriterion)getMergeOptions()
+ .get(IMergeCriterion.OPTION_MERGE_CRITERION);
Iterator<IMerger> it = ((Registry2)getRegistry()).getMergersByRankDescending(diff, criterion);
IMerger merger = this;
while (it.hasNext() && merger == this) {

Back to the top