| /******************************************************************************* |
| * Copyright (c) 2000, 2006 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ccvs.ui.operations; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.mapping.ResourceMapping; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.team.internal.ccvs.core.*; |
| import org.eclipse.team.internal.ccvs.core.client.Command; |
| import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption; |
| import org.eclipse.team.internal.ccvs.core.client.Session; |
| import org.eclipse.team.internal.ccvs.ui.Policy; |
| import org.eclipse.ui.IWorkbenchPart; |
| |
| public abstract class SingleCommandOperation extends RepositoryProviderOperation { |
| |
| private LocalOption[] options = Command.NO_LOCAL_OPTIONS; |
| |
| public SingleCommandOperation(IWorkbenchPart part, ResourceMapping[] mappings, LocalOption[] options) { |
| super(part, mappings); |
| if (options != null) { |
| this.options = options; |
| } |
| } |
| |
| @Override |
| protected void execute(CVSTeamProvider provider, IResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException { |
| monitor.beginTask(null, 100); |
| Session session = new Session(getRemoteLocation(provider), getLocalRoot(provider), true /* output to console */); |
| session.open(Policy.subMonitorFor(monitor, 10), isServerModificationOperation()); |
| try { |
| IStatus status = executeCommand(session, provider, getCVSArguments(session, resources), recurse, Policy.subMonitorFor(monitor, 90)); |
| if (isReportableError(status)) { |
| throw new CVSException(status); |
| } |
| } finally { |
| session.close(); |
| } |
| } |
| |
| @Override |
| protected final ICVSResource[] getCVSArguments(IResource[] resources) { |
| return super.getCVSArguments(resources); |
| } |
| |
| protected ICVSResource[] getCVSArguments(Session session, IResource[] resources) { |
| return getCVSArguments(resources); |
| } |
| |
| @Override |
| protected void execute(CVSTeamProvider provider, ICVSTraversal entry, IProgressMonitor monitor) throws CVSException, InterruptedException { |
| try { |
| // TODO: This does not properly count the number of operations |
| // Changing it causes an error in the test cases |
| super.execute(provider, entry, monitor); |
| collectStatus(Status.OK_STATUS); |
| } catch (CVSException e) { |
| collectStatus(e.getStatus()); |
| } |
| } |
| /** |
| * Indicate whether the operation requires write access to the server (i.e. |
| * the operation changes state on the server whether it be to commit, tag, admin, etc). |
| * @return |
| */ |
| protected boolean isServerModificationOperation() { |
| return false; |
| } |
| |
| /** |
| * Method overridden by subclasses to issue the command to the CVS repository using the given session. |
| * @param session an open session which will be closed by the caller |
| * @param provider the provider for the project that contains the resources |
| * @param resources the resources to be operated on |
| * @param recurse whether the operation is deep or shallow |
| * @param monitor a progress monitor |
| */ |
| protected abstract IStatus executeCommand(Session session, CVSTeamProvider provider, ICVSResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException; |
| |
| @Override |
| protected LocalOption[] getLocalOptions(boolean recurse) { |
| LocalOption[] result = options; |
| if (recurse) { |
| // For deep operations, we just need to make sure that the -l option isn't present |
| result = Command.DO_NOT_RECURSE.removeFrom(options); |
| } else { |
| result = Command.RECURSE.removeFrom(options); |
| result = Command.DO_NOT_RECURSE.addTo(options); |
| } |
| return result; |
| } |
| |
| protected void setLocalOptions(LocalOption[] options) { |
| this.options = options; |
| } |
| |
| protected void addLocalOption(LocalOption option) { |
| options = option.addTo(options); |
| } |
| } |