Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2005-12-16 17:33:59 +0000
committerMichael Valenta2005-12-16 17:33:59 +0000
commit9339e8d9764593dcf0673d8c79c27816827f36c2 (patch)
tree456f6d1974c22d140c2402042179d3920a6b2408
parentca44b318013db6db91b5e19d4938989a8953589e (diff)
downloadeclipse.platform.team-9339e8d9764593dcf0673d8c79c27816827f36c2.tar.gz
eclipse.platform.team-9339e8d9764593dcf0673d8c79c27816827f36c2.tar.xz
eclipse.platform.team-9339e8d9764593dcf0673d8c79c27816827f36c2.zip
Bug 118225 [Merge API] Model mergers with additional UI
-rw-r--r--bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/IResourceMappingMerger.java28
-rw-r--r--bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ResourceMappingMerger.java8
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java2
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java13
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java30
5 files changed, 74 insertions, 7 deletions
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/IResourceMappingMerger.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/IResourceMappingMerger.java
index 7546bc60a..0b3e8067d 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/IResourceMappingMerger.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/IResourceMappingMerger.java
@@ -78,7 +78,6 @@ public interface IResourceMappingMerger {
* decide whether it wants to break one of the provided resource mappings
* into several sub-mappings and attempt auto-merging at that level.
*
- * @param mappings the set of resource mappings being merged
* @param mergeContext a context that provides access to the resources
* involved in the merge. The context must not be
* <code>null</code>.
@@ -92,5 +91,32 @@ public interface IResourceMappingMerger {
*/
public IStatus merge(IMergeContext mergeContext,
IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * Validate an auto-merge for the given context. This
+ * method must be invoked for all mergers involved
+ * in the merge before the auto-merge is attempted.
+ * The purpose of the validation is to indicate whether there
+ * are conditions in the merge context that make an auto-merge
+ * undesirable. The purpose is not to indicate that conflicts
+ * exist (this is done by the <code>merge</code> method) but instead
+ * to indicate that the nature of one of more incoming changes
+ * is such that performing an auto-merge may be undesirable.
+ * <p>
+ * Clients should validate before performing the merge and, if
+ * any of the returned status are not OK, should prompt the
+ * user to make them aware of the potential side effects.
+ * The user may still decide to attempt an auto-merge, in which case
+ * the client may still invoke the <code>merge</code> method.
+ *
+ * @param mergeContext a context that provides access to the resources
+ * involved in the merge. The context must not be
+ * <code>null</code>.
+ * @param monitor a progress monitor
+ * @return a status indicating any potential side effects of
+ * performing an auto-merge.
+ */
+ public IStatus validateMerge(IMergeContext mergeContext,
+ IProgressMonitor monitor);
}
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ResourceMappingMerger.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ResourceMappingMerger.java
index f59b97135..050ac894e 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ResourceMappingMerger.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ResourceMappingMerger.java
@@ -10,6 +10,8 @@
*******************************************************************************/
package org.eclipse.team.core.mapping;
+import org.eclipse.core.runtime.*;
+
/**
* Abstract implementation of {@link IResourceMappingMerger}.
@@ -30,4 +32,10 @@ package org.eclipse.team.core.mapping;
*/
public abstract class ResourceMappingMerger implements IResourceMappingMerger {
+ /* (non-Javadoc)
+ * @see org.eclipse.team.core.mapping.IResourceMappingMerger#validateMerge(org.eclipse.team.core.mapping.IMergeContext, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public IStatus validateMerge(IMergeContext mergeContext, IProgressMonitor monitor) {
+ return Status.OK_STATUS;
+ }
}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java
index f2554859d..ea0ef6663 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DefaultResourceMappingMerger.java
@@ -25,7 +25,7 @@ import org.eclipse.team.internal.ui.Policy;
* This is registered against ModelProvider so any model providers that
* don't provide a custom merger will get this one.
*/
-public class DefaultResourceMappingMerger implements IResourceMappingMerger {
+public class DefaultResourceMappingMerger extends ResourceMappingMerger {
private final ModelProvider provider;
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java
index 761af447e..3879fb3b0 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java
@@ -125,6 +125,19 @@ public abstract class ModelProviderOperation extends TeamOperation {
}
/**
+ * Validate the merge by obtaining the {@link IResourceMappingMerger} for the
+ * given provider.
+ * @param provider the model provider
+ * @param context the merge context
+ * @param monitor a progress monitor
+ * @return the status obtained from the merger for the provider
+ */
+ protected IStatus validateMerge(ModelProvider provider, IMergeContext context, IProgressMonitor monitor) {
+ IResourceMappingMerger merger = getMerger(provider);
+ return merger.validateMerge(context, monitor);
+ }
+
+ /**
* Return the auto-merger associated with the given model provider
* view the adaptable mechanism.
* If the model provider does not have a merger associated with
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java
index f2de70f60..e578fbcc1 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java
@@ -16,8 +16,7 @@ import java.util.List;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.core.resources.mapping.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.*;
@@ -120,10 +119,14 @@ public abstract class ResourceMappingMergeOperation extends ResourceMappingOpera
return;
}
if (isAttemptHeadlessMerge()) {
- execute(context, Policy.subMonitorFor(monitor, 25));
- } else {
- showPreview(getJobName(), monitor);
+ IStatus status = validateMerge(context,Policy.subMonitorFor(monitor, 5));
+ if (status.isOK()) {
+ // The execute will prompt if there are conflicts
+ execute(context, Policy.subMonitorFor(monitor, 20));
+ return;
+ }
}
+ showPreview(getJobName(), Policy.subMonitorFor(monitor, 25));
} catch (CoreException e) {
throw new InvocationTargetException(e);
} finally {
@@ -131,6 +134,23 @@ public abstract class ResourceMappingMergeOperation extends ResourceMappingOpera
}
}
+ private IStatus validateMerge(IMergeContext context, IProgressMonitor monitor) {
+ ModelProvider[] providers = getScope().getModelProviders();
+ monitor.beginTask(null, 100 * providers.length);
+ List notOK = new ArrayList();
+ for (int i = 0; i < providers.length; i++) {
+ ModelProvider provider = providers[i];
+ IStatus status = validateMerge(provider, context, Policy.subMonitorFor(monitor, 100));
+ if (!status.isOK())
+ notOK.add(status);
+ }
+ if (notOK.isEmpty())
+ return Status.OK_STATUS;
+ if (notOK.size() == 1)
+ return (IStatus)notOK.get(0);
+ return new MultiStatus(TeamUIPlugin.ID, 0, (IStatus[]) notOK.toArray(new IStatus[notOK.size()]), "", null);
+ }
+
/**
* Return whether a headless merge should be attempted without showing a preview to
* the user. If the merge succeeds, the operations finishes. However, if conflicts

Back to the top