package hudson.plugins.tfs.commands;
import com.microsoft.tfs.core.clients.versioncontrol.VersionControlConstants;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.LabelChildOption;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.LabelResult;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.RecursionType;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.VersionControlLabel;
import com.microsoft.tfs.core.clients.versioncontrol.specs.ItemSpec;
import com.microsoft.tfs.core.clients.versioncontrol.specs.LabelItemSpec;
import com.microsoft.tfs.core.clients.versioncontrol.specs.version.WorkspaceVersionSpec;
import hudson.model.TaskListener;
import hudson.plugins.tfs.model.MockableVersionControlClient;
import hudson.plugins.tfs.model.Server;
import hudson.remoting.Callable;
import java.io.PrintStream;
/**
* Command to create a label on TFS.
* @author Rodrigo Lopes (rodrigolopes)
*/
public class LabelCommand extends AbstractCallableCommand<Void, Exception> {
private static final String CreatingTemplate = "Creating label '%s' on '%s' as of the current version in workspace '%s'...";
private static final String CreatedTemplate = "Created label '%s'.";
private final String labelName;
private final String workspaceName;
private final String projectPath;
public LabelCommand(final ServerConfigurationProvider configurationProvider,
final String labelName,
final String workspaceName,
final String projectPath) {
super(configurationProvider);
this.labelName = labelName;
this.workspaceName = workspaceName;
this.projectPath = projectPath;
}
private String getLabelComment() {
// TODO 1. Solve issue with quotes and spaces
// TODO 2. Include build information in the comment.
return "Automatically_applied_by_Jenkins_TFS_plugin";
}
@Override
public Callable<Void, Exception> getCallable() {
return this;
}
public Void call() throws Exception {
final Server server = createServer();
final MockableVersionControlClient vcc = server.getVersionControlClient();
final TaskListener listener = server.getListener();
final PrintStream logger = listener.getLogger();
final String userName = VersionControlConstants.AUTHENTICATED_USER;
final String creatingMessage = String.format(CreatingTemplate, labelName, projectPath, workspaceName);
logger.println(creatingMessage);
final VersionControlLabel versionControlLabel = new VersionControlLabel(labelName, userName, userName, null, getLabelComment());
final ItemSpec itemSpec = new ItemSpec(projectPath, RecursionType.FULL);
final WorkspaceVersionSpec workspaceVersionSpec = new WorkspaceVersionSpec(workspaceName, userName, userName);
final LabelItemSpec labelItemSpec = new LabelItemSpec(itemSpec, workspaceVersionSpec, false);
final LabelItemSpec[] items = {labelItemSpec};
final LabelResult[] labelResults = vcc.createLabel(versionControlLabel, items, LabelChildOption.FAIL);
if (labelResults == null || labelResults.length == 0) {
throw new RuntimeException("Label creation failed.");
} else {
final String createdMessage = String.format(CreatedTemplate, labelName);
logger.println(createdMessage);
}
return null;
}
}