package hudson.plugins.templateproject;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Hudson;
import hudson.model.Item;
import hudson.model.Node;
import hudson.model.TaskListener;
import hudson.scm.ChangeLogParser;
import hudson.scm.RepositoryBrowser;
import hudson.scm.SCM;
import hudson.scm.SCMDescriptor;
import hudson.security.AccessControlled;
import hudson.tasks.Messages;
import hudson.util.FormValidation;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
public class ProxySCM extends SCM {
private final String projectName;
@DataBoundConstructor
public ProxySCM(String projectName) {
this.projectName = projectName;
}
public String getProjectName() {
return projectName;
}
public AbstractProject<?, ?> getProject() {
return (AbstractProject<?, ?>) Hudson.getInstance()
.getItem(projectName);
}
@Override
public boolean checkout(AbstractBuild build, Launcher launcher,
FilePath workspace, BuildListener listener, File changelogFile)
throws IOException, InterruptedException {
return getProject().getScm().checkout(build, launcher, workspace, listener, changelogFile);
}
@Override
public ChangeLogParser createChangeLogParser() {
return getProject().getScm().createChangeLogParser();
}
@Override
public boolean pollChanges(AbstractProject project, Launcher launcher,
FilePath workspace, TaskListener listener) throws IOException,
InterruptedException {
return getProject().getScm().pollChanges(project, launcher, workspace, listener);
}
@Extension
public static class DescriptorImpl extends SCMDescriptor {
public DescriptorImpl() {
super(null);
}
@Override
public String getDisplayName() {
return "Use SCM from another project";
}
/**
* Form validation method.
*/
public FormValidation doCheckProjectName(@AncestorInPath AccessControlled anc, @QueryParameter String value) {
// Require CONFIGURE permission on this project
if (!anc.hasPermission(Item.CONFIGURE)) return FormValidation.ok();
Item item = Hudson.getInstance().getItemByFullName(
value, Item.class);
if (item == null) {
return FormValidation.error(Messages.BuildTrigger_NoSuchProject(value,
AbstractProject.findNearest(value)
.getName()));
}
if (!(item instanceof AbstractProject)) {
return FormValidation.error(Messages.BuildTrigger_NotBuildable(value));
}
return FormValidation.ok();
}
}
@Override
public void buildEnvVars(AbstractBuild build, Map<String, String> env) {
getProject().getScm().buildEnvVars(build, env);
}
@Override
public RepositoryBrowser getBrowser() {
return getProject().getScm().getBrowser();
}
@Override
public FilePath getModuleRoot(FilePath workspace) {
return getProject().getScm().getModuleRoot(workspace);
}
@Override
public FilePath[] getModuleRoots(FilePath workspace) {
return getProject().getScm().getModuleRoots(workspace);
}
@Override
public boolean processWorkspaceBeforeDeletion(
AbstractProject<?, ?> project, FilePath workspace, Node node)
throws IOException, InterruptedException {
return getProject().getScm().processWorkspaceBeforeDeletion(project, workspace, node);
}
@Override
public boolean requiresWorkspaceForPolling() {
return getProject().getScm().requiresWorkspaceForPolling();
}
@Override
public boolean supportsPolling() {
return getProject().getScm().supportsPolling();
}
}