From patchwork Thu Feb 8 02:01:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Donnellan X-Patchwork-Id: 870706 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zcM3b5FfBz9t32 for ; Thu, 8 Feb 2018 13:05:31 +1100 (AEDT) Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3zcM3Z6L4BzF15T for ; Thu, 8 Feb 2018 13:05:30 +1100 (AEDT) X-Original-To: snowpatch@lists.ozlabs.org Delivered-To: snowpatch@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=au1.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=andrew.donnellan@au1.ibm.com; receiver=) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3zcLzj5Q9xzF15t for ; Thu, 8 Feb 2018 13:02:09 +1100 (AEDT) Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w18202BR039905 for ; Wed, 7 Feb 2018 21:02:07 -0500 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0a-001b2d01.pphosted.com with ESMTP id 2g0bcuc45h-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 07 Feb 2018 21:02:06 -0500 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 8 Feb 2018 02:02:03 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 8 Feb 2018 02:02:01 -0000 Received: from d06av24.portsmouth.uk.ibm.com (mk.ibm.com [9.149.105.60]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w18221rK983386; Thu, 8 Feb 2018 02:02:01 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DD4B642047; Thu, 8 Feb 2018 01:54:56 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 054C74204D; Thu, 8 Feb 2018 01:54:56 +0000 (GMT) Received: from ozlabs.au.ibm.com (unknown [9.192.253.14]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Thu, 8 Feb 2018 01:54:55 +0000 (GMT) Received: from intelligence.ozlabs.ibm.com (haven.au.ibm.com [9.192.254.114]) (using TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.au.ibm.com (Postfix) with ESMTPSA id 97796A01C3; Thu, 8 Feb 2018 13:01:58 +1100 (AEDT) From: Andrew Donnellan To: snowpatch@lists.ozlabs.org Date: Thu, 8 Feb 2018 13:01:37 +1100 X-Mailer: git-send-email 2.11.0 X-TM-AS-GCONF: 00 x-cbid: 18020802-0016-0000-0000-000005208BB3 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020802-0017-0000-0000-0000285D4376 Message-Id: <20180208020140.20903-1-andrew.donnellan@au1.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-07_09:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802080018 X-Mailman-Approved-At: Thu, 08 Feb 2018 13:05:21 +1100 Subject: [snowpatch] [PATCH 1/4] Upstream Patchwork support X-BeenThere: snowpatch@lists.ozlabs.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Continuous Integration for patch-based workflows List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: snowpatch-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "snowpatch" From: Russell Currey Implement support for the patch and series models in upstream Patchwork. In order to support this different API, snowpatch has been re-architected around having distinct concepts of patches and series. Instead of treating every patch as a series, we instead operate on every patch, and for patches that are in the middle of a series, we apply all of its dependencies before testing. Signed-off-by: Russell Currey Co-authored-by: Andrew Donnellan [ajd: rebase on serde changes, lots of fixes, token authentication] Signed-off-by: Andrew Donnellan --- README.md | 2 +- src/jenkins.rs | 14 ++- src/main.rs | 160 ++++++++++++++++++++++--------- src/patchwork.rs | 286 +++++++++++++++++++++++++++++++++++++++++++------------ src/settings.rs | 3 + 5 files changed, 353 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index 917db6af3abf..6096bdc41c36 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ patches, applies patches on top of an existing tree, triggers appropriate builds and test suites, and reports the results. At present, snowpatch supports -[patchwork-freedesktop](http://github.com/dlespiau/patchwork) and +[Patchwork](http://jk.ozlabs.org/projects/patchwork/) and [Jenkins](http://jenkins-ci.org). snowpatch is named in honour of diff --git a/src/jenkins.rs b/src/jenkins.rs index 85a098b56a45..d8a2068a8169 100644 --- a/src/jenkins.rs +++ b/src/jenkins.rs @@ -108,10 +108,18 @@ impl JenkinsBackend { fn get_api_json_object(&self, base_url: &str) -> Value { // TODO: Don't panic on failure, fail more gracefully let url = format!("{}api/json", base_url); - let mut resp = self.get(&url).send().expect("HTTP request error"); let mut result_str = String::new(); - resp.read_to_string(&mut result_str) - .unwrap_or_else(|err| panic!("Couldn't read from server: {}", err)); + loop { + let mut resp = self.get(&url).send().expect("HTTP request error"); + + if resp.status.is_server_error() { + sleep(Duration::from_millis(JENKINS_POLLING_INTERVAL)); + continue; + } + resp.read_to_string(&mut result_str) + .unwrap_or_else(|err| panic!("Couldn't read from server: {}", err)); + break; + } serde_json::from_str(&result_str).unwrap_or_else( |err| panic!("Couldn't parse JSON from Jenkins: {}", err) ) diff --git a/src/main.rs b/src/main.rs index 9b24385c16c7..2bdf2ac4b314 100644 --- a/src/main.rs +++ b/src/main.rs @@ -73,8 +73,10 @@ mod utils; static USAGE: &'static str = " Usage: - snowpatch [--count= | --series ] [--project ] + snowpatch [--count=] [--project ] snowpatch --mbox --project + snowpatch --patch + snowpatch --series snowpatch -v | --version snowpatch -h | --help @@ -82,6 +84,7 @@ By default, snowpatch runs as a long-running daemon. Options: --count Run tests on recent series. + --patch Run tests on the given Patchwork patch. --series Run tests on the given Patchwork series. --mbox Run tests on the given mbox file. Requires --project --project Test patches for the given project. @@ -93,6 +96,7 @@ Options: struct Args { arg_config_file: String, flag_count: u16, + flag_patch: u32, flag_series: u32, flag_mbox: String, flag_project: String, @@ -135,11 +139,11 @@ fn run_tests(settings: &Config, client: Arc, project: &Project, tag: &st let test_result = jenkins.get_build_result(&build_url_real).unwrap(); info!("Jenkins job for {}/{} complete.", branch_name, job.title); results.push(TestResult { - test_name: format!("Test {} on branch {}", job.title, - branch_name.to_string()).to_string(), + description: Some(format!("Test {} on branch {}", job.title, + branch_name.to_string()).to_string()), state: test_result, - url: Some(jenkins.get_results_url(&build_url_real, &job.parameters)), - summary: Some("TODO: get this summary from Jenkins".to_string()), + context: Some(format!("{}-{}", "snowpatch", job.title.replace("/", "_")).to_string()), + target_url: Some(jenkins.get_results_url(&build_url_real, &job.parameters)), }); } results @@ -199,19 +203,25 @@ fn test_patch(settings: &Config, client: &Arc, project: &Project, path: Ok(_) => { successfully_applied = true; results.push(TestResult { - test_name: "apply_patch".to_string(), state: TestState::Success, - url: None, - summary: Some(format!("Successfully applied to branch {}", branch_name)), + description: Some(format!("{}/{}\n\n{}", + branch_name.to_string(), + "apply_patch".to_string(), + "Successfully applied".to_string()) + .to_string()), + .. Default::default() }); }, Err(_) => { // It didn't apply. No need to bother testing. results.push(TestResult { - test_name: "apply_patch".to_string(), state: TestState::Warning, - url: None, - summary: Some(format!("Failed to apply to branch {}", branch_name)), + description: Some(format!("{}/{}\n\n{}", + branch_name.to_string(), + "apply_patch".to_string(), + "Patch failed to apply".to_string()) + .to_string()), + .. Default::default() }); continue; } @@ -234,10 +244,9 @@ fn test_patch(settings: &Config, client: &Arc, project: &Project, path: if !successfully_applied { results.push(TestResult { - test_name: "apply_patch".to_string(), state: TestState::Fail, - url: None, - summary: Some("Failed to apply to any branch".to_string()), + description: Some("Failed to apply to any branch".to_string()), + .. Default::default() }); } results @@ -293,14 +302,15 @@ fn main() { }); let mut patchwork = PatchworkServer::new(&settings.patchwork.url, &client); - if settings.patchwork.user.is_some() { - debug!("Patchwork authentication set for user {}", - &settings.patchwork.user.clone().unwrap()); - patchwork.set_authentication(&settings.patchwork.user.clone().unwrap(), - &settings.patchwork.pass.clone()); - } + patchwork.set_authentication(&settings.patchwork.user, + &settings.patchwork.pass, + &settings.patchwork.token); let patchwork = patchwork; + if args.flag_series > 0 && args.flag_patch > 0 { + panic!("Can't specify both --series and --patch"); + } + if args.flag_mbox != "" && args.flag_project != "" { info!("snowpatch is testing a local patch."); let patch = Path::new(&args.flag_mbox); @@ -314,64 +324,120 @@ fn main() { return; } + if args.flag_patch > 0 { + info!("snowpatch is testing a patch from Patchwork."); + let patch = patchwork.get_patch(&(args.flag_patch as u64)).unwrap(); + match settings.projects.get(&patch.project.link_name) { + None => panic!("Couldn't find project {}", &patch.project.link_name), + Some(project) => { + let mbox = if patch.has_series() { + let dependencies = patchwork.get_patch_dependencies(&patch); + patchwork.get_patches_mbox(dependencies) + } else { + patchwork.get_patch_mbox(&patch) + }; + test_patch(&settings, &client, project, &mbox); + } + } + return; + } + if args.flag_series > 0 { info!("snowpatch is testing a series from Patchwork."); let series = patchwork.get_series(&(args.flag_series as u64)).unwrap(); - match settings.projects.get(&series.project.linkname) { - None => panic!("Couldn't find project {}", &series.project.linkname), + // The last patch in the series, so its dependencies are the whole series + let patch = patchwork.get_patch_by_url(&series.patches.last().unwrap().url).unwrap(); + // We have to do it this way since there's no project field on Series + let project = patchwork.get_project(&patch.project.name).unwrap(); + match settings.projects.get(&project.link_name) { + None => panic!("Couldn't find project {}", &project.link_name), Some(project) => { - let patch = patchwork.get_patch(&series); - test_patch(&settings, &client, project, &patch); + let dependencies = patchwork.get_patch_dependencies(&patch); + let mbox = patchwork.get_patches_mbox(dependencies); + test_patch(&settings, &client, project, &mbox); } } - return; } - // The number of series tested so far. If --count isn't provided, this is unused. - let mut series_count = 0; + // The number of patches tested so far. If --count isn't provided, this is unused. + let mut patch_count = 0; - // Poll patchwork for new series. For each series, get patches, apply and test. + /* + * Poll Patchwork for new patches. + * If the patch is standalone (not part of a series), apply it. + * If the patch is part of a series, apply all of its dependencies. + * Spawn tests. + */ 'daemon: loop { - let series_list = patchwork.get_series_query().unwrap().results.unwrap(); + let patch_list = patchwork.get_patch_query().unwrap_or_else( + |err| panic!("Failed to obtain patch list: {}", err)); info!("snowpatch is ready to test new revisions from Patchwork."); - for series in series_list { + for patch in patch_list { // If it's already been tested, we can skip it - if series.test_state.is_some() { - debug!("Skipping already tested series {} ({})", series.name, series.id); + if patch.check != "pending" { + debug!("Skipping already tested patch {}", patch.name); + continue; + } + + if !patch.action_required() { + debug!("Skipping patch {} in state {}", patch.name, patch.state); continue; } + //let project = patchwork.get_project(&patch.project).unwrap(); // Skip if we're using -p and it's the wrong project - if args.flag_project != "" && series.project.linkname != args.flag_project { - debug!("Skipping series {} ({}) (wrong project: {})", - series.name, series.id, series.project.linkname); + if args.flag_project != "" && patch.project.link_name != args.flag_project { + debug!("Skipping patch {} ({}) (wrong project: {})", + patch.name, patch.id, patch.project.link_name); continue; } - match settings.projects.get(&series.project.linkname) { + match settings.projects.get(&patch.project.link_name) { None => { - debug!("Project {} not configured for series {} ({})", - &series.project.linkname, series.name, series.id); + debug!("Project {} not configured for patch {}", + &patch.project.link_name, patch.name); continue; }, Some(project) => { - let patch = patchwork.get_patch(&series); - let results = test_patch(&settings, &client, project, &patch); + // TODO(ajd): Refactor this. + let mbox = if patch.has_series() { + debug!("Patch {} has a series at {}!", &patch.name, &patch.series[0].url); + let series = patchwork.get_series_by_url(&patch.series[0].url); + match series { + Ok(series) => { + if !series.received_all { + debug!("Series is incomplete, skipping patch for now"); + continue; + } + let dependencies = patchwork.get_patch_dependencies(&patch); + patchwork.get_patches_mbox(dependencies) + + }, + Err(e) => { + debug!("Series is not OK: {}", e); + patchwork.get_patch_mbox(&patch) + } + } + } else { + patchwork.get_patch_mbox(&patch) + }; + + let results = test_patch(&settings, &client, project, &mbox); + // Delete the temporary directory with the patch in it - fs::remove_dir_all(patch.parent().unwrap()).unwrap_or_else( + fs::remove_dir_all(mbox.parent().unwrap()).unwrap_or_else( |err| error!("Couldn't delete temp directory: {}", err)); if project.push_results { for result in results { - patchwork.post_test_result(result, &series.id, - &series.version).unwrap(); + patchwork.post_test_result(result, &patch.checks).unwrap(); } } if args.flag_count > 0 { - series_count += 1; - debug!("Tested {} series out of {}", - series_count, args.flag_count); - if series_count >= args.flag_count { + patch_count += 1; + debug!("Tested {} patches out of {}", + patch_count, args.flag_count); + if patch_count >= args.flag_count { break 'daemon; } } diff --git a/src/patchwork.rs b/src/patchwork.rs index cf41a52857b3..17d72a2b91b0 100644 --- a/src/patchwork.rs +++ b/src/patchwork.rs @@ -18,8 +18,9 @@ use std; use std::io::{self}; use std::option::Option; use std::path::PathBuf; -use std::fs::File; +use std::fs::{File, OpenOptions}; use std::result::Result; +use std::collections::BTreeMap; use tempdir::TempDir; @@ -31,56 +32,130 @@ use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value}; use hyper::status::StatusCode; use hyper::client::response::Response; +use serde::{self, Serializer}; use serde_json; use utils; // TODO: more constants. constants for format strings of URLs and such. pub static PATCHWORK_API: &'static str = "/api/1.0"; -pub static PATCHWORK_QUERY: &'static str = "?ordering=-last_updated&related=expand"; +pub static PATCHWORK_QUERY: &'static str = "?order=-id"; -// /api/1.0/projects/*/series/ +#[derive(Deserialize, Clone)] +pub struct SubmitterSummary { + pub id: u64, + pub url: String, + pub name: String, + pub email: String +} + +#[derive(Deserialize, Clone)] +pub struct DelegateSummary { + pub id: u64, + pub url: String, + pub first_name: String, + pub last_name: String, + pub email: String +} +// /api/1.0/projects/{id} #[derive(Deserialize, Clone)] pub struct Project { pub id: u64, + pub url: String, pub name: String, - pub linkname: String, - pub listemail: String, + pub link_name: String, + pub list_email: String, + pub list_id: String, pub web_url: Option, pub scm_url: Option, - pub webscm_url: Option + pub webscm_url: Option, +} + +// /api/1.0/patches/ +// This omits fields from /patches/{id}, deal with it for now. + +#[derive(Deserialize, Clone)] +pub struct Patch { + pub id: u64, + pub url: String, + pub project: Project, + pub msgid: String, + pub date: String, + pub name: String, + pub commit_ref: Option, + pub pull_url: Option, + pub state: String, // TODO enum of possible states + pub archived: bool, + pub hash: Option, + pub submitter: SubmitterSummary, + pub delegate: Option, + pub mbox: String, + pub series: Vec, + pub check: String, // TODO enum of possible states + pub checks: String, + pub tags: BTreeMap +} + +impl Patch { + pub fn has_series(&self) -> bool { + !&self.series.is_empty() + } + + pub fn action_required(&self) -> bool { + &self.state == "new" || &self.state == "under-review" + } +} + +#[derive(Deserialize, Clone)] +pub struct PatchSummary { + pub date: String, + pub id: u64, + pub mbox: String, + pub msgid: String, + pub name: String, + pub url: String } #[derive(Deserialize, Clone)] -pub struct Submitter { +pub struct CoverLetter { + pub date: String, pub id: u64, - pub name: String + pub msgid: String, + pub name: String, + pub url: String } +// /api/1.0/series/ +// The series list and /series/{id} are the same, luckily #[derive(Deserialize, Clone)] pub struct Series { + pub cover_letter: Option, + pub date: String, pub id: u64, + pub mbox: String, + pub name: Option, + pub patches: Vec, pub project: Project, - pub name: String, - pub n_patches: u64, - pub submitter: Submitter, - pub submitted: String, - pub last_updated: String, - pub version: u64, - pub reviewer: Option, - pub test_state: Option + pub received_all: bool, + pub received_total: u64, + pub submitter: SubmitterSummary, + pub total: u64, + pub url: String, + pub version: u64 } -#[derive(Deserialize)] -pub struct SeriesList { - pub count: u64, - pub next: Option, - pub previous: Option, - pub results: Option> +#[derive(Deserialize, Clone)] +pub struct SeriesSummary { + pub id: u64, + pub url: String, + pub date: String, + pub name: Option, + pub version: u64, + pub mbox: String, } -#[derive(Serialize, Clone)] +#[derive(Serialize, Clone, PartialEq)] pub enum TestState { #[serde(rename = "pending")] Pending, @@ -99,12 +174,39 @@ impl Default for TestState { } // /api/1.0/series/*/revisions/*/test-results/ -#[derive(Serialize)] +#[derive(Serialize, Default, Clone)] pub struct TestResult { - pub test_name: String, pub state: TestState, - pub url: Option, - pub summary: Option + #[serde(serialize_with = "TestResult::serialize_target_url")] + pub target_url: Option, + pub description: Option, + #[serde(serialize_with = "TestResult::serialize_context")] + pub context: Option, +} + +impl TestResult { + fn serialize_target_url(target_url: &Option, ser: S) + -> Result where S: Serializer { + if target_url.is_none() { + serde::Serialize::serialize(&Some("http://no.url".to_string()), ser) + } else { + serde::Serialize::serialize(target_url, ser) + } + } + + fn serialize_context(context: &Option, ser: S) + -> Result where S: Serializer { + if context.is_none() { + serde::Serialize::serialize( + &Some(format!("{}-{}", + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_VERSION")).to_string() + .replace(".", "_")), + ser) + } else { + serde::Serialize::serialize(context, ser) + } + } } pub struct PatchworkServer { @@ -133,14 +235,31 @@ impl PatchworkServer { } #[cfg_attr(feature="cargo-clippy", allow(ptr_arg))] - pub fn set_authentication(&mut self, username: &String, password: &Option) { - self.headers.set(Authorization(Basic { - username: username.clone(), - password: password.clone(), - })); + pub fn set_authentication(&mut self, username: &Option, + password: &Option, + token: &Option) { + match (username, password, token) { + (&None, &None, &Some(ref token)) => { + self.headers.set(Authorization( + format!("Token {}", token))); + }, + (&Some(ref username), &Some(ref password), &None) => { + self.headers.set(Authorization(Basic { + username: username.clone(), + password: Some(password.clone()), + })); + }, + _ => panic!("Invalid patchwork authentication details"), + } } - fn get(&self, url: &str) -> std::result::Result { + pub fn get_url(&self, url: &str) + -> std::result::Result { + self.client.get(&*url).headers(self.headers.clone()) + .header(Connection::close()).send() + } + + pub fn get_url_string(&self, url: &str) -> std::result::Result { let mut resp = try!(self.client.get(&*url).headers(self.headers.clone()) .header(Connection::close()).send()); let mut body: Vec = vec![]; @@ -148,51 +267,63 @@ impl PatchworkServer { Ok(String::from_utf8(body).unwrap()) } - pub fn post_test_result(&self, result: TestResult, - series_id: &u64, series_revision: &u64) + pub fn post_test_result(&self, result: TestResult, checks_url: &str) -> Result { let encoded = serde_json::to_string(&result).unwrap(); let headers = self.headers.clone(); debug!("JSON Encoded: {}", encoded); - let res = try!(self.client.post(&format!( - "{}{}/series/{}/revisions/{}/test-results/", - &self.url, PATCHWORK_API, &series_id, &series_revision)) - .headers(headers).body(&encoded).send()); - assert_eq!(res.status, hyper::status::StatusCode::Created); - Ok(res.status) + let mut resp = try!(self.client.post(checks_url) + .headers(headers).body(&encoded).send()); + let mut body: Vec = vec![]; + io::copy(&mut resp, &mut body).unwrap(); + trace!("{}", String::from_utf8(body).unwrap()); + assert_eq!(resp.status, hyper::status::StatusCode::Created); + Ok(resp.status) } - pub fn get_series(&self, series_id: &u64) -> Result { - let url = format!("{}{}/series/{}{}", &self.url, PATCHWORK_API, - series_id, PATCHWORK_QUERY); - serde_json::from_str(&self.get(&url).unwrap()) + pub fn get_project(&self, url: &str) -> Result { + serde_json::from_str(&self.get_url_string(url).unwrap()) } - pub fn get_series_mbox(&self, series_id: &u64, series_revision: &u64) - -> std::result::Result { - let url = format!("{}{}/series/{}/revisions/{}/mbox/", - &self.url, PATCHWORK_API, series_id, series_revision); - self.client.get(&*url).headers(self.headers.clone()) - .header(Connection::close()).send() + pub fn get_patch(&self, patch_id: &u64) -> Result { + let url = format!("{}{}/patches/{}{}", &self.url, PATCHWORK_API, + patch_id, PATCHWORK_QUERY); + serde_json::from_str(&self.get_url_string(&url).unwrap()) + } + + pub fn get_patch_by_url(&self, url: &str) -> Result { + serde_json::from_str(&self.get_url_string(url).unwrap()) } - pub fn get_series_query(&self) -> Result { - let url = format!("{}{}/series/{}", &self.url, - PATCHWORK_API, PATCHWORK_QUERY); - serde_json::from_str(&self.get(&url).unwrap_or_else( + pub fn get_patch_query(&self) -> Result, serde_json::Error> { + let url = format!("{}{}/patches/{}", &self.url, PATCHWORK_API, PATCHWORK_QUERY); + serde_json::from_str(&self.get_url_string(&url).unwrap_or_else( |err| panic!("Failed to connect to Patchwork: {}", err))) } - pub fn get_patch(&self, series: &Series) -> PathBuf { + pub fn get_patch_dependencies(&self, patch: &Patch) -> Vec { + // We assume the list of patches in a series are in order. + let mut dependencies: Vec = vec!(); + let series = self.get_series_by_url(&patch.series[0].url); + if series.is_err() { + return dependencies; + } + for dependency in series.unwrap().patches { + dependencies.push(self.get_patch_by_url(&dependency.url).unwrap()); + if dependency.url == patch.url { + break; + } + } + dependencies + } + + pub fn get_patch_mbox(&self, patch: &Patch) -> PathBuf { let dir = TempDir::new("snowpatch").unwrap().into_path(); let mut path = dir.clone(); - let tag = utils::sanitise_path( - format!("{}-{}-{}", series.submitter.name, - series.id, series.version)); + let tag = utils::sanitise_path(patch.name.clone()); path.push(format!("{}.mbox", tag)); - let mut mbox_resp = self.get_series_mbox(&series.id, &series.version) - .unwrap(); + let mut mbox_resp = self.get_url(&patch.mbox).unwrap(); debug!("Saving patch to file {}", path.display()); let mut mbox = File::create(&path).unwrap_or_else( @@ -201,4 +332,37 @@ impl PatchworkServer { |err| panic!("Couldn't save mbox from Patchwork: {}", err)); path } + + pub fn get_patches_mbox(&self, patches: Vec) -> PathBuf { + let dir = TempDir::new("snowpatch").unwrap().into_path(); + let mut path = dir.clone(); + let tag = utils::sanitise_path(patches.last().unwrap().name.clone()); + path.push(format!("{}.mbox", tag)); + + let mut mbox = OpenOptions::new() + .create(true) + .write(true) + .append(true) + .open(&path) + .unwrap_or_else(|err| panic!("Couldn't make file: {}", err)); + + for patch in patches { + let mut mbox_resp = self.get_url(&patch.mbox).unwrap(); + debug!("Appending patch {} to file {}", patch.name, path.display()); + io::copy(&mut mbox_resp, &mut mbox).unwrap_or_else( + |err| panic!("Couldn't save mbox from Patchwork: {}", err)); + } + path + } + + pub fn get_series(&self, series_id: &u64) -> Result { + let url = format!("{}{}/series/{}{}", &self.url, PATCHWORK_API, + series_id, PATCHWORK_QUERY); + serde_json::from_str(&self.get_url_string(&url).unwrap()) + } + + pub fn get_series_by_url(&self, url: &str) -> Result { + serde_json::from_str(&self.get_url_string(url).unwrap()) + } + } diff --git a/src/settings.rs b/src/settings.rs index 363edc7e386a..ad5f483d579b 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -39,8 +39,10 @@ pub struct Git { pub struct Patchwork { pub url: String, pub port: Option, + // TODO: Enforce (user, pass) XOR token pub user: Option, pub pass: Option, + pub token: Option, pub polling_interval: u64, } @@ -63,6 +65,7 @@ pub struct Project { pub remote_uri: String, pub jobs: Vec, pub push_results: bool, + pub category: Option, } impl Project { From patchwork Thu Feb 8 02:01:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Donnellan X-Patchwork-Id: 870704 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zcM3T2CrWz9t32 for ; Thu, 8 Feb 2018 13:05:25 +1100 (AEDT) Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3zcM3S6qkVzF15t for ; Thu, 8 Feb 2018 13:05:24 +1100 (AEDT) X-Original-To: snowpatch@lists.ozlabs.org Delivered-To: snowpatch@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=au1.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=andrew.donnellan@au1.ibm.com; receiver=) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3zcLzj2DLPzF15j for ; Thu, 8 Feb 2018 13:02:08 +1100 (AEDT) Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w18219Ao120952 for ; Wed, 7 Feb 2018 21:02:06 -0500 Received: from e06smtp13.uk.ibm.com (e06smtp13.uk.ibm.com [195.75.94.109]) by mx0a-001b2d01.pphosted.com with ESMTP id 2g0d9ur960-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 07 Feb 2018 21:02:05 -0500 Received: from localhost by e06smtp13.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 8 Feb 2018 02:02:03 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp13.uk.ibm.com (192.168.101.143) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 8 Feb 2018 02:02:01 -0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w18220Xa37289998; Thu, 8 Feb 2018 02:02:00 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C068011C073; Thu, 8 Feb 2018 01:55:22 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3054311C052; Thu, 8 Feb 2018 01:55:22 +0000 (GMT) Received: from ozlabs.au.ibm.com (unknown [9.192.253.14]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP; Thu, 8 Feb 2018 01:55:22 +0000 (GMT) Received: from intelligence.ozlabs.ibm.com (haven.au.ibm.com [9.192.254.114]) (using TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.au.ibm.com (Postfix) with ESMTPSA id B15C3A025B; Thu, 8 Feb 2018 13:01:58 +1100 (AEDT) From: Andrew Donnellan To: snowpatch@lists.ozlabs.org Date: Thu, 8 Feb 2018 13:01:38 +1100 X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180208020140.20903-1-andrew.donnellan@au1.ibm.com> References: <20180208020140.20903-1-andrew.donnellan@au1.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18020802-0012-0000-0000-000005AC83AC X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020802-0013-0000-0000-000019283C9B Message-Id: <20180208020140.20903-2-andrew.donnellan@au1.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-07_09:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802080018 X-Mailman-Approved-At: Thu, 08 Feb 2018 13:05:20 +1100 Subject: [snowpatch] [PATCH 2/4] Hefty tests X-BeenThere: snowpatch@lists.ozlabs.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Continuous Integration for patch-based workflows List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: snowpatch-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "snowpatch" From: Russell Currey Hefty tests are a method of defining a test that should not be run on every patch of a series. Testing every patch in a series can be a large resource commitment, and in a lot of cases should just be a smoke test for bisectability. If "hefty = true" is set in a job, then it will only be run on "complete" series - a single patch, or the last patch in a series and its dependencies. Signed-off-by: Russell Currey [ajd: rebase on serde and patchwork API changes] Signed-off-by: Andrew Donnellan --- examples/openpower.toml | 2 ++ src/main.rs | 24 +++++++++++++++++------- src/settings.rs | 10 ++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/examples/openpower.toml b/examples/openpower.toml index 98e383a5d606..c3aedc5f0a57 100644 --- a/examples/openpower.toml +++ b/examples/openpower.toml @@ -67,6 +67,7 @@ token = "33333333333333333333333333333333" remote = "GIT_REPO" branch = "GIT_REF" artifact = "snowpatch.txt" + hefty = true DEFCONFIG_TO_USE = "pseries_le_defconfig" [[projects.linuxppc-dev.jobs]] @@ -74,4 +75,5 @@ token = "33333333333333333333333333333333" remote = "GIT_REPO" branch = "GIT_REF" artifact = "snowpatch.txt" + hefty = false DEFCONFIG_TO_USE = "ppc64le_defconfig" diff --git a/src/main.rs b/src/main.rs index 2bdf2ac4b314..82beac6b2ab3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -103,7 +103,7 @@ struct Args { } fn run_tests(settings: &Config, client: Arc, project: &Project, tag: &str, - branch_name: &str) -> Vec { + branch_name: &str, hefty_tests: bool) -> Vec { let mut results: Vec = Vec::new(); let jenkins = JenkinsBackend { base_url: settings.jenkins.url.clone(), @@ -113,6 +113,10 @@ fn run_tests(settings: &Config, client: Arc, project: &Project, tag: &st }; let project = project.clone(); for job in &project.jobs { + if !hefty_tests && job.hefty { + debug!("Skipping hefty test {}", job.title); + continue; + } let mut jenkins_params = Vec::<(&str, &str)>::new(); for (param_name, param_value) in job.parameters.iter() { // TODO(ajd): do this more neatly @@ -149,7 +153,8 @@ fn run_tests(settings: &Config, client: Arc, project: &Project, tag: &st results } -fn test_patch(settings: &Config, client: &Arc, project: &Project, path: &Path) -> Vec { +fn test_patch(settings: &Config, client: &Arc, project: &Project, + path: &Path, hefty_tests: bool) -> Vec { let repo = project.get_repo().unwrap(); let mut results: Vec = Vec::new(); if !path.is_file() { @@ -235,7 +240,8 @@ fn test_patch(settings: &Config, client: &Arc, project: &Project, path: // We've set up a remote branch, time to kick off tests let test = thread::Builder::new().name(tag.to_string()).spawn(move || { - run_tests(&settings_clone, client, &project, &tag, &branch_name) + run_tests(&settings_clone, client, &project, &tag, &branch_name, + hefty_tests) }).unwrap(); results.append(&mut test.join().unwrap()); @@ -317,7 +323,7 @@ fn main() { match settings.projects.get(&args.flag_project) { None => panic!("Couldn't find project {}", args.flag_project), Some(project) => { - test_patch(&settings, &client, project, patch); + test_patch(&settings, &client, project, patch, true); } } @@ -336,7 +342,7 @@ fn main() { } else { patchwork.get_patch_mbox(&patch) }; - test_patch(&settings, &client, project, &mbox); + test_patch(&settings, &client, project, &mbox, true); } } return; @@ -354,7 +360,7 @@ fn main() { Some(project) => { let dependencies = patchwork.get_patch_dependencies(&patch); let mbox = patchwork.get_patches_mbox(dependencies); - test_patch(&settings, &client, project, &mbox); + test_patch(&settings, &client, project, &mbox, true); } } return; @@ -401,6 +407,7 @@ fn main() { }, Some(project) => { // TODO(ajd): Refactor this. + let hefty_tests; let mbox = if patch.has_series() { debug!("Patch {} has a series at {}!", &patch.name, &patch.series[0].url); let series = patchwork.get_series_by_url(&patch.series[0].url); @@ -411,19 +418,22 @@ fn main() { continue; } let dependencies = patchwork.get_patch_dependencies(&patch); + hefty_tests = dependencies.len() == series.patches.len(); patchwork.get_patches_mbox(dependencies) }, Err(e) => { debug!("Series is not OK: {}", e); + hefty_tests = true; patchwork.get_patch_mbox(&patch) } } } else { + hefty_tests = true; patchwork.get_patch_mbox(&patch) }; - let results = test_patch(&settings, &client, project, &mbox); + let results = test_patch(&settings, &client, project, &mbox, hefty_tests); // Delete the temporary directory with the patch in it fs::remove_dir_all(mbox.parent().unwrap()).unwrap_or_else( diff --git a/src/settings.rs b/src/settings.rs index ad5f483d579b..7e3c87ddd0ac 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -80,6 +80,7 @@ pub struct Job { pub title: String, pub remote: String, pub branch: String, + pub hefty: bool, pub parameters: BTreeMap, } @@ -103,6 +104,7 @@ impl<'de> Deserialize<'de> for Job { let mut title = None; let mut remote = None; let mut branch = None; + let mut hefty = None; let mut parameters = BTreeMap::new(); while let Some(key) = map.next_key::()? { match key.as_str() { @@ -130,6 +132,12 @@ impl<'de> Deserialize<'de> for Job { } branch = Some(map.next_value()?); } + "hefty" => { + if hefty.is_some() { + return Err(de::Error::duplicate_field("hefty")); + } + hefty = Some(map.next_value()?); + } _ => { parameters.insert(key, map.next_value()?); } @@ -140,12 +148,14 @@ impl<'de> Deserialize<'de> for Job { let remote = remote.ok_or_else(|| de::Error::missing_field("remote"))?; let branch = branch.ok_or_else(|| de::Error::missing_field("branch"))?; let title = title.unwrap_or(job.clone()); + let hefty = hefty.unwrap_or(false); Ok(Job { job: job, title: title, remote: remote, branch: branch, + hefty: hefty, parameters: parameters, }) } From patchwork Thu Feb 8 02:01:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Donnellan X-Patchwork-Id: 870705 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zcM3W5VzFz9t42 for ; Thu, 8 Feb 2018 13:05:27 +1100 (AEDT) Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3zcM3W3vGdzF15T for ; Thu, 8 Feb 2018 13:05:27 +1100 (AEDT) X-Original-To: snowpatch@lists.ozlabs.org Delivered-To: snowpatch@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=au1.ibm.com (client-ip=148.163.158.5; helo=mx0a-001b2d01.pphosted.com; envelope-from=andrew.donnellan@au1.ibm.com; receiver=) Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3zcLzj2DPkzF15l for ; Thu, 8 Feb 2018 13:02:08 +1100 (AEDT) Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w1820LRa187249 for ; Wed, 7 Feb 2018 21:02:06 -0500 Received: from e06smtp11.uk.ibm.com (e06smtp11.uk.ibm.com [195.75.94.107]) by mx0b-001b2d01.pphosted.com with ESMTP id 2g0d9u07qe-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 07 Feb 2018 21:02:05 -0500 Received: from localhost by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 8 Feb 2018 02:02:03 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp11.uk.ibm.com (192.168.101.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 8 Feb 2018 02:02:01 -0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w182201R43843662; Thu, 8 Feb 2018 02:02:00 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D7A99AE05F; Thu, 8 Feb 2018 01:53:12 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8F714AE059; Thu, 8 Feb 2018 01:53:12 +0000 (GMT) Received: from ozlabs.au.ibm.com (unknown [9.192.253.14]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTP; Thu, 8 Feb 2018 01:53:12 +0000 (GMT) Received: from intelligence.ozlabs.ibm.com (haven.au.ibm.com [9.192.254.114]) (using TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.au.ibm.com (Postfix) with ESMTPSA id B7882A0273; Thu, 8 Feb 2018 13:01:58 +1100 (AEDT) From: Andrew Donnellan To: snowpatch@lists.ozlabs.org Date: Thu, 8 Feb 2018 13:01:39 +1100 X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180208020140.20903-1-andrew.donnellan@au1.ibm.com> References: <20180208020140.20903-1-andrew.donnellan@au1.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18020802-0040-0000-0000-0000042D8F5D X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020802-0041-0000-0000-000020D143BC Message-Id: <20180208020140.20903-3-andrew.donnellan@au1.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-07_09:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802080018 X-Mailman-Approved-At: Thu, 08 Feb 2018 13:05:21 +1100 Subject: [snowpatch] [PATCH 3/4] Add warn-on-fail for non-critical tests X-BeenThere: snowpatch@lists.ozlabs.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Continuous Integration for patch-based workflows List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: snowpatch-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "snowpatch" From: Russell Currey Signed-off-by: Russell Currey [ajd: rebase on serde changes] Signed-off-by: Andrew Donnellan --- src/main.rs | 5 ++++- src/settings.rs | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 82beac6b2ab3..b1b143babdcc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -140,8 +140,11 @@ fn run_tests(settings: &Config, client: Arc, project: &Project, tag: &st } debug!("Build URL: {}", build_url_real); jenkins.wait_build(&build_url_real); - let test_result = jenkins.get_build_result(&build_url_real).unwrap(); + let mut test_result = jenkins.get_build_result(&build_url_real).unwrap(); info!("Jenkins job for {}/{} complete.", branch_name, job.title); + if test_result == TestState::Fail && job.warn_on_fail { + test_result = TestState::Warning; + } results.push(TestResult { description: Some(format!("Test {} on branch {}", job.title, branch_name.to_string()).to_string()), diff --git a/src/settings.rs b/src/settings.rs index 7e3c87ddd0ac..0ce70313b3dd 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -81,6 +81,7 @@ pub struct Job { pub remote: String, pub branch: String, pub hefty: bool, + pub warn_on_fail: bool, pub parameters: BTreeMap, } @@ -105,6 +106,7 @@ impl<'de> Deserialize<'de> for Job { let mut remote = None; let mut branch = None; let mut hefty = None; + let mut warn_on_fail = None; let mut parameters = BTreeMap::new(); while let Some(key) = map.next_key::()? { match key.as_str() { @@ -138,6 +140,12 @@ impl<'de> Deserialize<'de> for Job { } hefty = Some(map.next_value()?); } + "warn_on_fail" => { + if warn_on_fail.is_some() { + return Err(de::Error::duplicate_field("warn_on_fail")); + } + warn_on_fail = Some(map.next_value()?); + } _ => { parameters.insert(key, map.next_value()?); } @@ -149,6 +157,7 @@ impl<'de> Deserialize<'de> for Job { let branch = branch.ok_or_else(|| de::Error::missing_field("branch"))?; let title = title.unwrap_or(job.clone()); let hefty = hefty.unwrap_or(false); + let warn_on_fail = warn_on_fail.unwrap_or(false); Ok(Job { job: job, @@ -156,6 +165,7 @@ impl<'de> Deserialize<'de> for Job { remote: remote, branch: branch, hefty: hefty, + warn_on_fail: warn_on_fail, parameters: parameters, }) } From patchwork Thu Feb 8 02:01:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Donnellan X-Patchwork-Id: 870707 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zcM3f2TzFz9t32 for ; Thu, 8 Feb 2018 13:05:34 +1100 (AEDT) Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3zcM3d6DnjzF162 for ; Thu, 8 Feb 2018 13:05:33 +1100 (AEDT) X-Original-To: snowpatch@lists.ozlabs.org Delivered-To: snowpatch@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=au1.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=andrew.donnellan@au1.ibm.com; receiver=) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3zcLzj4vlvzF15n for ; Thu, 8 Feb 2018 13:02:09 +1100 (AEDT) Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w1820S8o042516 for ; Wed, 7 Feb 2018 21:02:07 -0500 Received: from e06smtp15.uk.ibm.com (e06smtp15.uk.ibm.com [195.75.94.111]) by mx0a-001b2d01.pphosted.com with ESMTP id 2g0bcuc46x-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 07 Feb 2018 21:02:06 -0500 Received: from localhost by e06smtp15.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 8 Feb 2018 02:02:03 -0000 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp15.uk.ibm.com (192.168.101.145) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 8 Feb 2018 02:02:01 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w18221mo35127544; Thu, 8 Feb 2018 02:02:01 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3696D4C052; Thu, 8 Feb 2018 01:55:51 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 512734C064; Thu, 8 Feb 2018 01:55:50 +0000 (GMT) Received: from ozlabs.au.ibm.com (unknown [9.192.253.14]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Thu, 8 Feb 2018 01:55:50 +0000 (GMT) Received: from intelligence.ozlabs.ibm.com (haven.au.ibm.com [9.192.254.114]) (using TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.au.ibm.com (Postfix) with ESMTPSA id C46C1A0278; Thu, 8 Feb 2018 13:01:58 +1100 (AEDT) From: Andrew Donnellan To: snowpatch@lists.ozlabs.org Date: Thu, 8 Feb 2018 13:01:40 +1100 X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180208020140.20903-1-andrew.donnellan@au1.ibm.com> References: <20180208020140.20903-1-andrew.donnellan@au1.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18020802-0020-0000-0000-000003F373E5 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020802-0021-0000-0000-00004285F043 Message-Id: <20180208020140.20903-4-andrew.donnellan@au1.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-07_09:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802080018 X-Mailman-Approved-At: Thu, 08 Feb 2018 13:05:21 +1100 Subject: [snowpatch] [PATCH 4/4] Update Cargo.lock X-BeenThere: snowpatch@lists.ozlabs.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Continuous Integration for patch-based workflows List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: snowpatch-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "snowpatch" Signed-off-by: Andrew Donnellan --- Cargo.lock | 535 +++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 304 insertions(+), 231 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97e2d0d577d0..76d9079e2072 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,30 +1,9 @@ -[root] -name = "snowpatch" -version = "0.1.0" -dependencies = [ - "docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "git2 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.10.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-openssl 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "yup-hyper-mock 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "aho-corasick" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -34,46 +13,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "base64" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bitflags" -version = "0.8.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" -version = "1.0.0" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cc" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cfg-if" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cmake" -version = "0.1.23" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "curl-sys" -version = "0.3.11" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -81,105 +72,112 @@ name = "docopt" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "dtoa" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "env_logger" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "foreign-types" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "gcc" -version = "0.3.46" +name = "foreign-types-shared" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "gdi32-sys" -version = "0.2.0" +name = "fuchsia-zircon" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "git2" -version = "0.6.5" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", - "libgit2-sys 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libgit2-sys 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "httparse" -version = "1.2.2" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hyper" -version = "0.10.10" +version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hyper-openssl" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.10.10 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "idna" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -198,26 +196,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "0.2.8" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "lazy_static" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.23" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libgit2-sys" -version = "0.6.10" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cmake 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", - "curl-sys 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", - "gcc 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "curl-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "libssh2-sys 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -226,92 +229,116 @@ name = "libssh2-sys" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cmake 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", + "cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libz-sys" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "matches" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" -version = "1.0.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "mime" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.1.37" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num_cpus" -version = "1.4.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl" -version = "0.9.12" +version = "0.9.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl-probe" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.12" +version = "0.9.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", - "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "pkg-config" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -323,70 +350,73 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rand" -version = "0.3.15" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redox_syscall" -version = "0.1.17" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "rustc-serialize" -version = "0.3.24" +name = "remove_dir_all" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "rustc_version" -version = "0.1.7" +name = "rustc-serialize" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] -name = "semver" -version = "0.1.20" +name = "safemem" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.7" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.7" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive_internals" -version = "0.15.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -395,13 +425,34 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.2" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "snowpatch" +version = "0.1.0" +dependencies = [ + "docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "git2 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-openssl 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yup-hyper-mock 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -429,47 +480,38 @@ dependencies = [ [[package]] name = "tempdir" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread-id" -version = "3.1.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread_local" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "time" -version = "0.1.37" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" -version = "0.4.1" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -484,23 +526,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicase" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-bidi" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-normalization" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -510,7 +552,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unreachable" -version = "0.1.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -518,25 +560,27 @@ dependencies = [ [[package]] name = "url" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "idna 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "user32-sys" -version = "0.2.0" +name = "utf8-ranges" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] -name = "utf8-ranges" -version = "1.0.0" +name = "vcpkg" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "version_check" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -550,88 +594,117 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "winapi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "yup-hyper-mock" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.10.10 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] -"checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699" +"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" -"checksum base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30e93c03064e7590d0466209155251b90c22e37fab1daf2771582598b5827557" -"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" -"checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4" -"checksum byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c40977b0ee6b9885c9013cd41d9feffdd22deb3bb4dc3a71d901cc7a77de18c8" -"checksum cmake 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "92278eb79412c8f75cfc89e707a1bb3a6490b68f7f2e78d15c774f30fe701122" -"checksum curl-sys 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "23e7e544dc5e1ba42c4a4a678bd47985e84b9c3f4d3404c29700622a029db9c3" +"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" +"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" +"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" +"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" +"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "56d741ea7a69e577f6d06b36b7dff4738f680593dc27a701ffa8506b73ce28bb" +"checksum curl-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f46e49c7125131f5afaded06944d6888b55cbdf8eba05dae73c954019b907961" "checksum docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab32ea6e284d87987066f21a9e809a73c14720571ef34516f0890b3d355ccfd8" -"checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90" -"checksum env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e3856f1697098606fc6cb97a93de88ca3f3bc35bb878c725920e6e82ecf05e83" -"checksum foreign-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e4056b9bd47f8ac5ba12be771f77a0dae796d1bbaaf5fd0b9c2d38b69b8a29d" -"checksum gcc 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)" = "181e3cebba1d663bd92eb90e2da787e10597e027eb00de8d742b260a7850948f" -"checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518" -"checksum git2 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9de9df4358c17e448a778d90cd0272e1dab5eae30244502333fa2001c4e24357" -"checksum httparse 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77f756bed9ee3a83ce98774f4155b42a31b787029013f3a7d83eca714e500e21" -"checksum hyper 0.10.10 (registry+https://github.com/rust-lang/crates.io-index)" = "36e108e0b1fa2d17491cbaac4bc460dc0956029d10ccf83c913dd0e5db3e7f07" -"checksum hyper-openssl 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "85a372eb692590b3fe014c196c30f9f52d4c42f58cd49dd94caeee1593c9cc37" -"checksum idna 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2233d4940b1f19f0418c158509cd7396b8d70a5db5705ce410914dc8fa603b37" -"checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c" +"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" +"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" +"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum git2 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ee5b4bb7cd2a44e6e5ee3a26ba6a9ca10d4ce2771cdc3839bbc54b47b7d1be84" +"checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37" +"checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" +"checksum hyper-openssl 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5ecb3cd8e4d53f8abe7cb2227e66674bb63c1bd0ba60ca9ba7b74ea1e0054891" +"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" +"checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf" -"checksum libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)" = "e7eb6b826bfc1fdea7935d46556250d1799b7fe2d9f7951071f4291710665e3e" -"checksum libgit2-sys 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "dd89dd7196d5fa35b659c3eaf3c1b14b9bd961bfd1a07dfca49adeb8a6aa3763" +"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" +"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" +"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum libgit2-sys 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6eeae66e7b1c995de45cb4e65c5ab438a96a7b4077e448645d4048dc753ad357" "checksum libssh2-sys 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0db4ec23611747ef772db1c4d650f8bd762f07b461727ec998f953c614024b75" -"checksum libz-sys 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e5ee912a45d686d393d5ac87fac15ba0ba18daae14e8e7543c63ebf7fb7e970c" -"checksum log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5141eca02775a762cc6cd564d8d2c50f67c0ea3a372cbf1c51592b3e029e10ad" -"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1" -"checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" -"checksum mime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9d69889cdc6336ed56b174514ce876c4c3dc564cc23dd872e7bca589bb2a36c8" -"checksum num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "e1cbfa3781f3fe73dc05321bed52a06d2d491eaa764c52335cf4399f046ece99" -"checksum num_cpus 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca313f1862c7ec3e0dfe8ace9fa91b1d9cb5c84ace3d00f5ec4216238e93c167" -"checksum openssl 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)" = "bb5d1663b73d10c6a3eda53e2e9d0346f822394e7b858d7257718f65f61dfbe2" -"checksum openssl-probe 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d98df0270d404ccd3c050a41d579c52d1db15375168bb3471e04ec0f5f378daf" -"checksum openssl-sys 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)" = "3a5886d87d3e2a0d890bf62dc8944f5e3769a405f7e1e9ef6e517e47fd7a0897" +"checksum libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "87f737ad6cc6fd6eefe3d9dc5412f1573865bded441300904d2f42269e140f16" +"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" +"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" +"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" +"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +"checksum num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7de20f146db9d920c45ee8ed8f71681fd9ade71909b48c3acbd766aa504cf10" +"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum openssl 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)" = "169a4b9160baf9b9b1ab975418c673686638995ba921683a7f1e01470dcb8854" +"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +"checksum openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "14ba54ac7d5a4eabd1d5f2c1fdeb7e7c14debfa669d94b983d01b465e767ba9e" +"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" -"checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" -"checksum redox_syscall 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "29dbdfd4b9df8ab31dec47c6087b7b13cbf4a776f335e4de8efba8288dda075b" -"checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b" -"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db" +"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" +"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" +"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" +"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" +"checksum remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5d2f806b0fcdabd98acd380dc8daef485e22bcb7cddc811d1337967f2528cf5" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" -"checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" -"checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" -"checksum serde 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c0c3d79316a6051231925504f6ef893d45088e8823c77a8331a3dcf427ee9087" -"checksum serde_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0019cd5b9f0529a1a0e145a912e9a2d60c325c58f7f260fc36c71976e9d76aee" -"checksum serde_derive_internals 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "021c338d22c7e30f957a6ab7e388cb6098499dda9fd4ba1661ee074ca7a180d1" -"checksum serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "48b04779552e92037212c3615370f6bd57a40ebba7f20e554ff9f55e41a69a7b" +"checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" +"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" +"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" +"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" +"checksum serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c9db7266c7d63a4c4b7fe8719656ccdd51acf1bed6124b174f933b009fb10bcb" "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6" -"checksum thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df7875b676fddfadffd96deea3b1124e5ede707d4884248931077518cf1f773" -"checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7" -"checksum time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "ffd7ccbf969a892bf83f1e441126968a07a3941c24ff522a26af9f9f4585d1a3" -"checksum toml 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4cc5dbfb20a481e64b99eb7ae280859ec76730c7191570ba5edaa962394edb0a" +"checksum tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f73eebdb68c14bcb24aef74ea96079830e7fa7b31a6106e42ea7ee887c1e134e" +"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" +"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" +"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" -"checksum unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "13a5906ca2b98c799f4b1ab4557b76367ebd6ae5ef14930ec841c74aed5f3764" -"checksum unicode-bidi 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c44d4e7ce691e2538b886bf33669fd6da1653a12d741b9390f351955c0949c03" -"checksum unicode-normalization 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e28fa37426fceeb5cf8f41ee273faa7c82c47dc8fba5853402841e665fcd86ff" +"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" +"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +"checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -"checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" -"checksum url 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5ba8a749fb4479b043733416c244fa9d1d3af3d7c23804944651c8a448cb87e" -"checksum user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47" +"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +"checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" +"checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b" +"checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum yup-hyper-mock 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b19be9a18db9400bac5717cafb85a5d97fe16c5796c63faf3ea73a3e3ec47fe"