From 8c17a082000e26a329e7c2fe78764a47d2df0a05 Mon Sep 17 00:00:00 2001 From: Jean Michel-Lemieux Date: Wed, 24 Sep 2003 16:55:00 +0000 Subject: *** empty log message *** --- bundles/org.eclipse.team.cvs.ui/.classpath | 4 +- bundles/org.eclipse.team.cvs.ui/plugin.properties | 2 +- bundles/org.eclipse.team.cvs.ui/plugin.xml | 2 +- .../team/internal/ccvs/ui/AnnotateView.java | 14 +- .../ccvs/ui/CVSAbstractResolutionGenerator.java | 70 ----- .../ccvs/ui/CVSAddResolutionGenerator.java | 134 ---------- .../internal/ccvs/ui/CVSLightweightDecorator.java | 5 +- .../eclipse/team/internal/ccvs/ui/CVSUIPlugin.java | 13 +- .../internal/ccvs/ui/HistoryTableProvider.java | 4 + .../eclipse/team/internal/ccvs/ui/HistoryView.java | 229 ++++++++++++++--- .../team/internal/ccvs/ui/ICVSUIConstants.java | 11 +- .../eclipse/team/internal/ccvs/ui/OverlayIcon.java | 80 ------ .../team/internal/ccvs/ui/OverlayIconCache.java | 1 + .../internal/ccvs/ui/RemoteFileEditorInput.java | 9 + .../ccvs/ui/RemoteRevisionQuickDiffProvider.java | 286 ++++++++++++++------- .../team/internal/ccvs/ui/TagAsVersionDialog.java | 2 +- .../ccvs/ui/WorkInProgressPreferencePage.java | 11 +- .../ccvs/ui/actions/AddToWorkspaceAction.java | 2 +- .../internal/ccvs/ui/actions/CheckoutAsAction.java | 3 +- .../internal/ccvs/ui/actions/CommitAction.java | 2 +- .../ui/actions/RestoreFromRepositoryAction.java | 2 +- .../ccvs/ui/actions/ShowAnnotationAction.java | 2 +- .../team/internal/ccvs/ui/actions/TagAction.java | 2 +- .../team/internal/ccvs/ui/merge/MergeWizard.java | 44 +--- .../team/internal/ccvs/ui/messages.properties | 40 +-- .../ccvs/ui/model/BatchSimilarSchedulingRule.java | 33 --- .../team/internal/ccvs/ui/model/CVSTagElement.java | 41 ++- .../ccvs/ui/model/RemoteContentProvider.java | 32 ++- .../ccvs/ui/model/RemoteFolderElement.java | 36 ++- .../team/internal/ccvs/ui/model/RemoteModule.java | 4 +- .../internal/ccvs/ui/model/VersionCategory.java | 4 +- .../internal/ccvs/ui/operations/CVSOperation.java | 246 +++++++----------- .../ui/operations/CVSWorkspaceModifyOperation.java | 43 ---- .../ccvs/ui/operations/CheckoutIntoOperation.java | 57 ++-- .../CheckoutMultipleProjectsOperation.java | 17 +- .../ccvs/ui/operations/CheckoutOperation.java | 27 +- .../ui/operations/CheckoutProjectOperation.java | 224 ++++++++-------- .../operations/CheckoutSingleProjectOperation.java | 30 +-- .../ui/operations/HasProjectMetaFileOperation.java | 19 +- .../ui/operations/RepositoryProviderOperation.java | 10 +- .../ccvs/ui/operations/SingleCommandOperation.java | 11 +- .../ui/operations/TagInRepositoryOperation.java | 2 +- .../internal/ccvs/ui/operations/TagOperation.java | 4 +- .../ui/operations/UpdateOnlyMergableOperation.java | 2 +- .../ccvs/ui/repo/CVSRepositoryPropertiesPage.java | 270 +++++++++++-------- .../team/internal/ccvs/ui/repo/RemoteViewPart.java | 2 +- .../internal/ccvs/ui/repo/RemoveRootAction.java | 18 +- .../internal/ccvs/ui/repo/RepositoriesView.java | 2 +- .../ui/repo/RepositoriesViewContentHandler.java | 8 +- .../internal/ccvs/ui/repo/RepositoryManager.java | 7 +- .../team/internal/ccvs/ui/repo/RepositoryRoot.java | 13 +- .../ccvs/ui/subscriber/CVSSubscriberAction.java | 65 ++++- .../ccvs/ui/subscriber/MergeUpdateAction.java | 27 +- .../ccvs/ui/subscriber/SafeUpdateAction.java | 8 + .../ccvs/ui/subscriber/SubscriberCommitAction.java | 18 +- .../subscriber/SubscriberConfirmMergedAction.java | 5 + .../internal/ccvs/ui/subscriber/UpdateDialog.java | 2 +- .../ccvs/ui/sync/CVSCatchupReleaseViewer.java | 2 +- .../wizards/CheckoutAsLocationSelectionPage.java | 4 +- .../ccvs/ui/wizards/CheckoutAsMainPage.java | 4 +- .../ui/wizards/CheckoutAsProjectSelectionPage.java | 8 +- .../ccvs/ui/wizards/RepositorySelectionPage.java | 1 + .../internal/ccvs/ui/wizards/SharingWizard.java | 3 +- 63 files changed, 1193 insertions(+), 1090 deletions(-) delete mode 100644 bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSAbstractResolutionGenerator.java delete mode 100644 bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSAddResolutionGenerator.java delete mode 100644 bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/OverlayIcon.java delete mode 100644 bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/BatchSimilarSchedulingRule.java delete mode 100644 bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CVSWorkspaceModifyOperation.java diff --git a/bundles/org.eclipse.team.cvs.ui/.classpath b/bundles/org.eclipse.team.cvs.ui/.classpath index 07afd19ec..f47576389 100644 --- a/bundles/org.eclipse.team.cvs.ui/.classpath +++ b/bundles/org.eclipse.team.cvs.ui/.classpath @@ -1,15 +1,15 @@ - + + - diff --git a/bundles/org.eclipse.team.cvs.ui/plugin.properties b/bundles/org.eclipse.team.cvs.ui/plugin.properties index b23ea563d..d471dc353 100644 --- a/bundles/org.eclipse.team.cvs.ui/plugin.properties +++ b/bundles/org.eclipse.team.cvs.ui/plugin.properties @@ -188,4 +188,4 @@ CVSWorkspaceSubscriber.merge.label=&Update CVSWorkspaceSubscriber.merge.tooltip=Perform an update merge on the visible resources WorkInProgress.name=Work In Progress -CVSRemoteQuickDiffProvider=CVS Remote Revision \ No newline at end of file +CVSRemoteQuickDiffProvider.label=Latest CVS Revision \ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.ui/plugin.xml b/bundles/org.eclipse.team.cvs.ui/plugin.xml index ecb437886..e4d6a5a6b 100644 --- a/bundles/org.eclipse.team.cvs.ui/plugin.xml +++ b/bundles/org.eclipse.team.cvs.ui/plugin.xml @@ -885,7 +885,7 @@ + point="org.eclipse.ui.workbench.texteditor.quickDiffReferenceProvider"> null (in which case, code executed + * by the operation can attempt to obtain any scheduling rules they like but may be + * blocked by other jobs at that point) or a rule (e.g. IResource) that encompasses + * all scheduling rules used by code nested in the operation (in which case the + * operation wil not start until the encompassing rule is free but once the + * operation starts, nested rules will not block on any subsequent contained + * scheduling rules). By default, null is returned. + * @return */ - public final void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - run(monitor, isModifiesWorkspace()); + protected ISchedulingRule getSchedulingRule() { + return null; } - + + /** + * Return whether the auto-build should be postponed whil ethe operation is running. + * The default is to postone a build. + * @return + */ + protected boolean getPostponeBuild() { + return true; + } + /* (non-Javadoc) * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor) */ - private void run(IProgressMonitor monitor, boolean wrapInModifiyOperation) throws InvocationTargetException, InterruptedException { + public final void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { startOperation(); try { - if (wrapInModifiyOperation) { - new CVSWorkspaceModifyOperation(this).run(monitor); - } else { - execute(monitor); - } + execute(monitor); endOperation(); } catch (CVSException e) { - // TODO: errors may not be empty + // TODO: errors may not be empty (i.e. endOperation has not been executed) throw new InvocationTargetException(e); } } @@ -202,67 +144,42 @@ public abstract class CVSOperation implements IRunnableWithProgress { } /** - * Subclasses must override to perform the operation + * Subclasses must override this method to perform the operation. + * Clients should never call this method directly. + * * @param monitor * @throws CVSException * @throws InterruptedException */ - public abstract void execute(IProgressMonitor monitor) throws CVSException, InterruptedException; + protected abstract void execute(IProgressMonitor monitor) throws CVSException, InterruptedException; - /** - * @return + /* + * Return the ICVSRunnableContext which will be used to run the operation. */ - private IRunnableContext getRunnableContext() { - if (runnableContext == null) { - return PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + private ICVSRunnableContext getCVSRunnableContext() { + if (cvsRunnableContext == null) { + if (canRunAsJob() && areJobsEnabled()) { + return new CVSNonblockingRunnableContext(); + } else { + return new CVSBlockingRunnableContext(shell); + } } - return runnableContext; + return cvsRunnableContext; } - + /** - * @param context + * Set the CVS runnable context to be used by the operation. + * Although this method can be used by clients, it's main + * purpose is to support the running of headless operations + * for testing purposes. + * @param cvsRunnableContext */ - public void setRunnableContext(IRunnableContext context) { - this.runnableContext = context; - } - - public boolean hasRunnableContext() { - return runnableContext != null; + public void setCVSRunnableContext(ICVSRunnableContext cvsRunnableContext) { + this.cvsRunnableContext = cvsRunnableContext; } public Shell getShell() { - if (isRunningAsJob()) { - // We can't use the assigned shell as it may have been disposed - // run in syncExec because callback is from an operation, - // which is probably not running in the UI thread. - final Shell[] newShell = new Shell[] { null }; - Display.getDefault().syncExec( - new Runnable() { - public void run() { - IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); - if (window == null) { - Display display = Display.getDefault(); - newShell[0] = new Shell(display); - } else { - newShell[0] = window.getShell(); - } - } - }); - return newShell[0]; - } - return shell; - } - - public void setShell(Shell shell) { - this.shell = shell; - } - - public boolean isInterruptable() { - return interruptable; - } - - public void setInterruptable(boolean b) { - interruptable = b; + return getCVSRunnableContext().getShell(); } public boolean isModifiesWorkspace() { @@ -275,16 +192,39 @@ public abstract class CVSOperation implements IRunnableWithProgress { protected void addError(IStatus status) { if (status.isOK()) return; + if (isLastError(status)) return; errors.add(status); } - + protected void collectStatus(IStatus status) { + if (isLastError(status)) return; statusCount++; if (!status.isOK()) addError(status); } protected void resetErrors() { errors.clear(); + statusCount = 0; + } + + /** + * Get the last error taht occured. This can be useful when a method + * has a return type but wants to signal an error. The method in question + * can add the error using addError(IStatus) and return null. + * The caller can then query the error using this method. Also, addError(IStatus) + * will not add the error if it is already on the end of the list (using identity comparison) + * which allows the caller to still perform a collectStatus(IStatus) + * to get a valid operation count. + * @return + */ + protected IStatus getLastError() { + Assert.isTrue(errors.size() > 0); + IStatus status = (IStatus)errors.get(errors.size() - 1); + return status; + } + + private boolean isLastError(IStatus status) { + return (errors.size() > 0 && getLastError() == status); } protected void handleErrors(IStatus[] errors) throws CVSException { @@ -306,7 +246,7 @@ public abstract class CVSOperation implements IRunnableWithProgress { } protected String getErrorMessage(IStatus[] failures, int totalOperations) { - return "Errors occured in " + failures.length + " of " + totalOperations + " operations."; + return Policy.bind("CVSOperation.0", String.valueOf(failures.length), String.valueOf(totalOperations)); //$NON-NLS-1$ } /** @@ -380,9 +320,5 @@ public abstract class CVSOperation implements IRunnableWithProgress { * @return */ protected abstract String getTaskName(); - - protected boolean isRunningAsJob() { - return runningAsJob; - } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CVSWorkspaceModifyOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CVSWorkspaceModifyOperation.java deleted file mode 100644 index df4b79483..000000000 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CVSWorkspaceModifyOperation.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.team.internal.ccvs.ui.operations; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.team.internal.ccvs.core.CVSException; -import org.eclipse.ui.actions.WorkspaceModifyOperation; - -/** - * This class wraps a CVSOperation in a workspace modify operation. - * - */ -public class CVSWorkspaceModifyOperation extends WorkspaceModifyOperation { - - private CVSOperation operation; - - public CVSWorkspaceModifyOperation(CVSOperation operation) { - super(); - this.operation = operation; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor) - */ - synchronized protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException { - try { - operation.execute(monitor); - } catch (CVSException e) { - throw new InvocationTargetException(e); - } - } -} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutIntoOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutIntoOperation.java index 0bac821b6..27d518c72 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutIntoOperation.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutIntoOperation.java @@ -22,6 +22,8 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.swt.widgets.Shell; import org.eclipse.team.core.RepositoryProvider; import org.eclipse.team.core.TeamException; @@ -105,19 +107,28 @@ public class CheckoutIntoOperation extends CheckoutOperation { return recursive; } + /* (non-Javadoc) + * @see org.eclipse.team.internal.ccvs.ui.operations.CheckoutOperation#checkout(org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder, org.eclipse.core.runtime.IProgressMonitor) + */ + protected IStatus checkout(ICVSRemoteFolder folder, IProgressMonitor monitor) throws CVSException { + return checkout(folder, getLocalFolder(), isRecursive(), monitor); + } + /* (non-Javadoc) * @see org.eclipse.team.internal.ccvs.ui.operations.CheckoutOperation#checkout(org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder[], org.eclipse.core.runtime.IProgressMonitor) */ protected void checkout(ICVSRemoteFolder[] folders, IProgressMonitor monitor) throws CVSException { - ICVSFolder parentLocalFolder = getLocalFolder(); - boolean recurse = isRecursive(); - monitor.beginTask(null, 100 * folders.length + 100); - for (int i = 0; i < folders.length; i++) { - ICVSRemoteFolder folder = folders[i]; - checkout(folders[i], parentLocalFolder, recurse, Policy.subMonitorFor(monitor, 100)); + monitor.beginTask(null, 100); + ISchedulingRule rule = getSchedulingRule(); + try { + // Obtain a scheduling rule on the projects were about to overwrite + Platform.getJobManager().beginRule(rule); + super.checkout(folders, Policy.subMonitorFor(monitor, 90)); + refreshRoot(getLocalRoot(getLocalFolder()), Policy.subMonitorFor(monitor, 10)); + } finally { + Platform.getJobManager().endRule(rule); + monitor.done(); } - refreshRoot(getLocalRoot(parentLocalFolder), Policy.subMonitorFor(monitor, 100)); - monitor.done(); } /* @@ -311,18 +322,19 @@ public class CheckoutIntoOperation extends CheckoutOperation { return OK; } - private void checkout(final ICVSRemoteFolder remoteFolder, ICVSFolder parentFolder, boolean recurse, IProgressMonitor monitor) throws CVSException { + private IStatus checkout(final ICVSRemoteFolder remoteFolder, ICVSFolder parentFolder, boolean recurse, IProgressMonitor monitor) throws CVSException { // Open a connection session to the repository + monitor.beginTask(null, 100); ICVSRepositoryLocation repository = remoteFolder.getRepository(); Session session = new Session(repository, parentFolder); try { - session.open(Policy.subMonitorFor(monitor, 10)); + session.open(Policy.subMonitorFor(monitor, 5), false /* read-only */); // Determine which local folders will be affected - ICVSFolder[] targetFolders = prepareLocalFolders(session, remoteFolder, parentFolder, localFolderName, Policy.subMonitorFor(monitor, 10)); + ICVSFolder[] targetFolders = prepareLocalFolders(session, remoteFolder, parentFolder, localFolderName, Policy.subMonitorFor(monitor, 5)); if (targetFolders == null) { // an error occured and has been added to the operation's error list - return; + return getLastError(); } // Add recurse option @@ -350,14 +362,15 @@ public class CheckoutIntoOperation extends CheckoutOperation { (LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]), new String[] { remoteFolder.getRepositoryRelativePath() }, null, - Policy.subMonitorFor(monitor, 10)); + Policy.subMonitorFor(monitor, 80)); if (!status.isOK()) { - addError(status); - return; + return status; } manageFolders(targetFolders, repository.getLocation()); + return OK; + } finally { session.close(); } @@ -406,4 +419,18 @@ public class CheckoutIntoOperation extends CheckoutOperation { public String getName() { return getTaskName(); } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#getSchedulingRule() + */ + protected ISchedulingRule getSchedulingRule() { + try { + // Use the project of the target folder as the scheduling rule + return getLocalFolder().getIResource().getProject(); + } catch (CVSException e) { + CVSUIPlugin.log(e); + return null; + } + } + } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutMultipleProjectsOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutMultipleProjectsOperation.java index 3cab1de2f..b840b1017 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutMultipleProjectsOperation.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutMultipleProjectsOperation.java @@ -12,9 +12,11 @@ package org.eclipse.team.internal.ccvs.ui.operations; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.widgets.Shell; +import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder; -import org.eclipse.team.internal.ccvs.ui.Policy; /** * This operation checks out a multiple remote folders into the workspace. @@ -42,17 +44,12 @@ public class CheckoutMultipleProjectsOperation extends CheckoutProjectOperation if (targetLocation == null) return null; return targetLocation.append(project.getName()); } - - protected String getTaskName() { - ICVSRemoteFolder[] remoteFolders = getRemoteFolders(); - return Policy.bind("CheckoutMultipleProjectsOperation.taskName", new Integer(remoteFolders.length).toString()); //$NON-NLS-1$ - } - + /* (non-Javadoc) - * @see org.eclipse.team.internal.ccvs.ui.operations.CheckoutProjectOperation#getTargetProjects(org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder[]) + * @see org.eclipse.team.internal.ccvs.ui.operations.CheckoutOperation#checkout(org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder, org.eclipse.core.runtime.IProgressMonitor) */ - protected IProject[] getTargetProjects(ICVSRemoteFolder[] folders) { - return null; + protected IStatus checkout(ICVSRemoteFolder folder, IProgressMonitor monitor) throws CVSException { + return checkout(folder, null, monitor); } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutOperation.java index fc27bd4d6..3b19f2c25 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutOperation.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutOperation.java @@ -11,6 +11,7 @@ package org.eclipse.team.internal.ccvs.ui.operations; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.widgets.Shell; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder; @@ -26,9 +27,27 @@ public abstract class CheckoutOperation extends RemoteOperation { * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#execute(org.eclipse.core.runtime.IProgressMonitor) */ public void execute(IProgressMonitor monitor) throws CVSException, InterruptedException { - String taskName = getTaskName(); - monitor.beginTask(taskName, 100); - checkout(getRemoteFolders(), Policy.subMonitorFor(monitor, 100)); + ICVSRemoteFolder[] folders = getRemoteFolders(); + checkout(folders, monitor); + } + + /** + * This method invokes checkout(ICVSRemoteFolder, IProgressMonitor) + * for each remote folder of the operation. + * @param folders the remote folders for the operation + * @param monitor the progress monitor + * @throws CVSException if an error occured that should prevent the remaining + * folders from being checked out + */ + protected void checkout(ICVSRemoteFolder[] folders, IProgressMonitor monitor) throws CVSException { + monitor.beginTask(null, folders.length * 100); + for (int i = 0; i < folders.length; i++) { + ICVSRemoteFolder folder = folders[i]; + IStatus result = checkout(folder, Policy.subMonitorFor(monitor, 100)); + collectStatus(result); + Policy.checkCanceled(monitor); + } + monitor.done(); } protected ICVSRemoteFolder[] getRemoteFolders() { @@ -40,7 +59,7 @@ public abstract class CheckoutOperation extends RemoteOperation { * @param folders * @param monitor */ - protected abstract void checkout(ICVSRemoteFolder[] folders, IProgressMonitor monitor) throws CVSException; + protected abstract IStatus checkout(ICVSRemoteFolder folder, IProgressMonitor monitor) throws CVSException; /* (non-Javadoc) * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#canRunAsJob() diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutProjectOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutProjectOperation.java index 4724af822..3d2c3a986 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutProjectOperation.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutProjectOperation.java @@ -26,6 +26,9 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.MultiRule; import org.eclipse.swt.widgets.Shell; import org.eclipse.team.core.RepositoryProvider; import org.eclipse.team.core.TeamException; @@ -37,7 +40,6 @@ import org.eclipse.team.internal.ccvs.core.CVSTeamProvider; import org.eclipse.team.internal.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder; import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; -import org.eclipse.team.internal.ccvs.core.ICVSRunnable; import org.eclipse.team.internal.ccvs.core.client.Checkout; import org.eclipse.team.internal.ccvs.core.client.Command; import org.eclipse.team.internal.ccvs.core.client.Request; @@ -46,7 +48,6 @@ import org.eclipse.team.internal.ccvs.core.client.Update; import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.ui.Policy; - /** * This class acts as an abstract class for checkout operations. * It provides a few common methods. @@ -63,27 +64,6 @@ public abstract class CheckoutProjectOperation extends CheckoutOperation { super(shell, remoteFolders); this.targetLocation = targetLocation; } - - /* (non-Javadoc) - * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#execute(org.eclipse.core.runtime.IProgressMonitor) - */ - public void runInContext(IProgressMonitor monitor) throws CVSException, InterruptedException { - String taskName = getTaskName(); - monitor.beginTask(taskName, 100); - monitor.setTaskName(taskName); - checkout(getRemoteFolders(), getTargetProjects(getRemoteFolders()), Policy.subMonitorFor(monitor, 100)); - } - - /** - * @return - */ - protected IProject[] getTargetProjects(ICVSRemoteFolder[] folders) { - IProject[] projects = new IProject[folders.length]; - for (int i = 0; i < projects.length; i++) { - projects[i] = ResourcesPlugin.getWorkspace().getRoot().getProject(folders[i].getName()); - } - return projects; - } /** * Create and open the project, using a custom location if there is one. @@ -137,32 +117,6 @@ public abstract class CheckoutProjectOperation extends CheckoutOperation { if (targetLocation == null) return null; return new Path(targetLocation); } - - /** - * Checkout the remote resources into the local workspace. Each resource will - * be checked out into the corresponding project. If the corresponding project is - * null or if projects is null, the name of the remote resource is used as the name of the project. - * - * Resources existing in the local file system at the target project location but now - * known to the workbench will be overwritten. - */ - protected void checkout(ICVSRemoteFolder[] resources, IProject[] projects, IProgressMonitor pm) throws CVSException { - try { - pm.beginTask(null, 1000 * resources.length); - for (int i=0;i 0 && currentSubcriber != null) { + ((CVSMergeSubscriber)currentSubcriber).merged(resources); + } } /* (non-Javadoc) @@ -93,12 +96,13 @@ public class MergeUpdateAction extends SafeUpdateAction { */ protected void runSafeUpdate(SyncInfo[] nodes, IProgressMonitor monitor) throws TeamException { if(nodes.length > 0) { - TeamSubscriber subscriber = nodes[0].getSubscriber(); - if (!(subscriber instanceof CVSMergeSubscriber)) { - throw new CVSException("Invalid subscriber: " + subscriber.getId()); + // Assumption that all nodes are from the same subscriber. + currentSubcriber = nodes[0].getSubscriber(); + if (!(currentSubcriber instanceof CVSMergeSubscriber)) { + throw new CVSException(Policy.bind("MergeUpdateAction.invalidSubscriber", currentSubcriber.getId().toString())); //$NON-NLS-1$ } - CVSTag startTag = ((CVSMergeSubscriber)subscriber).getStartTag(); - CVSTag endTag = ((CVSMergeSubscriber)subscriber).getEndTag(); + CVSTag startTag = ((CVSMergeSubscriber)currentSubcriber).getStartTag(); + CVSTag endTag = ((CVSMergeSubscriber)currentSubcriber).getEndTag(); // Incoming additions require different handling then incoming changes and deletions List additions = new ArrayList(); @@ -206,4 +210,11 @@ public class MergeUpdateAction extends SafeUpdateAction { cvsFolder.mkdir(); } } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ccvs.ui.subscriber.CVSSubscriberAction#getJobName(org.eclipse.team.ui.sync.SyncInfoSet) + */ + protected String getJobName(SyncInfoSet syncSet) { + return Policy.bind("MergeUpdateAction.jobName", new Integer(syncSet.size()).toString()); //$NON-NLS-1$ + } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SafeUpdateAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SafeUpdateAction.java index 02b747705..eea80dc1a 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SafeUpdateAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SafeUpdateAction.java @@ -333,4 +333,12 @@ public abstract class SafeUpdateAction extends CVSSubscriberAction { protected String getErrorTitle() { return Policy.bind("UpdateAction.update"); //$NON-NLS-1$ } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ccvs.ui.subscriber.CVSSubscriberAction#getJobName(org.eclipse.team.ui.sync.SyncInfoSet) + */ + protected String getJobName(SyncInfoSet syncSet) { + return Policy.bind("UpdateAction.jobName", new Integer(syncSet.size()).toString()); //$NON-NLS-1$ + } + } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java index 344eeb4a9..ac6484938 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java @@ -103,12 +103,8 @@ public class SubscriberCommitAction extends CVSSubscriberAction { return true; } - /** - * @param syncSet - * @return - */ private IResource[] getUnaddedResources(SyncInfoSet syncSet) throws CVSException { - // TODO: should only get outgoing additions (since conflicting additions + // TODO: Should only get outgoing additions (since conflicting additions // could be considered to be under version control already) IResource[] resources = syncSet.getResources(); List result = new ArrayList(); @@ -200,7 +196,6 @@ public class SubscriberCommitAction extends CVSSubscriberAction { } break; case SyncInfo.CONFLICTING: - // TODO: what about conflicting deletions // Convert the conflicting change to an outgoing change makeOutgoing.add(changedNode); break; @@ -228,9 +223,6 @@ public class SubscriberCommitAction extends CVSSubscriberAction { if (makeOutgoing.size() > 0) { makeOutgoing((SyncInfo[]) makeOutgoing.toArray(new SyncInfo[makeInSync.size()]), Policy.subMonitorFor(monitor, makeOutgoing.size() * 100)); } - - // TODO: There was special handling for undoing incoming deletions - // This should be handled by makeOutgoing but we'll need to verify RepositoryManager manager = CVSUIPlugin.getPlugin().getRepositoryManager(); if (additions.size() != 0) { @@ -241,7 +233,6 @@ public class SubscriberCommitAction extends CVSSubscriberAction { } manager.commit((IResource[])commits.toArray(new IResource[commits.size()]), comment, Policy.subMonitorFor(monitor, commits.size() * 100)); - // TODO: are there any cases that need to have folders pruned? } catch (TeamException e) { throw CVSException.wrapException(e); } @@ -287,4 +278,11 @@ public class SubscriberCommitAction extends CVSSubscriberAction { protected String getErrorTitle() { return Policy.bind("CommitAction.commitFailed"); //$NON-NLS-1$ } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ccvs.ui.subscriber.CVSSubscriberAction#getJobName(org.eclipse.team.ui.sync.SyncInfoSet) + */ + protected String getJobName(SyncInfoSet syncSet) { + return Policy.bind("CommitAction.jobName", new Integer(syncSet.size()).toString()); //$NON-NLS-1$ + } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java index 1f07239f8..c8e06623a 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java @@ -60,5 +60,10 @@ public class SubscriberConfirmMergedAction extends CVSSubscriberAction { } } + protected boolean canRunAsJob() { + // There's no sense doing this operation in the background since + // it does not contact the server + return false; + } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/UpdateDialog.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/UpdateDialog.java index 9513ff072..6b1445c85 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/UpdateDialog.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/UpdateDialog.java @@ -28,7 +28,7 @@ public class UpdateDialog extends SyncInfoSetDetailsDialog { public static final int YES = IDialogConstants.YES_ID; public UpdateDialog(Shell parentShell, SyncInfoSet syncSet) { - super(parentShell, Policy.bind("UpdateDialog.overwriteTitle"), Policy.bind("UpdateDialog.overwriteDetailsTitle"), syncSet); //$NON-NLS-1$ + super(parentShell, Policy.bind("UpdateDialog.overwriteTitle"), Policy.bind("UpdateDialog.overwriteDetailsTitle"), syncSet); //$NON-NLS-1$ //$NON-NLS-2$ } /* (non-Javadoc) diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CVSCatchupReleaseViewer.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CVSCatchupReleaseViewer.java index 0c771623e..20b0255b7 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CVSCatchupReleaseViewer.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CVSCatchupReleaseViewer.java @@ -62,12 +62,12 @@ import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; import org.eclipse.team.internal.ccvs.ui.HistoryView; import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants; import org.eclipse.team.internal.ccvs.ui.IHelpContextIds; -import org.eclipse.team.internal.ccvs.ui.OverlayIcon; import org.eclipse.team.internal.ccvs.ui.OverlayIconCache; import org.eclipse.team.internal.ccvs.ui.Policy; import org.eclipse.team.internal.ccvs.ui.merge.OverrideUpdateMergeAction; import org.eclipse.team.internal.ccvs.ui.merge.UpdateMergeAction; import org.eclipse.team.internal.ccvs.ui.merge.UpdateWithForcedJoinAction; +import org.eclipse.team.internal.ui.OverlayIcon; import org.eclipse.team.internal.ui.sync.CatchupReleaseViewer; import org.eclipse.team.internal.ui.sync.ChangedTeamContainer; import org.eclipse.team.internal.ui.sync.ITeamNode; diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsLocationSelectionPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsLocationSelectionPage.java index cceabd7ae..d8b708067 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsLocationSelectionPage.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsLocationSelectionPage.java @@ -43,7 +43,7 @@ import org.eclipse.team.internal.ccvs.ui.Policy; */ public class CheckoutAsLocationSelectionPage extends CVSWizardPage { - public static final String NAME = "CheckoutAsLocationSelectionPage"; + public static final String NAME = "CheckoutAsLocationSelectionPage"; //$NON-NLS-1$ private Button browseButton; private Text locationPathField; @@ -63,7 +63,7 @@ public class CheckoutAsLocationSelectionPage extends CVSWizardPage { * @param description */ public CheckoutAsLocationSelectionPage(ImageDescriptor titleImage, ICVSRemoteFolder[] remoteFolders) { - super(NAME, Policy.bind("CheckoutAsLocationSelectionPage.title"), titleImage, Policy.bind("CheckoutAsLocationSelectionPage.description")); + super(NAME, Policy.bind("CheckoutAsLocationSelectionPage.title"), titleImage, Policy.bind("CheckoutAsLocationSelectionPage.description")); //$NON-NLS-1$ //$NON-NLS-2$ this.remoteFolders = remoteFolders; } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsMainPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsMainPage.java index 6d2305e92..58e3f2e2e 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsMainPage.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsMainPage.java @@ -45,7 +45,7 @@ public class CheckoutAsMainPage extends CVSWizardPage { private Text projectNameField; private ICVSRemoteFolder[] folders; - public static final String NAME = "CheckoutAsMainPage"; + public static final String NAME = "CheckoutAsMainPage"; //$NON-NLS-1$ /** * @param pageName @@ -54,7 +54,7 @@ public class CheckoutAsMainPage extends CVSWizardPage { * @param description */ public CheckoutAsMainPage(ImageDescriptor titleImage, ICVSRemoteFolder[] folders, boolean allowProjectConfiguration) { - super(NAME, Policy.bind("CheckoutAsMainPage.title"), titleImage, Policy.bind("CheckoutAsMainPage.description")); //$NON-NLS-1$ + super(NAME, Policy.bind("CheckoutAsMainPage.title"), titleImage, Policy.bind("CheckoutAsMainPage.description")); //$NON-NLS-1$ //$NON-NLS-2$ this.folders = folders; this.allowProjectConfiguration = allowProjectConfiguration; } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsProjectSelectionPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsProjectSelectionPage.java index 7566de25e..9b57d1958 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsProjectSelectionPage.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsProjectSelectionPage.java @@ -52,7 +52,7 @@ import org.eclipse.team.internal.ccvs.ui.Policy; */ public class CheckoutAsProjectSelectionPage extends CVSWizardPage { - public static final String NAME = "CheckoutAsProjectSelectionPage"; + public static final String NAME = "CheckoutAsProjectSelectionPage"; //$NON-NLS-1$ private TreeViewer tree; private Text nameField; @@ -73,7 +73,7 @@ public class CheckoutAsProjectSelectionPage extends CVSWizardPage { * @param titleImage */ public CheckoutAsProjectSelectionPage(ImageDescriptor titleImage, ICVSRemoteFolder[] remoteFolders) { - super(NAME, Policy.bind("CheckoutAsProjectSelectionPage.title"), titleImage, Policy.bind("CheckoutAsProjectSelectionPage.description")); + super(NAME, Policy.bind("CheckoutAsProjectSelectionPage.title"), titleImage, Policy.bind("CheckoutAsProjectSelectionPage.description")); //$NON-NLS-1$ //$NON-NLS-2$ this.remoteFolders = remoteFolders; } @@ -227,7 +227,7 @@ public class CheckoutAsProjectSelectionPage extends CVSWizardPage { } /** - * Method getValidTargetProjects returns the et of projects that match the provided criteria. + * Method getValidTargetProjects returns the set of projects that match the provided criteria. * @return IResource */ private IProject[] getProjects(String root, boolean unshared) throws CVSException { @@ -245,7 +245,7 @@ public class CheckoutAsProjectSelectionPage extends CVSWizardPage { } else if (provider != null && provider.getID().equals(CVSProviderPlugin.getTypeId())) { ICVSFolder cvsFolder = CVSWorkspaceRoot.getCVSFolderFor(project); FolderSyncInfo info = cvsFolder.getFolderSyncInfo(); - if (root != null && root.equals(info.getRoot())) { + if (root != null && info != null && root.equals(info.getRoot())) { validTargets.add(project); } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/RepositorySelectionPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/RepositorySelectionPage.java index 51c4d1c43..120c3acab 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/RepositorySelectionPage.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/RepositorySelectionPage.java @@ -62,6 +62,7 @@ public class RepositorySelectionPage extends CVSWizardPage { Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION); GridData data = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL); data.horizontalSpan = span; + data.widthHint = 200; table.setLayoutData(data); TableLayout layout = new TableLayout(); layout.addColumnData(new ColumnWeightData(100, true)); diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java index 99e6aedf7..29527dbe4 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java @@ -303,8 +303,9 @@ public class SharingWizard extends Wizard implements IConfigurationWizard { IWorkingSet workingSet = CVSUIPlugin.getWorkingSet(new IResource[] {project}, Policy.bind("SyncAction.workingSetName")); //$NON-NLS-1$) view.setWorkingSet(workingSet); view.selectSubscriber(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber()); + view.setMode(ISynchronizeView.OUTGOING_MODE); } else { - CVSUIPlugin.openError(getContainer().getShell(), Policy.bind("error"), Policy.bind("Error.unableToShowSyncView"), null); + CVSUIPlugin.openError(getContainer().getShell(), Policy.bind("error"), Policy.bind("Error.unableToShowSyncView"), null); //$NON-NLS-1$ //$NON-NLS-2$ } } } catch (InterruptedException e) { -- cgit v1.2.3