[507050] Fix conflict merging when pre-merge is set to off

When conflicts occur in only some files of a logical model, differences
in non-conflicting files of the model will be lost when pre-merge is set
to off.

This is avoided by setting all files with differences to conflict when
pre-merge is set to off and they are part of a conflicting model.

Bug: 507050
Change-Id: I284a974a6c3a4991b37eca44f8cd9cd83b7b4ddc
Also-by: Philip Langer <planger@eclipsesource.com>
Also-by: Laurent Delaigue <laurent.delaigue@obeo.fr>
Signed-off-by: Laurent Delaigue <laurent.delaigue@obeo.fr>
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFResourceMappingMerger.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFResourceMappingMerger.java
index ecc128c..200551a 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFResourceMappingMerger.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFResourceMappingMerger.java
@@ -9,6 +9,7 @@
  *     Obeo - initial API and implementation
  *     Philip Langer - bugs 461713, 465331, 470268, 476363, 476417, 486940, refactorings
  *     Alexandra Buzila - bugs 470332, 478620
+ *     Stefan Dirix - bug 507050
  *******************************************************************************/
 package org.eclipse.emf.compare.ide.ui.internal.logical;
 
@@ -260,11 +261,17 @@
 				BasicMonitor.toMonitor(SubMonitor.convert(subMonitor.newChild(1), 10))); // 50%
 
 		if (hasRealConflict(comparison)) {
-			final Set<URI> conflictingURIs = performPreMerge(comparison, subMonitor.newChild(3)); // 80%
-			save(scope.getLeft(), syncModel.getLeftTraversal(), syncModel.getRightTraversal(),
-					syncModel.getOriginTraversal());
 			failingMappings.add(mapping);
-			markResourcesAsMerged(mergeContext, resources, conflictingURIs, subMonitor.newChild(2)); // 100%
+
+			final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore();
+			boolean preMerge = store.getBoolean(EMFCompareUIPreferences.PRE_MERGE_MODELS_WHEN_CONFLICT);
+
+			if (preMerge) {
+				final Set<URI> conflictingURIs = performPreMerge(comparison, subMonitor.newChild(3)); // 80%
+				save(scope.getLeft(), syncModel.getLeftTraversal(), syncModel.getRightTraversal(),
+						syncModel.getOriginTraversal());
+				markResourcesAsMerged(mergeContext, resources, conflictingURIs, subMonitor.newChild(2));
+			}
 		} else {
 			final ResourceAdditionAndDeletionTracker resourceTracker = new ResourceAdditionAndDeletionTracker();
 			try {
@@ -314,30 +321,22 @@
 	 * @return the set of the uri for resources on which conflicts were not auto-mergeable.
 	 */
 	private Set<URI> performPreMerge(Comparison comparison, SubMonitor subMonitor) {
-		final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore();
-		boolean preMerge = store.getBoolean(EMFCompareUIPreferences.PRE_MERGE_MODELS_WHEN_CONFLICT);
-		return performPreMerge(comparison, preMerge, subMonitor);
-	}
-
-	private Set<URI> performPreMerge(Comparison comparison, boolean preMerge, SubMonitor subMonitor) {
 		final Monitor emfMonitor = BasicMonitor.toMonitor(subMonitor);
 		final Set<URI> conflictingURIs = new LinkedHashSet<URI>();
 		for (Diff next : comparison.getDifferences()) {
-			doMergeForDiff(preMerge, emfMonitor, conflictingURIs, next);
+			doMergeForDiff(emfMonitor, conflictingURIs, next);
 		}
 		return conflictingURIs;
 	}
 
-	protected void doMergeForDiff(boolean preMerge, Monitor emfMonitor, Set<URI> conflictingURIs, Diff diff) {
+	protected void doMergeForDiff(Monitor emfMonitor, Set<URI> conflictingURIs, Diff diff) {
 		ComputeDiffsToMerge computer = new ComputeDiffsToMerge(true, MERGER_REGISTRY)
 				.failOnRealConflictUnless(alwaysFalse());
 		try {
 			Set<Diff> diffsToMerge = computer.getAllDiffsToMerge(diff);
-			if (preMerge) {
-				for (Diff toMerge : diffsToMerge) {
-					final IMerger merger = MERGER_REGISTRY.getHighestRankingMerger(toMerge);
-					merger.copyRightToLeft(toMerge, emfMonitor);
-				}
+			for (Diff toMerge : diffsToMerge) {
+				final IMerger merger = MERGER_REGISTRY.getHighestRankingMerger(toMerge);
+				merger.copyRightToLeft(toMerge, emfMonitor);
 			}
 		} catch (MergeBlockedByConflictException e) {
 			conflictingURIs.addAll(collectConflictingResources(e.getConflictingDiffs().iterator()));