Skip to content

Commit

Permalink
Merge pull request #21 from matthewcmorgan/master
Browse files Browse the repository at this point in the history
[FIXED JENKINS-31185] Added hg support
  • Loading branch information
fbelzunc committed Dec 28, 2015
2 parents 67fb8b7 + c0b6d26 commit 2dd1b39
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 15 deletions.
7 changes: 6 additions & 1 deletion pom.xml
Expand Up @@ -6,7 +6,7 @@
<artifactId>plugin</artifactId>
<version>1.580.1</version> <!-- minimun required version to work with Workflow 1.4 SCMTriggerItem was added in 1.568. 1.580.x is the next LTS after that-->
</parent>

<artifactId>bitbucket</artifactId>
<version>1.1.4-SNAPSHOT</version>
<packaging>hpi</packaging>
Expand Down Expand Up @@ -63,6 +63,11 @@
<artifactId>git</artifactId>
<version>2.3.5</version>
</dependency>
<dependency> <!-- minimun required version to work with Workflow 1.4 GitSCM step-->
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>mercurial</artifactId>
<version>1.54</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
Expand Down
32 changes: 29 additions & 3 deletions src/main/java/com/cloudbees/jenkins/plugins/BitbucketJobProbe.java
Expand Up @@ -3,10 +3,12 @@
import hudson.model.Job;
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.GitStatus;
import hudson.plugins.mercurial.MercurialSCM;
import hudson.scm.SCM;
import hudson.security.ACL;

import java.net.URISyntaxException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
Expand All @@ -21,11 +23,12 @@
import org.acegisecurity.context.SecurityContextHolder;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;
import com.google.common.base.Objects;

public class BitbucketJobProbe {

public void triggerMatchingJobs(String user, String url, String scm) {
if ("git".equals(scm)) {
if ("git".equals(scm) || "hg".equals(scm)) {
SecurityContext old = Jenkins.getInstance().getACL().impersonate(ACL.SYSTEM);
try {
URIish remote = new URIish(url);
Expand Down Expand Up @@ -63,7 +66,6 @@ public void triggerMatchingJobs(String user, String url, String scm) {
}

} else {
// TODO hg
throw new UnsupportedOperationException("Unsupported SCM type " + scm);
}
}
Expand All @@ -81,14 +83,38 @@ private boolean match(SCM scm, URIish url) {
if (scm instanceof GitSCM) {
for (RemoteConfig remoteConfig : ((GitSCM) scm).getRepositories()) {
for (URIish urIish : remoteConfig.getURIs()) {
if (GitStatus.looselyMatches(urIish, url))
if (GitStatus.looselyMatches(urIish, url)) {
return true;
}
}
}
} else if (scm instanceof MercurialSCM) {
try {
URI hgUri = new URI(((MercurialSCM) scm).getSource());
String remote = url.toString();
if (looselyMatches(hgUri, remote)) {
return true;
}
} catch (URISyntaxException ex) {
LOGGER.log(Level.SEVERE, "Could not parse jobSource uri: {0} ", ex);
}
}
return false;
}

private boolean looselyMatches(URI notifyUri, String repository) {
boolean result = false;
try {
URI repositoryUri = new URI(repository);
result = Objects.equal(notifyUri.getHost(), repositoryUri.getHost())
&& Objects.equal(notifyUri.getPath(), repositoryUri.getPath())
&& Objects.equal(notifyUri.getQuery(), repositoryUri.getQuery());
} catch (URISyntaxException ex) {
LOGGER.log(Level.SEVERE, "Could not parse repository uri: {0}, {1}", new Object[]{repository, ex});
}
return result;
}

private static final Logger LOGGER = Logger.getLogger(BitbucketJobProbe.class.getName());

}
@@ -1,5 +1,6 @@
package com.cloudbees.jenkins.plugins;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
Expand All @@ -21,24 +22,34 @@ public BitbucketPayloadProcessor() {
public void processPayload(JSONObject payload, HttpServletRequest request) {
if ("Bitbucket-Webhooks/2.0".equals(request.getHeader("user-agent"))) {
if ("repo:push".equals(request.getHeader("x-event-key"))) {
LOGGER.info("Processing new Webhooks payload");
LOGGER.log(Level.INFO, "Processing new Webhooks payload");
processWebhookPayload(payload);
}
} else {
LOGGER.info("Processing old POST service payload");
LOGGER.log(Level.INFO, "Processing old POST service payload");
processPostServicePayload(payload);
}
}

private void processWebhookPayload(JSONObject payload) {
JSONObject repo = payload.getJSONObject("repository");
LOGGER.info("Received commit hook notification for "+repo);

String user = payload.getJSONObject("actor").getString("username");
String url = repo.getJSONObject("links").getJSONObject("html").getString("href");
String scm = repo.has("scm") ? repo.getString("scm") : "git";
if (payload.has("repository")) {
JSONObject repo = payload.getJSONObject("repository");
LOGGER.log(Level.INFO, "Received commit hook notification for {0}", repo);

String user = payload.getJSONObject("actor").getString("username");
String url = repo.getJSONObject("links").getJSONObject("html").getString("href");
String scm = repo.has("scm") ? repo.getString("scm") : "git";

probe.triggerMatchingJobs(user, url, scm);
} else if (payload.has("scm")) {
LOGGER.log(Level.INFO, "Received commit hook notification for hg: {0}", payload);
String user = payload.getJSONObject("owner").getString("username");
String url = payload.getJSONObject("links").getJSONObject("html").getString("href");
String scm = payload.has("scm") ? payload.getString("scm") : "hg";

probe.triggerMatchingJobs(user, url, scm);
}

probe.triggerMatchingJobs(user, url, scm);
}

/*
Expand Down Expand Up @@ -82,7 +93,7 @@ private void processWebhookPayload(JSONObject payload) {
*/
private void processPostServicePayload(JSONObject payload) {
JSONObject repo = payload.getJSONObject("repository");
LOGGER.info("Received commit hook notification for "+repo);
LOGGER.log(Level.INFO, "Received commit hook notification for {0}", repo);

String user = payload.getString("user");
String url = payload.getString("canon_url") + repo.getString("absolute_url");
Expand Down
Expand Up @@ -43,9 +43,21 @@ public void testProcessWebhookPayload() {
.element("html", new JSONObject()
.element("href", url))));

JSONObject hgLoad = new JSONObject()
.element("scm", "hg")
.element("owner", new JSONObject()
.element("username", user))
.element("links", new JSONObject()
.element("html", new JSONObject()
.element("href", url)));

payloadProcessor.processPayload(payload, request);

verify(probe).triggerMatchingJobs(user, url, "git");

payloadProcessor.processPayload(hgLoad, request);

verify(probe).triggerMatchingJobs(user, url, "hg");
}

@Test
Expand Down

0 comments on commit 2dd1b39

Please sign in to comment.