blob: a525ba91e2e53d0d7629bc297beef72ab13ad865 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}