aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--pom.xml17
-rw-r--r--src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildFilter.java106
-rw-r--r--src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java13
-rw-r--r--src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java19
-rw-r--r--src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/config.jelly5
-rw-r--r--src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/help-branchesFilter.html5
7 files changed, 155 insertions, 11 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2f7896d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+target/
diff --git a/pom.xml b/pom.xml
index 8863269..2bb3a93 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,15 +3,15 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
- <version>1.509.4</version><!-- which version of Jenkins is this plugin built against? -->
+ <version>1.509.4</version><!-- which version of Jenkins is this plugin built against? -->
</parent>
<artifactId>bitbucket-pullrequest-builder</artifactId>
<name>Bitbucket Pullrequest Builder Plugin</name>
- <version>1.4.9-SNAPSHOT</version>
+ <version>1.4.10</version>
<description>This Jenkins plugin builds pull requests from Bitbucket.org and will report the test results.</description>
<packaging>hpi</packaging>
- <url>https://wiki.jenkins-ci.org/display/JENKINS/Bitbucket+pullrequest+builder+plugin</url>
+ <url>https://wiki.jenkins-ci.org/display/JENKINS/Bitbucket+pullrequest+builder+plugin</url>
<scm>
<connection>scm:git:ssh://git@github.com/jenkinsci/bitbucket-pullrequest-builder-plugin.git</connection>
@@ -25,10 +25,10 @@
<name>nishio_dens</name>
<email>nishio@densan-labs.net</email>
</developer>
- </developers>
-
+ </developers>
+
<!-- get every artifact through repo.jenkins-ci.org, which proxies all the artifacts that we need -->
- <repositories>
+ <repositories>
<repository>
<id>repo.jenkins-ci.org</id>
<url>http://repo.jenkins-ci.org/public/</url>
@@ -61,6 +61,11 @@
<artifactId>git</artifactId>
<version>2.2.4</version>
</dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>14.0-rc3</version>
+ </dependency>
</dependencies>
<pluginRepositories>
diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildFilter.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildFilter.java
new file mode 100644
index 0000000..eb80d86
--- /dev/null
+++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildFilter.java
@@ -0,0 +1,106 @@
+package bitbucketpullrequestbuilder.bitbucketpullrequestbuilder;
+
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+
+/**
+ * Mutable wrapper
+ */
+class Mutable<T> {
+ private T value;
+ public Mutable() { this.value = null; }
+ public Mutable(T value) { this.value = value; }
+ T get() { return this.value; }
+ void set(T value) { this.value = value; }
+}
+
+abstract class Filter {
+ protected static final Logger logger = Logger.getLogger(BitbucketBuildTrigger.class.getName());
+
+ public static final String RX_FILTER_FLAG = "r";
+ public static final String RX_FILTER_FLAG_SINGLE = RX_FILTER_FLAG + ":";
+
+ abstract public boolean apply(String filter, BitbucketCause cause);
+ abstract public boolean check(String filter);
+}
+
+class EmptyFilter extends Filter {
+ @Override
+ public boolean apply(String filter, BitbucketCause cause) { return true; }
+ @Override
+ public boolean check(String filter) { return true; }
+}
+
+class AnyFlag extends Filter {
+ @Override
+ public boolean apply(String filter, BitbucketCause cause) { return true; }
+ @Override
+ public boolean check(String filter) { return filter.isEmpty() || filter.contains("*") || filter.toLowerCase().contains("any"); }
+}
+
+class OnlyDestFlag extends Filter {
+ @Override
+ public boolean apply(String filter, BitbucketCause cause) {
+ return Pattern.compile(
+ filter.startsWith(RX_FILTER_FLAG_SINGLE) ? filter.substring(RX_FILTER_FLAG_SINGLE.length()) : Pattern.quote(filter),
+ Pattern.CASE_INSENSITIVE).matcher(cause.getTargetBranch()).find();
+ }
+ @Override
+ public boolean check(String filter) {
+ return !(Pattern.matches("(s:)|(d:)", filter));
+ }
+}
+
+class SourceDestFlag extends Filter {
+ @Override
+ public boolean apply(String filter, BitbucketCause cause) {
+ return false;
+ }
+ @Override
+ public boolean check(String filter) {
+ return Pattern.matches("(s:)|(d:)", filter);
+ }
+}
+
+/**
+ * Created by maxvodo
+ */
+public class BitbucketBuildFilter {
+ private static final Logger logger = Logger.getLogger(BitbucketBuildTrigger.class.getName());
+
+ private final String filter;
+ private Filter currFilter = null;
+ private static final List<Filter> AvailableFilters;
+
+ static {
+ ArrayList<Filter> filters = new ArrayList<Filter>();
+ filters.add(new AnyFlag());
+ filters.add(new OnlyDestFlag());
+ filters.add(new EmptyFilter());
+ AvailableFilters = filters;
+ }
+
+ public BitbucketBuildFilter(String f) {
+ this.filter = f;
+ this.buildFilter(this.filter);
+ }
+
+ private void buildFilter(String filter) {
+ for(Filter f : AvailableFilters) {
+ if (f.check(filter)) {
+ this.currFilter = f;
+ logger.log(Level.INFO, "Using filter: {0}", f.getClass().getSimpleName());
+ break;
+ }
+ }
+ logger.warning("No available filters to use ...");
+ }
+
+ public boolean approved(BitbucketCause cause) {
+ return this.currFilter.apply(this.filter, cause);
+ }
+}
diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java
index 247bd67..254eec3 100644
--- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java
+++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java
@@ -28,16 +28,17 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
private final String password;
private final String repositoryOwner;
private final String repositoryName;
+ private final String branchesFilter;
private final String ciKey;
private final String ciName;
private final String ciSkipPhrases;
private final boolean checkDestinationCommit;
private final boolean approveIfSuccess;
-
+
transient private BitbucketPullRequestsBuilder bitbucketPullRequestsBuilder;
@Extension
- public static final BitbucketBuildTriggerDescriptor descriptor = new BitbucketBuildTriggerDescriptor();
+ public static final BitbucketBuildTriggerDescriptor descriptor = new BitbucketBuildTriggerDescriptor();
@DataBoundConstructor
public BitbucketBuildTrigger(
@@ -47,6 +48,7 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
String password,
String repositoryOwner,
String repositoryName,
+ String branchesFilter,
String ciKey,
String ciName,
String ciSkipPhrases,
@@ -60,6 +62,7 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
this.password = password;
this.repositoryOwner = repositoryOwner;
this.repositoryName = repositoryName;
+ this.branchesFilter = branchesFilter;
this.ciKey = ciKey;
this.ciName = ciName;
this.ciSkipPhrases = ciSkipPhrases;
@@ -91,6 +94,10 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
return repositoryName;
}
+ public String getBranchesFilter() {
+ return branchesFilter;
+ }
+
public String getCiKey() {
return ciKey;
}
@@ -102,7 +109,7 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
public String getCiSkipPhrases() {
return ciSkipPhrases;
}
-
+
public boolean getCheckDestinationCommit() {
return checkDestinationCommit;
}
diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java
index dd0f5e5..e0a4b19 100644
--- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java
+++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketRepository.java
@@ -100,7 +100,7 @@ public class BitbucketRepository {
private boolean isBuildTarget(Pullrequest pullRequest) {
if (pullRequest.getState() != null && pullRequest.getState().equals("OPEN")) {
- if (isSkipBuild(pullRequest.getTitle())) {
+ if (isSkipBuild(pullRequest.getTitle()) || !isFilteredBuild(pullRequest)) {
return false;
}
@@ -153,4 +153,21 @@ public class BitbucketRepository {
}
return false;
}
+
+ private boolean isFilteredBuild(Pullrequest pullRequest) {
+ BitbucketCause cause = new BitbucketCause(
+ pullRequest.getSource().getBranch().getName(),
+ pullRequest.getDestination().getBranch().getName(),
+ pullRequest.getSource().getRepository().getOwnerName(),
+ pullRequest.getSource().getRepository().getRepositoryName(),
+ pullRequest.getId(),
+ pullRequest.getDestination().getRepository().getOwnerName(),
+ pullRequest.getDestination().getRepository().getRepositoryName(),
+ pullRequest.getTitle(),
+ pullRequest.getSource().getCommit().getHash(),
+ pullRequest.getDestination().getCommit().getHash()
+ );
+ BitbucketBuildFilter filter = new BitbucketBuildFilter(this.trigger.getBranchesFilter());
+ return filter.approved(cause);
+ }
}
diff --git a/src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/config.jelly b/src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/config.jelly
index 82ab08c..845926d 100644
--- a/src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/config.jelly
+++ b/src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/config.jelly
@@ -14,6 +14,9 @@
<f:entry title="RepositoryName" field="repositoryName">
<f:textbox />
</f:entry>
+ <f:entry title="BranchesFilter" field="branchesFilter">
+ <f:textbox />
+ </f:entry>
<f:entry title="CI Identifier" field="ciKey">
<f:textbox default="jenkins" />
</f:entry>
@@ -29,4 +32,4 @@
<f:entry title="Approve if build success?" field="approveIfSuccess">
<f:checkbox />
</f:entry>
-</j:jelly> \ No newline at end of file
+</j:jelly>
diff --git a/src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/help-branchesFilter.html b/src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/help-branchesFilter.html
new file mode 100644
index 0000000..8b801db
--- /dev/null
+++ b/src/main/resources/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger/help-branchesFilter.html
@@ -0,0 +1,5 @@
+Filter option in custom format. Default value is empty or "any".
+Available formats:
+* any pull requests applied for this project: "any", "*" or empty string.
+* filtered by destination branch: "my-branch" or more complex reg-ex filter "r:^master" (must be started with "r:" and case insensitive match).
+* filtered by source and destination branches: "s:source-branch d:dest-branch" \ No newline at end of file