aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs19
-rw-r--r--src/pull_request.rs71
2 files changed, 84 insertions, 6 deletions
diff --git a/src/main.rs b/src/main.rs
index 9ac9570..12d71eb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -16,6 +16,7 @@
// along with Kipper. If not, see <http://www.gnu.org/licenses/>.
extern crate getopts;
+extern crate json;
#[macro_use]
extern crate log;
extern crate stderrlog;
@@ -32,7 +33,7 @@ use std::time::Duration;
use getopts::Options;
use kipper::jenkins;
-use kipper::pull_request::CommitRef;
+use kipper::pull_request::{CommitRef, pull_request_opened_or_synchronized};
const DEFAULT_PORT: u16 = 8000;
@@ -129,7 +130,21 @@ fn main() {
let mut body = String::new();
try_or_400!(data.read_to_string(&mut body));
- let commit_ref = match CommitRef::new(body.as_ref()) {
+ let json = match json::parse(body.as_ref()) {
+ Ok(j) => j,
+ Err(e) => {
+ error!("{}", e.to_string());
+
+ return internal_server_error()
+ },
+ };
+
+ if !pull_request_opened_or_synchronized(json.clone()) {
+ return rouille::Response::text("No status update needed.")
+ .with_status_code(200)
+ }
+
+ let commit_ref = match CommitRef::new(json) {
Ok(cr) => cr,
Err(e) => {
error!("{}", e.to_string());
diff --git a/src/pull_request.rs b/src/pull_request.rs
index fb06544..b110ea4 100644
--- a/src/pull_request.rs
+++ b/src/pull_request.rs
@@ -28,9 +28,9 @@ pub struct CommitRef {
}
impl CommitRef {
- pub fn new(json_str: &str) -> Result<CommitRef, Box<Error>> {
- let mut github_push_event = json::parse(json_str)?;
-
+ pub fn new(
+ mut github_push_event: json::JsonValue
+ ) -> Result<CommitRef, Box<Error>> {
Ok(
CommitRef {
owner: github_push_event["pull_request"]["head"]["repo"]["owner"]["login"].take_string().unwrap_or_default(),
@@ -42,6 +42,18 @@ impl CommitRef {
}
}
+pub fn pull_request_opened_or_synchronized(
+ mut github_push_event: json::JsonValue
+) -> bool {
+ let action = github_push_event["action"].take_string().unwrap_or_default();
+
+ if action == "opened" || action == "synchronize" {
+ return true
+ }
+
+ false
+}
+
#[cfg(test)]
mod tests {
@@ -465,7 +477,10 @@ mod tests {
}
}"#;
- let commit_ref = CommitRef::new(payload)
+ let json = json::parse(payload)
+ .expect("Failed to parse payload.");
+
+ let commit_ref = CommitRef::new(json)
.expect("Failed to create CommitRef from payload");
assert_eq!(commit_ref.owner, "baxterthehacker");
@@ -473,4 +488,52 @@ mod tests {
assert_eq!(commit_ref.sha, "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c");
assert_eq!(commit_ref.branch, "changes");
}
+
+ #[test]
+ fn pull_request_opened_or_synchronized_returns_true_when_opened() {
+ let payload = r#"{
+ "action": "opened"
+ }"#;
+
+ let json = json::parse(payload)
+ .expect("Failed to parse payload.");
+
+ assert_eq!(
+ pull_request_opened_or_synchronized(json),
+ true
+ );
+ }
+
+ #[test]
+ fn pull_request_opened_or_synchronized_returns_true_when_synchronized() {
+ let payload = r#"{
+ "action": "synchronize"
+ }"#;
+
+ let json = json::parse(payload)
+ .expect("Failed to parse payload.");
+
+ assert_eq!(
+ pull_request_opened_or_synchronized(json),
+ true
+ );
+ }
+
+ #[test]
+ fn pull_request_opened_or_synchronized_returns_false_when_not_opened_or_synchronized() {
+ // "assigned", "unassigned", "review_requested",
+ // "review_request_removed", "labeled", "unlabeled", "opened",
+ // "edited", "closed", or "reopened"
+ let payload = r#"{
+ "action": "review_requested"
+ }"#;
+
+ let json = json::parse(payload)
+ .expect("Failed to parse payload.");
+
+ assert_eq!(
+ pull_request_opened_or_synchronized(json),
+ false
+ );
+ }
}