Skip to content

Commit

Permalink
Merge pull request #315 from christiangalsterer/JENKINS-27902
Browse files Browse the repository at this point in the history
[JENKINS-27902] Allow to pass additional request parameter for notifyCommit
  • Loading branch information
ndeloof committed Apr 27, 2015
2 parents 30766fe + 336d7f7 commit 9e46ae7
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 27 deletions.
38 changes: 25 additions & 13 deletions src/main/java/hudson/plugins/git/GitStatus.java
Expand Up @@ -4,24 +4,19 @@
import hudson.Extension;
import hudson.ExtensionPoint;
import hudson.Util;
import hudson.model.AbstractModelObject;
import hudson.model.AbstractProject;
import hudson.model.Cause;
import hudson.model.CauseAction;
import hudson.model.Item;
import hudson.model.UnprotectedRootAction;
import hudson.model.*;
import hudson.plugins.git.extensions.impl.IgnoreNotifyCommit;
import hudson.scm.SCM;
import hudson.security.ACL;
import hudson.triggers.SCMTrigger;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.*;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import jenkins.model.Jenkins;
Expand Down Expand Up @@ -57,17 +52,27 @@ public String getUrlName() {
return "git";
}

public HttpResponse doNotifyCommit(@QueryParameter(required=true) String url,
public HttpResponse doNotifyCommit(HttpServletRequest request, @QueryParameter(required=true) String url,
@QueryParameter(required=false) String branches,
@QueryParameter(required=false) String sha1) throws ServletException, IOException {
URIish uri;
List<ParameterValue> buildParameters = new ArrayList<ParameterValue>();

try {
uri = new URIish(url);
} catch (URISyntaxException e) {
return HttpResponses.error(SC_BAD_REQUEST, new Exception("Illegal URL: " + url, e));
}

final Map<String, String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
if (!(entry.getKey().equals("url")) && !(entry.getKey().equals("branches")) && !(entry.getKey().equals("sha1")))
if (entry.getValue()[0] != null)
buildParameters.add(new StringParameterValue(entry.getKey(), entry.getValue()[0]));
}

branches = Util.fixEmptyAndTrim(branches);

String[] branchesArray;
if (branches == null) {
branchesArray = new String[0];
Expand All @@ -77,7 +82,7 @@ public HttpResponse doNotifyCommit(@QueryParameter(required=true) String url,

final List<ResponseContributor> contributors = new ArrayList<ResponseContributor>();
for (Listener listener : Jenkins.getInstance().getExtensionList(Listener.class)) {
contributors.addAll(listener.onNotifyCommit(uri, sha1, branchesArray));
contributors.addAll(listener.onNotifyCommit(uri, sha1, buildParameters, branchesArray));
}

return new HttpResponse() {
Expand Down Expand Up @@ -172,8 +177,15 @@ public List<ResponseContributor> onNotifyCommit(URIish uri, String[] branches) {
}

public List<ResponseContributor> onNotifyCommit(URIish uri, @Nullable String sha1, String... branches) {
List<ParameterValue> buildParameters = Collections.EMPTY_LIST;
return onNotifyCommit(uri, sha1, buildParameters, branches);
}

public List<ResponseContributor> onNotifyCommit(URIish uri, @Nullable String sha1, List<ParameterValue> buildParameters, String... branches) {
return Collections.EMPTY_LIST;
}


}

/**
Expand All @@ -189,7 +201,7 @@ public static class JenkinsAbstractProjectListener extends Listener {
* {@inheritDoc}
*/
@Override
public List<ResponseContributor> onNotifyCommit(URIish uri, String sha1, String... branches) {
public List<ResponseContributor> onNotifyCommit(URIish uri, String sha1, List<ParameterValue> buildParameters, String... branches) {
List<ResponseContributor> result = new ArrayList<ResponseContributor>();
// run in high privilege to see all the projects anonymous users don't see.
// this is safe because when we actually schedule a build, it's a build that can
Expand Down Expand Up @@ -252,7 +264,7 @@ public List<ResponseContributor> onNotifyCommit(URIish uri, String sha1, String.
LOGGER.info("Scheduling " + project.getFullDisplayName() + " to build commit " + sha1);
scmTriggerItem.scheduleBuild2(scmTriggerItem.getQuietPeriod(),
new CauseAction(new CommitHookCause(sha1)),
new RevisionParameterAction(sha1));
new RevisionParameterAction(sha1), new ParametersAction(buildParameters));
result.add(new ScheduledResponseContributor(project));
} else if (trigger != null) {
LOGGER.info("Triggering the polling of " + project.getFullDisplayName());
Expand Down
69 changes: 55 additions & 14 deletions src/test/java/hudson/plugins/git/GitStatusTest.java
Expand Up @@ -5,24 +5,28 @@
package hudson.plugins.git;

import hudson.Functions;
import hudson.model.Action;
import hudson.model.FreeStyleProject;
import hudson.model.ParameterValue;
import hudson.model.ParametersAction;
import hudson.plugins.git.extensions.GitSCMExtension;
import hudson.plugins.git.extensions.impl.IgnoreNotifyCommit;
import hudson.plugins.git.util.DefaultBuildChooser;
import hudson.triggers.SCMTrigger;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.*;

import org.eclipse.jgit.transport.URIish;
import org.jvnet.hudson.test.HudsonTestCase;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import javax.servlet.http.HttpServletRequest;

public class GitStatusTest extends HudsonTestCase {
private GitStatus gitStatus;
private HttpServletRequest requestWithNoParameter;
private HttpServletRequest requestWithParameter;

public GitStatusTest(String testName) {
super(testName);
Expand All @@ -32,6 +36,8 @@ public GitStatusTest(String testName) {
protected void setUp() throws Exception {
super.setUp();
this.gitStatus = new GitStatus();
this.requestWithNoParameter = mock(HttpServletRequest.class);
this.requestWithParameter = mock(HttpServletRequest.class);
}

@Override
Expand Down Expand Up @@ -68,7 +74,7 @@ public void testDoNotifyCommitWithNoBranches() throws Exception {
SCMTrigger bMasterTrigger = setupProject("b", "master", false);
SCMTrigger bTopicTrigger = setupProject("b", "topic", false);

this.gitStatus.doNotifyCommit("a", "", null);
this.gitStatus.doNotifyCommit(requestWithNoParameter, "a", "", null);
Mockito.verify(aMasterTrigger).run();
Mockito.verify(aTopicTrigger).run();
Mockito.verify(bMasterTrigger, Mockito.never()).run();
Expand All @@ -81,7 +87,7 @@ public void testDoNotifyCommitWithNoMatchingUrl() throws Exception {
SCMTrigger bMasterTrigger = setupProject("b", "master", false);
SCMTrigger bTopicTrigger = setupProject("b", "topic", false);

this.gitStatus.doNotifyCommit("nonexistent", "", null);
this.gitStatus.doNotifyCommit(requestWithNoParameter, "nonexistent", "", null);
Mockito.verify(aMasterTrigger, Mockito.never()).run();
Mockito.verify(aTopicTrigger, Mockito.never()).run();
Mockito.verify(bMasterTrigger, Mockito.never()).run();
Expand All @@ -94,7 +100,7 @@ public void testDoNotifyCommitWithOneBranch() throws Exception {
SCMTrigger bMasterTrigger = setupProject("b", "master", false);
SCMTrigger bTopicTrigger = setupProject("b", "topic", false);

this.gitStatus.doNotifyCommit("a", "master", null);
this.gitStatus.doNotifyCommit(requestWithNoParameter, "a", "master", null);
Mockito.verify(aMasterTrigger).run();
Mockito.verify(aTopicTrigger, Mockito.never()).run();
Mockito.verify(bMasterTrigger, Mockito.never()).run();
Expand All @@ -107,7 +113,7 @@ public void testDoNotifyCommitWithTwoBranches() throws Exception {
SCMTrigger bMasterTrigger = setupProject("b", "master", false);
SCMTrigger bTopicTrigger = setupProject("b", "topic", false);

this.gitStatus.doNotifyCommit("a", "master,topic", null);
this.gitStatus.doNotifyCommit(requestWithNoParameter, "a", "master,topic", null);
Mockito.verify(aMasterTrigger).run();
Mockito.verify(aTopicTrigger).run();
Mockito.verify(bMasterTrigger, Mockito.never()).run();
Expand All @@ -120,7 +126,7 @@ public void testDoNotifyCommitWithNoMatchingBranches() throws Exception {
SCMTrigger bMasterTrigger = setupProject("b", "master", false);
SCMTrigger bTopicTrigger = setupProject("b", "topic", false);

this.gitStatus.doNotifyCommit("a", "nonexistent", null);
this.gitStatus.doNotifyCommit(requestWithNoParameter, "a", "nonexistent", null);
Mockito.verify(aMasterTrigger, Mockito.never()).run();
Mockito.verify(aTopicTrigger, Mockito.never()).run();
Mockito.verify(bMasterTrigger, Mockito.never()).run();
Expand All @@ -130,17 +136,52 @@ public void testDoNotifyCommitWithNoMatchingBranches() throws Exception {
public void testDoNotifyCommitWithIgnoredRepository() throws Exception {
SCMTrigger aMasterTrigger = setupProject("a", "master", true);

this.gitStatus.doNotifyCommit("a", null, "");
this.gitStatus.doNotifyCommit(requestWithNoParameter, "a", null, "");
Mockito.verify(aMasterTrigger, Mockito.never()).run();
}


public void testDoNotifyCommitWithNoScmTrigger() throws Exception {
setupProject("a", "master", null);
this.gitStatus.doNotifyCommit("a", null, "");
this.gitStatus.doNotifyCommit(requestWithNoParameter, "a", null, "");
// no expectation here, however we shouldn't have a build triggered, and no exception
}

public void testDoNotifyCommitWithTwoBranchesAndAdditionalParameter() throws Exception {
SCMTrigger aMasterTrigger = setupProject("a", "master", false);
SCMTrigger aTopicTrigger = setupProject("a", "topic", false);
SCMTrigger bMasterTrigger = setupProject("b", "master", false);
SCMTrigger bTopicTrigger = setupProject("b", "topic", false);

Map<String, String[]> parameterMap = new HashMap<String, String[]>();
parameterMap.put("paramKey1", new String[] {"paramValue1"});
parameterMap.put("paramKey2", new String[] {"paramValue2"});
when(requestWithParameter.getParameterMap()).thenReturn(parameterMap);

this.gitStatus.doNotifyCommit(requestWithParameter, "a", "master,topic", null);
Mockito.verify(aMasterTrigger).run();
Mockito.verify(aTopicTrigger).run();
Mockito.verify(bMasterTrigger, Mockito.never()).run();
Mockito.verify(bTopicTrigger, Mockito.never()).run();

assertAdditionalParameters(aMasterTrigger.getProjectActions());
assertAdditionalParameters(aTopicTrigger.getProjectActions());

}

private void assertAdditionalParameters(Collection<? extends Action> actions) {
for (Action action: actions) {
if (action instanceof ParametersAction) {
final List<ParameterValue> parameters = ((ParametersAction) action).getParameters();
assertEquals(2, parameters.size());
for (ParameterValue value : parameters) {
assertTrue((value.getName().equals("paramKey1") && value.getValue().equals("paramValue1"))
|| (value.getName().equals("paramKey2") && value.getValue().equals("paramValue2")));
}
}
}
}

private SCMTrigger setupProject(String url, String branchString, boolean ignoreNotifyCommit) throws Exception {
SCMTrigger trigger = Mockito.mock(SCMTrigger.class);
Mockito.doReturn(ignoreNotifyCommit).when(trigger).isIgnorePostCommitHooks();
Expand Down

0 comments on commit 9e46ae7

Please sign in to comment.