Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[FIXED JENKINS-33257] Fixes wrong auto-completions and validations fo…
…r matrix project. also make `CopyArtifactPermissionProperty` applicable to pipeline jobs (aka. workflow jobs).
  • Loading branch information
ikedam committed Mar 21, 2016
1 parent f0f5cd7 commit 1838f55
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 22 deletions.
Expand Up @@ -30,6 +30,8 @@
import java.util.List;
import java.util.regex.Pattern;

import javax.annotation.CheckForNull;

import hudson.model.Job;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
Expand All @@ -55,7 +57,7 @@
/**
* Job Property to define projects that can copy artifacts of this project.
*/
public class CopyArtifactPermissionProperty extends JobProperty<AbstractProject<?,?>> {
public class CopyArtifactPermissionProperty extends JobProperty<Job<?,?>> {
public static final String PROPERTY_NAME = "copy-artifact-permission-property";

private final List<String> projectNameList;
Expand Down Expand Up @@ -196,7 +198,7 @@ public CopyArtifactPermissionProperty newInstance(StaplerRequest req, JSONObject
* @param context
* @return
*/
/*package*/ List<String> checkNotFoundProjects(String projectNames, ItemGroup<?> context) {
/*package*/ List<String> checkNotFoundProjects(String projectNames, @CheckForNull ItemGroup<?> context) {
if (StringUtils.isBlank(projectNames)) {
return Collections.emptyList();
}
Expand All @@ -211,8 +213,12 @@ public CopyArtifactPermissionProperty newInstance(StaplerRequest req, JSONObject
continue;
}
Jenkins jenkins = Jenkins.getInstance();
AbstractProject<?,?> proj = (jenkins == null)?null:jenkins.getItem(projectName, context, AbstractProject.class);
if (proj == null || proj.getRootProject() != proj || !proj.hasPermission(Item.READ)) {
Job<?,?> proj = (jenkins == null)?null:jenkins.getItem(projectName, (context != null) ? context : jenkins, Job.class);
if (
proj == null
|| ((proj instanceof AbstractProject) && ((AbstractProject<?, ?>)proj).getRootProject() != proj)
|| !proj.hasPermission(Item.READ)
) {
// permission check is done only for root project.
notFound.add(projectName);
continue;
Expand All @@ -225,8 +231,8 @@ public CopyArtifactPermissionProperty newInstance(StaplerRequest req, JSONObject
* @param projectNames
* @return
*/
public FormValidation doCheckProjectNames(@QueryParameter String projectNames, @AncestorInPath ItemGroup<?> context) {
List<String> notFound = checkNotFoundProjects(projectNames, context);
public FormValidation doCheckProjectNames(@QueryParameter String projectNames, @CheckForNull @AncestorInPath Job<?, ?> job) {
List<String> notFound = checkNotFoundProjects(projectNames, (job != null) ? job.getParent() : null);
if (!notFound.isEmpty()) {
return FormValidation.warning(Messages.CopyArtifactPermissionProperty_MissingProject(StringUtils.join(notFound, ",")));
}
Expand All @@ -238,7 +244,7 @@ public FormValidation doCheckProjectNames(@QueryParameter String projectNames, @
* @param context
* @return
*/
public AutoCompletionCandidates doAutoCompleteProjectNames(@QueryParameter String value, @AncestorInPath ItemGroup<?> context) {
public AutoCompletionCandidates doAutoCompleteProjectNames(@QueryParameter String value, @CheckForNull @AncestorInPath Job<?, ?> currentJob) {
AutoCompletionCandidates candidates = new AutoCompletionCandidates();
if (StringUtils.isBlank(value)) {
return candidates;
Expand All @@ -248,18 +254,30 @@ public AutoCompletionCandidates doAutoCompleteProjectNames(@QueryParameter Strin
if (jenkins == null) {
return candidates;
}
for (AbstractProject<?,?> project: jenkins.getAllItems(AbstractProject.class)) {
if (project.getRootProject() != project) {
for (Job<?,?> project: jenkins.getAllItems(Job.class)) {
if (
(project instanceof AbstractProject)
&& ((AbstractProject<?, ?>)project).getRootProject() != project
) {
// permission check is done only for root project.
continue;
}
if (!project.hasPermission(Item.READ)) {
continue;
}

String relativeName = project.getRelativeNameFrom(context);
if (relativeName.startsWith(value)) {
candidates.add(relativeName);
if (currentJob != null) {
// `job` gets `null` for Templates plugin
String relativeName = project.getRelativeNameFrom(currentJob.getParent());
if (relativeName.startsWith(value)) {
candidates.add(relativeName);
}
}
if (value.startsWith("/")) {
String absoluteName = String.format("/%s", project.getFullName());
if (absoluteName.startsWith(value)) {
candidates.add(absoluteName);
}
}
}
return candidates;
Expand Down
@@ -1,4 +1,7 @@
<div>
Comma seperated list of projects that can copy artifacts of this project.
Wild card character ('*') is available.
<p>
Relative names (../OtherFolder/ProjectName) or absolute names (/Folder/ProjectName) is acceptable.
Note that you need add "/" to the head of the name to specify as an absolute name.
</div>
@@ -1,4 +1,7 @@
<div>
このプロジェクトの成果物をコピーできるプロジェクトをカンマ区切りで指定します。
ワイルドカード ('*') を使用できます。
<p>
相対指定 (../OtherFolder/ProjectName) および 絶対指定 (/Folder/ProjectName) が利用可能です。
絶対指定の場合、先頭に / が必要です。
</div>
Expand Up @@ -252,21 +252,21 @@ public void testDescriptorCheckNotFoundProjects() throws Exception {
public void testDescriptorDoAutoCompleteProjectNames() throws Exception {
CopyArtifactPermissionProperty.DescriptorImpl d
= (CopyArtifactPermissionProperty.DescriptorImpl)j.jenkins.getDescriptor(CopyArtifactPermissionProperty.class);
j.createFreeStyleProject("project1");
FreeStyleProject freestyle = j.createFreeStyleProject("project1");
MatrixProject matrix = j.createMatrixProject("matrix1");
AxisList axes = new AxisList(new TextAxis("axis1", "value1"));
matrix.setAxes(axes);

MockFolder folder = j.jenkins.createProject(MockFolder.class, "folder");
folder.createProject(FreeStyleProject.class, "child1");
FreeStyleProject child = folder.createProject(FreeStyleProject.class, "child1");

assertEquals(Arrays.asList("project1"), d.doAutoCompleteProjectNames("p", j.jenkins).getValues());
assertEquals(Arrays.asList("project1"), d.doAutoCompleteProjectNames(" p", j.jenkins).getValues());
assertEquals(Arrays.asList("matrix1"), d.doAutoCompleteProjectNames("m", j.jenkins).getValues());
assertEquals(Arrays.asList("folder/child1"), d.doAutoCompleteProjectNames("f", j.jenkins).getValues());
assertEquals(Arrays.asList("child1"), d.doAutoCompleteProjectNames("c", folder).getValues());
assertEquals(Arrays.asList("../project1"), d.doAutoCompleteProjectNames("../p", folder).getValues());
assertEquals(Collections.emptyList(), d.doAutoCompleteProjectNames("x", j.jenkins).getValues());
assertEquals(Collections.emptyList(), d.doAutoCompleteProjectNames("", j.jenkins).getValues());
assertEquals(Arrays.asList("project1"), d.doAutoCompleteProjectNames("p", freestyle).getValues());
assertEquals(Arrays.asList("project1"), d.doAutoCompleteProjectNames(" p", freestyle).getValues());
assertEquals(Arrays.asList("matrix1"), d.doAutoCompleteProjectNames("m", freestyle).getValues());
assertEquals(Arrays.asList("folder/child1"), d.doAutoCompleteProjectNames("f", freestyle).getValues());
assertEquals(Arrays.asList("child1"), d.doAutoCompleteProjectNames("c", child).getValues());
assertEquals(Arrays.asList("../project1"), d.doAutoCompleteProjectNames("../p", child).getValues());
assertEquals(Collections.emptyList(), d.doAutoCompleteProjectNames("x", freestyle).getValues());
assertEquals(Collections.emptyList(), d.doAutoCompleteProjectNames("", freestyle).getValues());
}
}

0 comments on commit 1838f55

Please sign in to comment.