| /******************************************************************************* |
| * 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 java.lang.reflect.InvocationTargetException; |
| import java.util.*; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.mapping.ResourceMapping; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.team.internal.ccvs.core.*; |
| import org.eclipse.team.internal.ccvs.core.client.*; |
| 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.CVSUIMessages; |
| import org.eclipse.team.internal.ccvs.ui.Policy; |
| import org.eclipse.team.internal.ccvs.ui.actions.TagAction; |
| import org.eclipse.team.internal.ccvs.ui.tags.TagSource; |
| import org.eclipse.ui.IWorkbenchPart; |
| |
| public class TagOperation extends RepositoryProviderOperation implements ITagOperation { |
| |
| private Set<LocalOption> localOptions = new HashSet<>(); |
| private CVSTag tag; |
| |
| public TagOperation(IWorkbenchPart part, ResourceMapping[] mappers) { |
| super(part, mappers); |
| } |
| |
| @Override |
| public CVSTag getTag() { |
| return tag; |
| } |
| |
| @Override |
| public void setTag(CVSTag tag) { |
| this.tag = tag; |
| } |
| |
| @Override |
| protected void execute(CVSTeamProvider provider, IResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException { |
| IStatus status = tag(provider, resources, recurse, monitor); |
| collectStatus(status); |
| } |
| |
| /** |
| * Override to dislay the number of tag operations that succeeded |
| */ |
| @Override |
| protected String getErrorMessage(IStatus[] problems, int operationCount) { |
| // We accumulated 1 status per resource above. |
| if(operationCount == 1) { |
| return CVSUIMessages.TagAction_tagProblemsMessage; |
| } else { |
| return NLS.bind(CVSUIMessages.TagAction_tagProblemsMessageMultiple, new String[] { Integer.toString(operationCount - problems.length), Integer.toString(problems.length) }); |
| } |
| } |
| |
| /** |
| * Tag the resources in the CVS repository with the given tag. |
| * |
| * The returned IStatus will be a status containing any errors or warnings. |
| * If the returned IStatus is a multi-status, the code indicates the severity. |
| * Possible codes are: |
| * CVSStatus.OK - Nothing to report |
| * CVSStatus.SERVER_ERROR - The server reported an error |
| * any other code - warning messages received from the server |
| * @param recurse |
| */ |
| public IStatus tag(CVSTeamProvider provider, IResource[] resources, boolean recurse, IProgressMonitor progress) throws CVSException { |
| |
| LocalOption[] commandOptions = localOptions.toArray(new LocalOption[localOptions.size()]); |
| if (recurse) { |
| commandOptions = Command.DO_NOT_RECURSE.removeFrom(commandOptions); |
| } else { |
| commandOptions = Command.RECURSE.removeFrom(commandOptions); |
| commandOptions = Command.DO_NOT_RECURSE.addTo(commandOptions); |
| } |
| |
| // Build the arguments list |
| String[] arguments = getStringArguments(resources); |
| |
| // Execute the command |
| CVSWorkspaceRoot root = provider.getCVSWorkspaceRoot(); |
| Session s = new Session(root.getRemoteLocation(), root.getLocalRoot()); |
| progress.beginTask(null, 100); |
| try { |
| // Opening the session takes 20% of the time |
| s.open(Policy.subMonitorFor(progress, 20), true /* open for modification */); |
| return Command.TAG.execute(s, |
| Command.NO_GLOBAL_OPTIONS, |
| commandOptions, |
| tag, |
| arguments, |
| null, |
| Policy.subMonitorFor(progress, 80)); |
| } finally { |
| s.close(); |
| progress.done(); |
| } |
| } |
| |
| public void addLocalOption(LocalOption option) { |
| localOptions.add(option); |
| } |
| |
| @Override |
| public void moveTag() { |
| addLocalOption(Tag.FORCE_REASSIGNMENT); |
| } |
| |
| @Override |
| public void doNotRecurse() { |
| addLocalOption(Command.DO_NOT_RECURSE); |
| } |
| |
| @Override |
| protected String getTaskName() { |
| return CVSUIMessages.TagFromWorkspace_taskName; |
| } |
| |
| @Override |
| protected String getTaskName(CVSTeamProvider provider) { |
| return NLS.bind(CVSUIMessages.TagOperation_0, new String[] { provider.getProject().getName() }); |
| } |
| |
| @Override |
| public void execute(IProgressMonitor monitor) throws CVSException, InterruptedException { |
| super.execute(monitor); |
| if (!errorsOccurred()) { |
| try { |
| TagAction.broadcastTagChange(getCVSResources(), getTag()); |
| } catch (InvocationTargetException e) { |
| throw CVSException.wrapException(e); |
| } |
| } |
| } |
| |
| private ICVSResource[] getCVSResources() { |
| IResource[] resources = getTraversalRoots(); |
| ICVSResource[] cvsResources = new ICVSResource[resources.length]; |
| for (int i = 0; i < resources.length; i++) { |
| cvsResources[i] = CVSWorkspaceRoot.getCVSResourceFor(resources[i]); |
| } |
| return cvsResources; |
| } |
| |
| @Override |
| public TagSource getTagSource() { |
| return TagSource.create(getProjects()); |
| } |
| |
| private IProject[] getProjects() { |
| ResourceMapping[] mappings = getSelectedMappings(); |
| Set<IProject> projects = new HashSet<>(); |
| for (int i = 0; i < mappings.length; i++) { |
| ResourceMapping mapping = mappings[i]; |
| projects.addAll(Arrays.asList(mapping.getProjects())); |
| } |
| return projects.toArray(new IProject[projects.size()]); |
| } |
| |
| @Override |
| protected boolean isReportableError(IStatus status) { |
| return super.isReportableError(status) |
| || status.getCode() == CVSStatus.TAG_ALREADY_EXISTS; |
| } |
| |
| @Override |
| public boolean isEmpty() { |
| return getSelectedMappings().length == 0; |
| } |
| } |