diff options
author | Michael Valenta | 2005-12-16 17:33:59 +0000 |
---|---|---|
committer | Michael Valenta | 2005-12-16 17:33:59 +0000 |
commit | 9339e8d9764593dcf0673d8c79c27816827f36c2 (patch) | |
tree | 456f6d1974c22d140c2402042179d3920a6b2408 | |
parent | ca44b318013db6db91b5e19d4938989a8953589e (diff) | |
download | eclipse.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
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 |