提交 de9002b3 编写于 作者: J Jesse Glick

[FIXED JENKINS-16462] Run parameters do not support folders.

上级 1979302f
...@@ -58,6 +58,9 @@ Upcoming changes</a> ...@@ -58,6 +58,9 @@ Upcoming changes</a>
<li class=bug> <li class=bug>
Bogus “Build Record Root Directory” inadequately diagnosed. Bogus “Build Record Root Directory” inadequately diagnosed.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-16457">issue 16457</a>) (<a href="https://issues.jenkins-ci.org/browse/JENKINS-16457">issue 16457</a>)
<li class=bug>
Run parameters do not support folders.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-16462">issue 16462</a>)
</ul> </ul>
</div><!--=TRUNK-END=--> </div><!--=TRUNK-END=-->
......
...@@ -36,6 +36,7 @@ import java.io.IOException; ...@@ -36,6 +36,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.annotation.CheckForNull;
/** /**
* Data representation of the auto-completion candidates. * Data representation of the auto-completion candidates.
...@@ -86,7 +87,7 @@ public class AutoCompletionCandidates implements HttpResponse { ...@@ -86,7 +87,7 @@ public class AutoCompletionCandidates implements HttpResponse {
* @param container * @param container
* The nearby contextual {@link ItemGroup} to resolve relative job names from. * The nearby contextual {@link ItemGroup} to resolve relative job names from.
*/ */
public static <T extends Item> AutoCompletionCandidates ofJobNames(final Class<T> type, final String value, Item self, ItemGroup container) { public static <T extends Item> AutoCompletionCandidates ofJobNames(final Class<T> type, final String value, @CheckForNull Item self, ItemGroup container) {
if (self==container) if (self==container)
container = self.getParent(); container = self.getParent();
......
...@@ -101,7 +101,6 @@ import jenkins.model.Jenkins; ...@@ -101,7 +101,6 @@ import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration; import jenkins.model.JenkinsLocationConfiguration;
import jenkins.util.io.OnMaster; import jenkins.util.io.OnMaster;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.apache.commons.io.input.NullInputStream;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.jelly.XMLOutput; import org.apache.commons.jelly.XMLOutput;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
...@@ -2028,7 +2027,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -2028,7 +2027,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
} }
public String getExternalizableId() { public String getExternalizableId() {
return project.getName() + "#" + getNumber(); return project.getFullName() + "#" + getNumber();
} }
public static Run<?,?> fromExternalizableId(String id) { public static Run<?,?> fromExternalizableId(String id) {
...@@ -2039,7 +2038,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -2039,7 +2038,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
String jobName = id.substring(0, hash); String jobName = id.substring(0, hash);
int number = Integer.parseInt(id.substring(hash + 1)); int number = Integer.parseInt(id.substring(hash + 1));
Job<?,?> job = (Job<?,?>) Jenkins.getInstance().getItem(jobName); Job<?,?> job = Jenkins.getInstance().getItemByFullName(jobName, Job.class);
return job.getBuildByNumber(number); return job.getBuildByNumber(number);
} }
......
...@@ -30,6 +30,7 @@ import org.kohsuke.stapler.DataBoundConstructor; ...@@ -30,6 +30,7 @@ import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import hudson.Extension; import hudson.Extension;
import org.kohsuke.stapler.QueryParameter;
public class RunParameterDefinition extends SimpleParameterDefinition { public class RunParameterDefinition extends SimpleParameterDefinition {
...@@ -65,7 +66,7 @@ public class RunParameterDefinition extends SimpleParameterDefinition { ...@@ -65,7 +66,7 @@ public class RunParameterDefinition extends SimpleParameterDefinition {
} }
public Job getProject() { public Job getProject() {
return (Job) Jenkins.getInstance().getItem(projectName); return Jenkins.getInstance().getItemByFullName(projectName, Job.class);
} }
@Extension @Extension
...@@ -84,6 +85,11 @@ public class RunParameterDefinition extends SimpleParameterDefinition { ...@@ -84,6 +85,11 @@ public class RunParameterDefinition extends SimpleParameterDefinition {
public ParameterDefinition newInstance(StaplerRequest req, JSONObject formData) throws FormException { public ParameterDefinition newInstance(StaplerRequest req, JSONObject formData) throws FormException {
return req.bindJSON(RunParameterDefinition.class, formData); return req.bindJSON(RunParameterDefinition.class, formData);
} }
public AutoCompletionCandidates doAutoCompleteProjectName(@QueryParameter String value) {
return AutoCompletionCandidates.ofJobNames(Job.class, value, null, Jenkins.getInstance());
}
} }
@Override @Override
......
...@@ -30,11 +30,7 @@ THE SOFTWARE. ...@@ -30,11 +30,7 @@ THE SOFTWARE.
<f:textbox name="parameter.name" value="${instance.name}" /> <f:textbox name="parameter.name" value="${instance.name}" />
</f:entry> </f:entry>
<f:entry title="${%Project}" help="/help/parameter/run-project.html"> <f:entry title="${%Project}" help="/help/parameter/run-project.html">
<select name="parameter.projectName"> <f:textbox name="parameter.projectName" value="${instance.projectName}" autoCompleteField="projectName"/>
<j:forEach var="project" items="${app.items}">
<f:option selected="${instance.project==project}">${project.displayName}</f:option>
</j:forEach>
</select>
</f:entry> </f:entry>
<f:entry title="${%Description}" help="/help/parameter/description.html"> <f:entry title="${%Description}" help="/help/parameter/description.html">
<f:textarea name="parameter.description" value="${instance.description}" /> <f:textarea name="parameter.description" value="${instance.description}" />
......
/*
* The MIT License
*
* Copyright 2013 Jesse Glick.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson.model;
import hudson.EnvVars;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.MockFolder;
public class RunParameterDefinitionTest {
@Rule public JenkinsRule j = new JenkinsRule();
@Bug(16462)
@Test public void inFolders() throws Exception {
MockFolder dir = j.createFolder("dir");
MockFolder subdir = dir.createProject(MockFolder.class, "sub dir");
FreeStyleProject p = subdir.createProject(FreeStyleProject.class, "some project");
p.scheduleBuild2(0).get();
FreeStyleBuild build2 = p.scheduleBuild2(0).get();
p.scheduleBuild2(0).get();
String id = build2.getExternalizableId();
assertEquals("dir/sub dir/some project#2", id);
assertEquals(build2, Run.fromExternalizableId(id));
RunParameterDefinition def = new RunParameterDefinition("build", "dir/sub dir/some project", "my build");
assertEquals("dir/sub dir/some project", def.getProjectName());
assertEquals(p, def.getProject());
EnvVars env = new EnvVars();
def.getDefaultParameterValue().buildEnvVars(null, env);
assertEquals(j.jenkins.getRootUrl() + "job/dir/job/sub%20dir/job/some%20project/3/", env.get("build"));
RunParameterValue val = def.createValue(id);
assertEquals(build2, val.getRun());
assertEquals("dir/sub dir/some project", val.getJobName());
assertEquals("2", val.getNumber());
val.buildEnvVars(null, env);
assertEquals(j.jenkins.getRootUrl() + "job/dir/job/sub%20dir/job/some%20project/2/", env.get("build"));
assertEquals("dir/sub dir/some project", env.get("build.jobName"));
assertEquals("2", env.get("build.number"));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册