├── .gitignore ├── README.md ├── src ├── errors.rs ├── constants.rs └── main.rs ├── Cargo.toml ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sentry Relay -------------------------------------------------------------------------------- /src/errors.rs: -------------------------------------------------------------------------------- 1 | // Create the Error, ErrorKind, ResultExt, and Result types 2 | error_chain! { } 3 | -------------------------------------------------------------------------------- /src/constants.rs: -------------------------------------------------------------------------------- 1 | //! Provides some useful constants. 2 | 3 | /// The default API URL 4 | pub const DEFAULT_URL: &'static str = "https://sentry.io/"; 5 | 6 | /// The version of the library 7 | pub const VERSION: &'static str = env!("CARGO_PKG_VERSION"); 8 | 9 | /// The file extension of the binary (.exe or empty string) 10 | #[cfg(windows)] 11 | pub const EXT: &'static str = ".exe"; 12 | 13 | /// The file extension of the binary (.exe or empty string) 14 | #[cfg(not(windows))] 15 | pub const EXT: &'static str = ""; 16 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "sentry-relay" 3 | version = "0.1.0" 4 | authors = ["Brett Hoerner "] 5 | repository = "https://github.com/getsentry/sentry-relay" 6 | license = "Apache-2.0" 7 | readme = "README.md" 8 | 9 | [dependencies] 10 | backtrace = "^0.3" 11 | log = "^0.3" 12 | env_logger = "^0.4" 13 | error-chain = "^0.10" 14 | serde_json = "^0.9" 15 | serde_derive = "^0.9" 16 | serde = "^0.9" 17 | hyper = "^0.10" 18 | hyper-native-tls = "^0.2" 19 | if_chain = "^0.1" 20 | lazy_static = "^0.2" 21 | clap = "^2.23" 22 | term = "^0.4" 23 | regex = "^0.2" 24 | chrono = "^0.3" 25 | # diesel = "^0.12" -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // VERY basic 'hello, world' version of the relay. I was figuring out Rust. Needs to be 2 | // refactored really badly. 3 | // Requires: https://github.com/getsentry/sentry/tree/feature/relay-config 4 | 5 | extern crate backtrace; 6 | extern crate chrono; 7 | extern crate clap; 8 | extern crate env_logger; 9 | #[macro_use] extern crate error_chain; 10 | #[macro_use] extern crate hyper; 11 | #[macro_use] extern crate if_chain; 12 | #[macro_use] extern crate lazy_static; 13 | #[macro_use] extern crate log; 14 | extern crate regex; 15 | extern crate serde; 16 | #[macro_use] extern crate serde_derive; 17 | extern crate serde_json; 18 | extern crate term; 19 | 20 | mod constants; 21 | mod errors; 22 | 23 | use constants::VERSION; 24 | use errors::*; 25 | 26 | use std::env; 27 | use std::io; 28 | use std::str; 29 | use std::sync::mpsc::{channel, Sender, Receiver}; 30 | use std::sync::Mutex; 31 | use std::thread; 32 | 33 | use clap::{Arg, App, AppSettings}; 34 | use hyper::client::Client; 35 | use hyper::header::{Headers, ContentType, ContentLength, Host}; 36 | use hyper::method::Method; 37 | use hyper::net::HttpListener; 38 | use hyper::server::{Server, Request, Response, Listening}; 39 | use hyper::status::StatusCode; 40 | use hyper::uri::RequestUri; 41 | use regex::Regex; 42 | use serde_json::Value; 43 | 44 | 45 | struct SimpleLogger { 46 | f: Mutex>, 47 | } 48 | 49 | impl log::Log for SimpleLogger { 50 | fn enabled(&self, metadata: &log::LogMetadata) -> bool { 51 | metadata.level() <= log::LogLevel::Info 52 | } 53 | 54 | fn log(&self, record: &log::LogRecord) { 55 | let mut f = self.f.lock().unwrap(); 56 | if self.enabled(record.metadata()) { 57 | writeln!(f, "[{}] {} | {}{}", 58 | chrono::Local::now(), 59 | record.target().split(':').next().unwrap(), 60 | match record.level() { 61 | log::LogLevel::Error => "ERROR: ", 62 | log::LogLevel::Warn => "WARNING: ", 63 | _ => "", 64 | }, 65 | record.args()).ok(); 66 | } 67 | } 68 | } 69 | 70 | fn init_backtrace() { 71 | use backtrace::Backtrace; 72 | use std::panic; 73 | use std::thread; 74 | 75 | panic::set_hook(Box::new(|info| { 76 | let backtrace = Backtrace::new(); 77 | 78 | let thread = thread::current(); 79 | let thread = thread.name().unwrap_or("unnamed"); 80 | 81 | let msg = match info.payload().downcast_ref::<&'static str>() { 82 | Some(s) => *s, 83 | None => { 84 | match info.payload().downcast_ref::() { 85 | Some(s) => &**s, 86 | None => "Box", 87 | } 88 | } 89 | }; 90 | 91 | match info.location() { 92 | Some(location) => { 93 | println!("thread '{}' panicked at '{}': {}:{}\n\n{:?}", 94 | thread, 95 | msg, 96 | location.file(), 97 | location.line(), 98 | backtrace); 99 | } 100 | None => println!("thread '{}' panicked at '{}'{:?}", thread, msg, backtrace), 101 | } 102 | })); 103 | } 104 | 105 | #[derive(Debug)] 106 | struct Config { 107 | bind: String, 108 | sentry_server: String 109 | } 110 | 111 | fn main() { 112 | init_backtrace(); 113 | 114 | let matches = 115 | App::new("sentry-relay") 116 | .about("Sentry Relay") 117 | .version(VERSION) 118 | .arg(Arg::with_name("bind") 119 | .help("Bind to a specific address (ip:port)") 120 | .long("bind") 121 | .value_name("ADDR") 122 | .default_value("0.0.0.0:3000")) 123 | .arg(Arg::with_name("log_level") 124 | .help("The log level for sentry-cli{n}\ 125 | (valid levels: TRACE, DEBUG, INFO, WARN, ERROR)") 126 | .value_name("LOG_LEVEL") 127 | .long("log-level") 128 | .takes_value(true)) 129 | .arg(Arg::with_name("sentry-server") 130 | .help("URL of the Sentry server") 131 | .long("sentry-server") 132 | .value_name("URL") 133 | .default_value("https://sentry.io")) 134 | .get_matches(); 135 | 136 | let default_log_level = log::LogLevelFilter::Warn; 137 | let log_level = match matches.value_of("log_level") { 138 | Some(level_str) => 139 | match level_str.parse() { 140 | Ok(level) => level, 141 | Err(_) => default_log_level 142 | }, 143 | None => default_log_level 144 | }; 145 | 146 | log::set_logger(|max_log_level| { 147 | max_log_level.set(log_level); 148 | Box::new(SimpleLogger { f: Mutex::new(Box::new(io::stderr())) }) 149 | }).ok(); 150 | 151 | let bind = matches.value_of("bind").unwrap(); 152 | let sentry_server = matches.value_of("sentry-server").unwrap(); 153 | let config = Config { 154 | bind: bind.to_owned(), 155 | sentry_server: sentry_server.to_owned() 156 | }; 157 | info!("{:?}", config); 158 | 159 | info!("Starting up Relay"); 160 | run_server(config); 161 | info!("Exiting"); 162 | } 163 | 164 | // Blocks on a guard returned by `handle` 165 | fn run_server(config: Config) { 166 | let listener = HttpListener::new(config.bind).unwrap(); 167 | 168 | // TODO: pass config down to factory that returns real handler closure? 169 | Server::new(listener).handle(proxy_handler).unwrap(); 170 | } 171 | 172 | header! { 173 | (SentryAuth, "X-Sentry-Auth") => [String] 174 | } 175 | 176 | #[derive(Debug, Deserialize, Clone)] 177 | struct Filter { 178 | field: String, 179 | regex: String 180 | } 181 | 182 | fn get_relay_config(project_id: u32, auth_header: String) -> Vec { 183 | let mut headers = Headers::new(); 184 | headers.set(SentryAuth(auth_header)); 185 | 186 | // TODO: config sentry server 187 | let sentry_server = "http://localhost:8000"; 188 | let url = &format!("{}/api/0/relay/config/{}/", sentry_server, project_id); 189 | 190 | let client = Client::new(); 191 | let mut res = client.get(url) 192 | .headers(headers) 193 | .send() 194 | .unwrap(); 195 | 196 | let mut response_body_bytes: Vec = Vec::new(); 197 | ::std::io::copy(&mut res, &mut response_body_bytes).unwrap(); 198 | let response_body = str::from_utf8(&response_body_bytes).unwrap(); 199 | 200 | info!("Fetched relay config from Sentry: {}", response_body); 201 | 202 | let parsed_body: Value = serde_json::from_str(response_body).unwrap(); 203 | 204 | let mut out_filters = vec!(); 205 | if let Value::Array(ref filters) = parsed_body["filters"] { 206 | for filter in filters { 207 | let filter: Filter = serde_json::from_value(filter.clone()).unwrap(); 208 | // info!("filter: {:?}", filter); 209 | out_filters.push(filter) 210 | } 211 | } 212 | 213 | out_filters 214 | } 215 | 216 | fn proxy_handler(mut req: Request, mut resp: Response) { 217 | // TODO: verify path/method 218 | // TODO: verify json/encoding 219 | // TODO: unpack gzip/base64 220 | // TODO: hyper conn pooling? https://hyper.rs/hyper/v0.10.7/hyper/client/pool/index.html 221 | // TODO: hyper client can be reused among threads according to docs (Arc+clone) 222 | // TODO: decouple proxy request with channel? -- always return 200 for valid json...? 223 | // TODO: make destination sentry configurable 224 | // TODO: hit sentry for filter data (every N seconds) -- /api/0/relay/config/ 225 | // TODO: respect 429 or disabled DSN 226 | // TODO: add self-update like sentry-cli has 227 | 228 | lazy_static! { 229 | static ref STORE_PATH_RE: Regex = Regex::new(r"^/api/(\d+)/store/$").unwrap(); 230 | } 231 | 232 | let absolute_path = if_chain! { 233 | if let RequestUri::AbsolutePath(ref uri) = req.uri; 234 | if STORE_PATH_RE.is_match(uri); 235 | then { 236 | uri.clone() 237 | } else { 238 | // TODO: write error body??? 239 | return 240 | } 241 | }; 242 | // info!("absolute_path: {}", absolute_path); 243 | 244 | // TODO: there must be a better way to do this? 245 | let mut request_body_bytes: Vec = Vec::new(); 246 | ::std::io::copy(&mut req, &mut request_body_bytes).unwrap(); 247 | let request_body = str::from_utf8(&request_body_bytes).unwrap(); 248 | let parsed_body: Value = serde_json::from_str(request_body).unwrap(); 249 | 250 | info!("Sentry store request received: '{}...'", &request_body[0..100]); 251 | 252 | let mut headers = req.headers; 253 | // TODO: use configured url, or just clear header and let hyper handle (if it does)? 254 | headers.set(::hyper::header::Host { hostname: "sentry.io".to_owned(), port: None }); 255 | 256 | // if let Some(&SentryAuth(auth)) = headers.get() { 257 | // get_relay_config(1, auth); 258 | // }; 259 | 260 | // TODO: get from request 261 | let auth_header = "Sentry sentry_version=6,sentry_client=raven-java/8.0.2-beb4b,sentry_key=XXX,sentry_secret=XXX" 262 | let filters = get_relay_config(1, auth_header.to_owned()); 263 | let mut send = true; 264 | for filter in filters { 265 | let re = Regex::new(&filter.regex).unwrap(); 266 | 267 | if let Value::String(ref field) = parsed_body[filter.field.clone()] { 268 | info!("Field value: {}={:?}", filter.field.clone(), field); 269 | if re.is_match(field) { 270 | info!("Filter matches, dropping this event."); 271 | send = false; 272 | } 273 | } 274 | } 275 | 276 | if send { 277 | // TODO: config sentry server 278 | // let sentry_url = "http://sentry.io"; 279 | let sentry_url = "http://localhost:8000"; 280 | 281 | let client = Client::new(); 282 | let res = client.post(&format!("{}{}", sentry_url, absolute_path)) 283 | .headers(headers.clone()) // TODO: clone...? 284 | .body(parsed_body.to_string().as_bytes()) 285 | .send() 286 | .unwrap(); 287 | 288 | info!("Sentry response code status: {}", res.status); 289 | } 290 | 291 | // info!("request absolute_path: {:?}", req.uri); 292 | // info!("headers: {:?}", headers); 293 | 294 | let resp_body = "{}"; 295 | *resp.status_mut() = StatusCode::Ok; 296 | resp.headers_mut().set(::hyper::header::Server(format!("sentry-relay/{}", VERSION))); 297 | resp.headers_mut().set(ContentLength(resp_body.len() as u64)); 298 | resp.headers_mut().set(ContentType::json()); 299 | resp.send(resp_body.as_bytes()).unwrap(); 300 | } 301 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2017 Sentry 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | [root] 2 | name = "sentry-relay" 3 | version = "0.1.0" 4 | dependencies = [ 5 | "backtrace 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 6 | "chrono 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 7 | "clap 2.23.2 (registry+https://github.com/rust-lang/crates.io-index)", 8 | "env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 9 | "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 10 | "hyper 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)", 11 | "hyper-native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 12 | "if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 13 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 14 | "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", 15 | "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 16 | "serde 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)", 17 | "serde_derive 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)", 18 | "serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", 19 | "term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 20 | ] 21 | 22 | [[package]] 23 | name = "advapi32-sys" 24 | version = "0.2.0" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | dependencies = [ 27 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 28 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 29 | ] 30 | 31 | [[package]] 32 | name = "aho-corasick" 33 | version = "0.6.3" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | dependencies = [ 36 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 37 | ] 38 | 39 | [[package]] 40 | name = "ansi_term" 41 | version = "0.9.0" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | 44 | [[package]] 45 | name = "antidote" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | 49 | [[package]] 50 | name = "atty" 51 | version = "0.2.2" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | dependencies = [ 54 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 55 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 56 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 57 | ] 58 | 59 | [[package]] 60 | name = "backtrace" 61 | version = "0.3.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | dependencies = [ 64 | "backtrace-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 65 | "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 66 | "dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 67 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 68 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 69 | "rustc-demangle 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 70 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 71 | ] 72 | 73 | [[package]] 74 | name = "backtrace-sys" 75 | version = "0.1.10" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | dependencies = [ 78 | "gcc 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", 79 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 80 | ] 81 | 82 | [[package]] 83 | name = "bitflags" 84 | version = "0.7.0" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | 87 | [[package]] 88 | name = "bitflags" 89 | version = "0.8.2" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | 92 | [[package]] 93 | name = "cfg-if" 94 | version = "0.1.0" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | 97 | [[package]] 98 | name = "chrono" 99 | version = "0.3.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | dependencies = [ 102 | "num 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 103 | "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 104 | ] 105 | 106 | [[package]] 107 | name = "clap" 108 | version = "2.23.2" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | dependencies = [ 111 | "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 112 | "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 113 | "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 114 | "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 115 | "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 116 | "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 117 | "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 118 | "vec_map 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 119 | ] 120 | 121 | [[package]] 122 | name = "core-foundation" 123 | version = "0.2.3" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | dependencies = [ 126 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 127 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 128 | ] 129 | 130 | [[package]] 131 | name = "core-foundation-sys" 132 | version = "0.2.3" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | dependencies = [ 135 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 136 | ] 137 | 138 | [[package]] 139 | name = "crypt32-sys" 140 | version = "0.2.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | dependencies = [ 143 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 144 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 145 | ] 146 | 147 | [[package]] 148 | name = "dbghelp-sys" 149 | version = "0.2.0" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | dependencies = [ 152 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 153 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 154 | ] 155 | 156 | [[package]] 157 | name = "dtoa" 158 | version = "0.4.1" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | 161 | [[package]] 162 | name = "env_logger" 163 | version = "0.4.2" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | dependencies = [ 166 | "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", 167 | "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 168 | ] 169 | 170 | [[package]] 171 | name = "error-chain" 172 | version = "0.10.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | dependencies = [ 175 | "backtrace 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 176 | ] 177 | 178 | [[package]] 179 | name = "foreign-types" 180 | version = "0.2.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | 183 | [[package]] 184 | name = "gcc" 185 | version = "0.3.45" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | 188 | [[package]] 189 | name = "gdi32-sys" 190 | version = "0.2.0" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | dependencies = [ 193 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 194 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 195 | ] 196 | 197 | [[package]] 198 | name = "httparse" 199 | version = "1.2.1" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | 202 | [[package]] 203 | name = "hyper" 204 | version = "0.10.7" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | dependencies = [ 207 | "httparse 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 208 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 209 | "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", 210 | "mime 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 211 | "num_cpus 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 212 | "rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", 213 | "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 214 | "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 215 | "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 216 | "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 217 | "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 218 | "url 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 219 | ] 220 | 221 | [[package]] 222 | name = "hyper-native-tls" 223 | version = "0.2.2" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | dependencies = [ 226 | "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 227 | "hyper 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)", 228 | "native-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 229 | ] 230 | 231 | [[package]] 232 | name = "idna" 233 | version = "0.1.1" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | dependencies = [ 236 | "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 237 | "unicode-bidi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 238 | "unicode-normalization 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 239 | ] 240 | 241 | [[package]] 242 | name = "if_chain" 243 | version = "0.1.2" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | 246 | [[package]] 247 | name = "itoa" 248 | version = "0.3.1" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | 251 | [[package]] 252 | name = "kernel32-sys" 253 | version = "0.2.2" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | dependencies = [ 256 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 257 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 258 | ] 259 | 260 | [[package]] 261 | name = "language-tags" 262 | version = "0.2.2" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | 265 | [[package]] 266 | name = "lazy_static" 267 | version = "0.2.8" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | 270 | [[package]] 271 | name = "libc" 272 | version = "0.2.21" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | 275 | [[package]] 276 | name = "log" 277 | version = "0.3.7" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | 280 | [[package]] 281 | name = "matches" 282 | version = "0.1.4" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | 285 | [[package]] 286 | name = "memchr" 287 | version = "1.0.1" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | dependencies = [ 290 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 291 | ] 292 | 293 | [[package]] 294 | name = "mime" 295 | version = "0.2.3" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | dependencies = [ 298 | "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", 299 | ] 300 | 301 | [[package]] 302 | name = "native-tls" 303 | version = "0.1.2" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | dependencies = [ 306 | "openssl 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", 307 | "schannel 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 308 | "security-framework 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 309 | "security-framework-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 310 | "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", 311 | ] 312 | 313 | [[package]] 314 | name = "num" 315 | version = "0.1.37" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | dependencies = [ 318 | "num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", 319 | "num-iter 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", 320 | "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 321 | ] 322 | 323 | [[package]] 324 | name = "num-integer" 325 | version = "0.1.34" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | dependencies = [ 328 | "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 329 | ] 330 | 331 | [[package]] 332 | name = "num-iter" 333 | version = "0.1.33" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | dependencies = [ 336 | "num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", 337 | "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 338 | ] 339 | 340 | [[package]] 341 | name = "num-traits" 342 | version = "0.1.37" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | 345 | [[package]] 346 | name = "num_cpus" 347 | version = "1.3.0" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | dependencies = [ 350 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 351 | ] 352 | 353 | [[package]] 354 | name = "openssl" 355 | version = "0.9.10" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | dependencies = [ 358 | "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 359 | "foreign-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 360 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 361 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 362 | "openssl-sys 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", 363 | ] 364 | 365 | [[package]] 366 | name = "openssl-sys" 367 | version = "0.9.10" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | dependencies = [ 370 | "gcc 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", 371 | "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 372 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 373 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 374 | "user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 375 | ] 376 | 377 | [[package]] 378 | name = "pkg-config" 379 | version = "0.3.9" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | 382 | [[package]] 383 | name = "quote" 384 | version = "0.3.15" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | 387 | [[package]] 388 | name = "rand" 389 | version = "0.3.15" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | dependencies = [ 392 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 393 | ] 394 | 395 | [[package]] 396 | name = "redox_syscall" 397 | version = "0.1.17" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | 400 | [[package]] 401 | name = "regex" 402 | version = "0.2.1" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | dependencies = [ 405 | "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 406 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 407 | "regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 408 | "thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 409 | "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 410 | ] 411 | 412 | [[package]] 413 | name = "regex-syntax" 414 | version = "0.4.0" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | 417 | [[package]] 418 | name = "rustc-demangle" 419 | version = "0.1.4" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | 422 | [[package]] 423 | name = "rustc-serialize" 424 | version = "0.3.23" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | 427 | [[package]] 428 | name = "rustc_version" 429 | version = "0.1.7" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | dependencies = [ 432 | "semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", 433 | ] 434 | 435 | [[package]] 436 | name = "schannel" 437 | version = "0.1.4" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | dependencies = [ 440 | "advapi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 441 | "crypt32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 442 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 443 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 444 | "secur32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 445 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 446 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 447 | ] 448 | 449 | [[package]] 450 | name = "secur32-sys" 451 | version = "0.2.0" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | dependencies = [ 454 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 455 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 456 | ] 457 | 458 | [[package]] 459 | name = "security-framework" 460 | version = "0.1.14" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | dependencies = [ 463 | "core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 464 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 465 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "security-framework-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 467 | ] 468 | 469 | [[package]] 470 | name = "security-framework-sys" 471 | version = "0.1.14" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | dependencies = [ 474 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 475 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 476 | ] 477 | 478 | [[package]] 479 | name = "semver" 480 | version = "0.1.20" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | 483 | [[package]] 484 | name = "serde" 485 | version = "0.9.13" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | 488 | [[package]] 489 | name = "serde_codegen_internals" 490 | version = "0.14.2" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | dependencies = [ 493 | "syn 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", 494 | ] 495 | 496 | [[package]] 497 | name = "serde_derive" 498 | version = "0.9.13" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | dependencies = [ 501 | "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", 502 | "serde_codegen_internals 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", 503 | "syn 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", 504 | ] 505 | 506 | [[package]] 507 | name = "serde_json" 508 | version = "0.9.10" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | dependencies = [ 511 | "dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 512 | "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 513 | "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 514 | "serde 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)", 515 | ] 516 | 517 | [[package]] 518 | name = "strsim" 519 | version = "0.6.0" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | 522 | [[package]] 523 | name = "syn" 524 | version = "0.11.10" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | dependencies = [ 527 | "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", 528 | "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", 529 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 530 | ] 531 | 532 | [[package]] 533 | name = "synom" 534 | version = "0.11.3" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | dependencies = [ 537 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 538 | ] 539 | 540 | [[package]] 541 | name = "tempdir" 542 | version = "0.3.5" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | dependencies = [ 545 | "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", 546 | ] 547 | 548 | [[package]] 549 | name = "term" 550 | version = "0.4.5" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | dependencies = [ 553 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 554 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 555 | ] 556 | 557 | [[package]] 558 | name = "term_size" 559 | version = "0.3.0" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | dependencies = [ 562 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 563 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 564 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 565 | ] 566 | 567 | [[package]] 568 | name = "thread-id" 569 | version = "3.0.0" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | dependencies = [ 572 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 573 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 574 | ] 575 | 576 | [[package]] 577 | name = "thread_local" 578 | version = "0.3.3" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | dependencies = [ 581 | "thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 582 | "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 583 | ] 584 | 585 | [[package]] 586 | name = "time" 587 | version = "0.1.36" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | dependencies = [ 590 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 591 | "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 592 | "redox_syscall 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 593 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 594 | ] 595 | 596 | [[package]] 597 | name = "traitobject" 598 | version = "0.1.0" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | 601 | [[package]] 602 | name = "typeable" 603 | version = "0.1.2" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | 606 | [[package]] 607 | name = "unicase" 608 | version = "1.4.0" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | dependencies = [ 611 | "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 612 | ] 613 | 614 | [[package]] 615 | name = "unicode-bidi" 616 | version = "0.2.5" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | dependencies = [ 619 | "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 620 | ] 621 | 622 | [[package]] 623 | name = "unicode-normalization" 624 | version = "0.1.4" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | 627 | [[package]] 628 | name = "unicode-segmentation" 629 | version = "1.1.0" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | 632 | [[package]] 633 | name = "unicode-width" 634 | version = "0.1.4" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | 637 | [[package]] 638 | name = "unicode-xid" 639 | version = "0.0.4" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | 642 | [[package]] 643 | name = "unreachable" 644 | version = "0.1.1" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | dependencies = [ 647 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 648 | ] 649 | 650 | [[package]] 651 | name = "url" 652 | version = "1.4.0" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | dependencies = [ 655 | "idna 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 656 | "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 657 | ] 658 | 659 | [[package]] 660 | name = "user32-sys" 661 | version = "0.2.0" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | dependencies = [ 664 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 665 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 666 | ] 667 | 668 | [[package]] 669 | name = "utf8-ranges" 670 | version = "1.0.0" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | 673 | [[package]] 674 | name = "vec_map" 675 | version = "0.7.0" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | 678 | [[package]] 679 | name = "void" 680 | version = "1.0.2" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | 683 | [[package]] 684 | name = "winapi" 685 | version = "0.2.8" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | 688 | [[package]] 689 | name = "winapi-build" 690 | version = "0.1.1" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | 693 | [metadata] 694 | "checksum advapi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e06588080cb19d0acb6739808aafa5f26bfb2ca015b2b6370028b44cf7cb8a9a" 695 | "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699" 696 | "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" 697 | "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" 698 | "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159" 699 | "checksum backtrace 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f551bc2ddd53aea015d453ef0b635af89444afa5ed2405dd0b2062ad5d600d80" 700 | "checksum backtrace-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d192fd129132fbc97497c1f2ec2c2c5174e376b95f535199ef4fe0a293d33842" 701 | "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" 702 | "checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4" 703 | "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" 704 | "checksum chrono 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "158b0bd7d75cbb6bf9c25967a48a2e9f77da95876b858eadfabaa99cd069de6e" 705 | "checksum clap 2.23.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf1114886d7cde2d6448517161d7db8d681a9a1c09f7d210f0b0864e48195f6" 706 | "checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" 707 | "checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" 708 | "checksum crypt32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e34988f7e069e0b2f3bfc064295161e489b2d4e04a2e4248fb94360cdf00b4ec" 709 | "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" 710 | "checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90" 711 | "checksum env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e3856f1697098606fc6cb97a93de88ca3f3bc35bb878c725920e6e82ecf05e83" 712 | "checksum error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8" 713 | "checksum foreign-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e4056b9bd47f8ac5ba12be771f77a0dae796d1bbaaf5fd0b9c2d38b69b8a29d" 714 | "checksum gcc 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)" = "40899336fb50db0c78710f53e87afc54d8c7266fb76262fecc78ca1a7f09deae" 715 | "checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518" 716 | "checksum httparse 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e7a63e511f9edffbab707141fbb8707d1a3098615fb2adbd5769cdfcc9b17d" 717 | "checksum hyper 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb15973f070a7de8bf3f61261726ef09647741110af6062d5ca1e21e6c4bd013" 718 | "checksum hyper-native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "afe68f772f0497a7205e751626bb8e1718568b58534b6108c73a74ef80483409" 719 | "checksum idna 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6ac85ec3f80c8e4e99d9325521337e14ec7555c458a14e377d189659a427f375" 720 | "checksum if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "61bb90bdd39e3af69b0172dfc6130f6cd6332bf040fbb9bdd4401d37adbd48b8" 721 | "checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c" 722 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 723 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 724 | "checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf" 725 | "checksum libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "88ee81885f9f04bff991e306fea7c1c60a5f0f9e409e99f6b40e3311a3363135" 726 | "checksum log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5141eca02775a762cc6cd564d8d2c50f67c0ea3a372cbf1c51592b3e029e10ad" 727 | "checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1" 728 | "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" 729 | "checksum mime 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5514f038123342d01ee5f95129e4ef1e0470c93bc29edf058a46f9ee3ba6737e" 730 | "checksum native-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e94a2fc65a44729fe969cc973da87c1052ae3f000b2cb33029f14aeb85550d5" 731 | "checksum num 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "98b15ba84e910ea7a1973bccd3df7b31ae282bf9d8bd2897779950c9b8303d40" 732 | "checksum num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ef1a4bf6f9174aa5783a9b4cc892cacd11aebad6c69ad027a0b65c6ca5f8aa37" 733 | "checksum num-iter 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d1891bd7b936f12349b7d1403761c8a0b85a18b148e9da4429d5d102c1a41e" 734 | "checksum num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "e1cbfa3781f3fe73dc05321bed52a06d2d491eaa764c52335cf4399f046ece99" 735 | "checksum num_cpus 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a18c392466409c50b87369414a2680c93e739aedeb498eb2bff7d7eb569744e2" 736 | "checksum openssl 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8aa0eb7aad44f0da6f7dda13ddb4559d91a0f40cfab150b1f76ad5b39ec523f" 737 | "checksum openssl-sys 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "14f5bfd12054d764510b887152d564ba11d99ae24ea7d740781778f646620576" 738 | "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" 739 | "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" 740 | "checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" 741 | "checksum redox_syscall 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "29dbdfd4b9df8ab31dec47c6087b7b13cbf4a776f335e4de8efba8288dda075b" 742 | "checksum regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4278c17d0f6d62dfef0ab00028feb45bd7d2102843f80763474eeb1be8a10c01" 743 | "checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457" 744 | "checksum rustc-demangle 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95" 745 | "checksum rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "684ce48436d6465300c9ea783b6b14c4361d6b8dcbb1375b486a69cc19e2dfb0" 746 | "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" 747 | "checksum schannel 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b291854e37196c2b67249e09d6bdeff410b19e1acf05558168e9c4413b4e95" 748 | "checksum secur32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f412dfa83308d893101dd59c10d6fda8283465976c28c287c5c855bf8d216bc" 749 | "checksum security-framework 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "42ddf098d78d0b64564b23ee6345d07573e7d10e52ad86875d89ddf5f8378a02" 750 | "checksum security-framework-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "5bacdada57ea62022500c457c8571c17dfb5e6240b7c8eac5916ffa8c7138a55" 751 | "checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" 752 | "checksum serde 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)" = "231dfd55909400769e437326cfb4af8bec97c3dd56ab3d02df8ef5c7e00f179b" 753 | "checksum serde_codegen_internals 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bc888bd283bd2420b16ad0d860e35ad8acb21941180a83a189bb2046f9d00400" 754 | "checksum serde_derive 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)" = "d75c72ef4dd193d89eb652b73890fe2489996c9ead8b37980f57a1078f96ed50" 755 | "checksum serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ad8bcf487be7d2e15d3d543f04312de991d631cfe1b43ea0ade69e6a8a5b16a1" 756 | "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" 757 | "checksum syn 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)" = "171b739972d9a1bfb169e8077238b51f9ebeaae4ff6e08072f7ba386a8802da2" 758 | "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" 759 | "checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6" 760 | "checksum term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d168af3930b369cfe245132550579d47dfd873d69470755a19c2c6568dbbd989" 761 | "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209" 762 | "checksum thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437c97558c70d129e40629a5b385b3fb1ffac301e63941335e4d354081ec14a" 763 | "checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7" 764 | "checksum time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "211b63c112206356ef1ff9b19355f43740fc3f85960c598a93d3a3d3ba7beade" 765 | "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" 766 | "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" 767 | "checksum unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "13a5906ca2b98c799f4b1ab4557b76367ebd6ae5ef14930ec841c74aed5f3764" 768 | "checksum unicode-bidi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d3a078ebdd62c0e71a709c3d53d2af693fe09fe93fbff8344aebe289b78f9032" 769 | "checksum unicode-normalization 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e28fa37426fceeb5cf8f41ee273faa7c82c47dc8fba5853402841e665fcd86ff" 770 | "checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3" 771 | "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" 772 | "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" 773 | "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" 774 | "checksum url 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5ba8a749fb4479b043733416c244fa9d1d3af3d7c23804944651c8a448cb87e" 775 | "checksum user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47" 776 | "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" 777 | "checksum vec_map 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8cdc8b93bd0198ed872357fb2e667f7125646b1762f16d60b2c96350d361897" 778 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 779 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 780 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 781 | --------------------------------------------------------------------------------