[INFO] updating cached repository ward/rusty-butler [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/ward/rusty-butler [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/ward/rusty-butler" "work/ex/clippy-test-run/sources/stable/gh/ward/rusty-butler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/ward/rusty-butler'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/ward/rusty-butler" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/ward/rusty-butler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/ward/rusty-butler'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 15641aa084d803f4a10a7f9238d60ca7aceac9b9 [INFO] sha for GitHub repo ward/rusty-butler: 15641aa084d803f4a10a7f9238d60ca7aceac9b9 [INFO] validating manifest of ward/rusty-butler on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of ward/rusty-butler on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing ward/rusty-butler [INFO] finished frobbing ward/rusty-butler [INFO] frobbed toml for ward/rusty-butler written to work/ex/clippy-test-run/sources/stable/gh/ward/rusty-butler/Cargo.toml [INFO] started frobbing ward/rusty-butler [INFO] finished frobbing ward/rusty-butler [INFO] frobbed toml for ward/rusty-butler written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/ward/rusty-butler/Cargo.toml [INFO] crate ward/rusty-butler has a lockfile. skipping [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting ward/rusty-butler against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-2/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/ward/rusty-butler:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 407f22b47ad9abbcce19ca0a92846f0dc9e9efaadf6617790c48b7fbeddea38c [INFO] running `"docker" "start" "-a" "407f22b47ad9abbcce19ca0a92846f0dc9e9efaadf6617790c48b7fbeddea38c"` [INFO] [stderr] Compiling cfg-if v0.1.5 [INFO] [stderr] Compiling ucd-util v0.1.1 [INFO] [stderr] Compiling num-integer v0.1.39 [INFO] [stderr] Compiling utf8-ranges v1.0.1 [INFO] [stderr] Compiling openssl v0.10.12 [INFO] [stderr] Compiling serde v1.0.79 [INFO] [stderr] Compiling native-tls v0.2.1 [INFO] [stderr] Checking json v0.10.3 [INFO] [stderr] Checking bufstream v0.1.4 [INFO] [stderr] Checking strsim v0.5.2 [INFO] [stderr] Checking unicode-segmentation v1.2.1 [INFO] [stderr] Compiling memchr v2.1.0 [INFO] [stderr] Checking rust-gmp v0.3.2 [INFO] [stderr] Checking log v0.4.5 [INFO] [stderr] Compiling openssl-sys v0.9.36 [INFO] [stderr] Checking relay v0.1.1 [INFO] [stderr] Checking tokio-service v0.1.0 [INFO] [stderr] Checking base64 v0.6.0 [INFO] [stderr] Checking base64 v0.9.3 [INFO] [stderr] Checking tokio-timer v0.1.2 [INFO] [stderr] Checking smallvec v0.6.5 [INFO] [stderr] Checking bytes v0.4.10 [INFO] [stderr] Compiling regex-syntax v0.5.6 [INFO] [stderr] Checking mio v0.6.16 [INFO] [stderr] Checking log v0.3.9 [INFO] [stderr] Checking want v0.0.4 [INFO] [stderr] Checking encoding_rs v0.8.10 [INFO] [stderr] Compiling lazy_static v1.1.0 [INFO] [stderr] Checking url v1.7.1 [INFO] [stderr] Checking tokio-io v0.1.9 [INFO] [stderr] Checking crossbeam-epoch v0.5.2 [INFO] [stderr] Checking mime v0.3.9 [INFO] [stderr] Checking backtrace v0.3.9 [INFO] [stderr] Compiling syn v0.14.9 [INFO] [stderr] Compiling syn v0.15.11 [INFO] [stderr] Checking mime v0.2.6 [INFO] [stderr] Checking nix v0.7.0 [INFO] [stderr] Compiling thread_local v0.3.6 [INFO] [stderr] Checking libflate v0.1.18 [INFO] [stderr] Checking num-iter v0.1.37 [INFO] [stderr] Checking chrono v0.4.6 [INFO] [stderr] Checking aho-corasick v0.6.8 [INFO] [stderr] Checking mio-uds v0.6.7 [INFO] [stderr] Checking parking_lot_core v0.3.1 [INFO] [stderr] Compiling openssl v0.9.24 [INFO] [stderr] Checking crossbeam-deque v0.6.1 [INFO] [stderr] Checking tokio-codec v0.1.1 [INFO] [stderr] Checking tokio-mockstream v1.1.0 [INFO] [stderr] Checking hyper v0.10.13 [INFO] [stderr] Checking num v0.1.42 [INFO] [stderr] Checking linefeed v0.2.6 [INFO] [stderr] Checking regex v1.0.5 [INFO] [stderr] Checking parking_lot v0.6.4 [INFO] [stderr] Compiling regex v0.2.11 [INFO] [stderr] Checking tokio-threadpool v0.1.7 [INFO] [stderr] Checking chrono v0.2.25 [INFO] [stderr] Compiling serde_derive v1.0.79 [INFO] [stderr] Compiling synstructure v0.9.0 [INFO] [stderr] Checking tokio-reactor v0.1.6 [INFO] [stderr] Checking tokio-fs v0.1.3 [INFO] [stderr] Checking serde_urlencoded v0.5.3 [INFO] [stderr] Checking serde_json v1.0.32 [INFO] [stderr] Checking toml v0.4.8 [INFO] [stderr] Checking mime_guess v2.0.0-alpha.6 [INFO] [stderr] Checking chrono-humanize v0.0.6 [INFO] [stderr] Checking tokio-udp v0.1.2 [INFO] [stderr] Checking tokio-tcp v0.1.2 [INFO] [stderr] Checking tokio-uds v0.2.2 [INFO] [stderr] Checking native-tls v0.1.5 [INFO] [stderr] Compiling parse-zoneinfo v0.1.1 [INFO] [stderr] Compiling failure_derive v0.1.2 [INFO] [stderr] Checking hyper-native-tls v0.2.4 [INFO] [stderr] Checking tokio v0.1.11 [INFO] [stderr] Checking tokio-tls v0.2.0 [INFO] [stderr] Checking tokio-core v0.1.17 [INFO] [stderr] Compiling chrono-tz v0.2.5 [INFO] [stderr] Checking failure v0.1.2 [INFO] [stderr] Checking hyper v0.11.27 [INFO] [stderr] Checking tokio-tls v0.1.4 [INFO] [stderr] Checking irc v0.13.6 [INFO] [stderr] Checking hyper-tls v0.1.4 [INFO] [stderr] Checking reqwest v0.8.8 [INFO] [stderr] Checking rink v0.4.3 [INFO] [stderr] Checking rusty-butler v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> src/plugins/calc.rs:143:38 [INFO] [stderr] | [INFO] [stderr] 143 | let feet = (cm * 0.032808).floor(); [INFO] [stderr] | ^^^^^^^^ help: consider: `0.032_808` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unreadable_literal)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> src/plugins/calc.rs:144:42 [INFO] [stderr] | [INFO] [stderr] 144 | let inches = (((cm * 0.393701) % 12.0) * 1000.0).round() / 1000.0; [INFO] [stderr] | ^^^^^^^^ help: consider: `0.393_701` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> src/plugins/calc.rs:143:38 [INFO] [stderr] | [INFO] [stderr] 143 | let feet = (cm * 0.032808).floor(); [INFO] [stderr] | ^^^^^^^^ help: consider: `0.032_808` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unreadable_literal)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> src/plugins/calc.rs:144:42 [INFO] [stderr] | [INFO] [stderr] 144 | let inches = (((cm * 0.393701) % 12.0) * 1000.0).round() / 1000.0; [INFO] [stderr] | ^^^^^^^^ help: consider: `0.393_701` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `plugins::time::TimeHandler` [INFO] [stderr] --> src/plugins/time.rs:7:5 [INFO] [stderr] | [INFO] [stderr] 7 | / pub fn new() -> TimeHandler { [INFO] [stderr] 8 | | TimeHandler {} [INFO] [stderr] 9 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 4 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: this loop never actually loops [INFO] [stderr] --> src/plugins/strava.rs:47:9 [INFO] [stderr] | [INFO] [stderr] 47 | / for captures in self.segment_matcher.captures_iter(msg) { [INFO] [stderr] 48 | | println!("{}", captures.get(1).unwrap().as_str()); [INFO] [stderr] 49 | | let segment = Segment::fetch(captures.get(1).unwrap().as_str(), access_token); [INFO] [stderr] 50 | | return match segment { [INFO] [stderr] ... | [INFO] [stderr] 56 | | }; [INFO] [stderr] 57 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::never_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#never_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/plugins/strava.rs:99:9 [INFO] [stderr] | [INFO] [stderr] 99 | / match self.access_token { [INFO] [stderr] 100 | | Some(ref access_token) => { [INFO] [stderr] 101 | | if let Command::PRIVMSG(ref channel, ref message) = msg.command { [INFO] [stderr] 102 | | let segment_reply = self.handle_segments(message, &access_token); [INFO] [stderr] ... | [INFO] [stderr] 116 | | None => (), [INFO] [stderr] 117 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 99 | if let Some(ref access_token) = self.access_token { [INFO] [stderr] 100 | if let Command::PRIVMSG(ref channel, ref message) = msg.command { [INFO] [stderr] 101 | let segment_reply = self.handle_segments(message, &access_token); [INFO] [stderr] 102 | match segment_reply { [INFO] [stderr] 103 | Some(segment_id) => client.send_privmsg(&channel, &segment_id).unwrap(), [INFO] [stderr] 104 | _ => (), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/plugins/strava.rs:103:21 [INFO] [stderr] | [INFO] [stderr] 103 | / match segment_reply { [INFO] [stderr] 104 | | Some(segment_id) => client.send_privmsg(&channel, &segment_id).unwrap(), [INFO] [stderr] 105 | | _ => (), [INFO] [stderr] 106 | | } [INFO] [stderr] | |_____________________^ help: try this: `if let Some(segment_id) = segment_reply { client.send_privmsg(&channel, &segment_id).unwrap() }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: casting u32 to i64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:190:44 [INFO] [stderr] | [INFO] [stderr] 190 | .sort_unstable_by_key(|a| -(a.moving_time as i64)), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `i64::from(a.moving_time)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/plugins/strava.rs:241:13 [INFO] [stderr] | [INFO] [stderr] 241 | idx = idx + 1; [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `idx += 1` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:250:21 [INFO] [stderr] | [INFO] [stderr] 250 | let pace = (self.moving_time as f64 / (self.distance / 1000.0)).round() as u32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(self.moving_time)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:253:22 [INFO] [stderr] | [INFO] [stderr] 253 | let hours = (self.moving_time as f64 / 3600.0) as u32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(self.moving_time)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:254:25 [INFO] [stderr] | [INFO] [stderr] 254 | let minutes = ((self.moving_time as f64 % 3600.0) / 60.0) as u32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(self.moving_time)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:365:18 [INFO] [stderr] | [INFO] [stderr] 365 | let hours = (seconds as f64 / 3600.0).floor(); [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try: `f64::from(seconds)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:366:20 [INFO] [stderr] | [INFO] [stderr] 366 | let minutes = ((seconds % 3600) as f64 / 60.0).floor(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(seconds % 3600)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_ok()` [INFO] [stderr] --> src/plugins/strava.rs:403:20 [INFO] [stderr] | [INFO] [stderr] 403 | if let Ok(_) = f.read_to_string(&mut buffer) { [INFO] [stderr] | _____________- ^^^^^ [INFO] [stderr] 404 | | match serde_json::from_str(&buffer) { [INFO] [stderr] 405 | | Ok(parsed) => return Some(parsed), [INFO] [stderr] 406 | | Err(e) => { [INFO] [stderr] ... | [INFO] [stderr] 410 | | } [INFO] [stderr] 411 | | } [INFO] [stderr] | |_____________- help: try this: `if f.read_to_string(&mut buffer).is_ok()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise [INFO] [stderr] --> src/plugins/strava.rs:443:18 [INFO] [stderr] | [INFO] [stderr] 443 | Some(nicks.get(0).unwrap().to_owned()) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try this: `&nicks[0]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/plugins/strava.rs:459:9 [INFO] [stderr] | [INFO] [stderr] 459 | / if self.users.contains_key(&strava_id) { [INFO] [stderr] 460 | | let user = self.users.get_mut(&strava_id).unwrap(); [INFO] [stderr] 461 | | if !user.nicks.contains(&owned_nick) { [INFO] [stderr] 462 | | user.nicks.push(owned_nick) [INFO] [stderr] ... | [INFO] [stderr] 469 | | self.users.insert(strava_id, new_user); [INFO] [stderr] 470 | | } [INFO] [stderr] | |_________^ help: consider using: `self.users.entry(strava_id)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_entry)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `plugins::calc::CalcHandler` [INFO] [stderr] --> src/plugins/calc.rs:15:5 [INFO] [stderr] | [INFO] [stderr] 15 | / pub fn new() -> CalcHandler { [INFO] [stderr] 16 | | let mut ctx = rink::load().expect("Could not create calculator core?"); [INFO] [stderr] 17 | | ctx.short_output = true; [INFO] [stderr] 18 | | let mut shortcuts = vec![]; [INFO] [stderr] ... | [INFO] [stderr] 59 | | } [INFO] [stderr] 60 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 14 | impl Default for plugins::calc::CalcHandler { [INFO] [stderr] 15 | fn default() -> Self { [INFO] [stderr] 16 | Self::new() [INFO] [stderr] 17 | } [INFO] [stderr] 18 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/plugins/nickname.rs:37:9 [INFO] [stderr] | [INFO] [stderr] 37 | / match self.nick { [INFO] [stderr] 38 | | Some(ref nick) => { [INFO] [stderr] 39 | | if client.current_nickname() != nick { [INFO] [stderr] 40 | | client.send(Command::NICK(nick.to_string())).unwrap(); [INFO] [stderr] ... | [INFO] [stderr] 43 | | None => (), [INFO] [stderr] 44 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 37 | if let Some(ref nick) = self.nick { [INFO] [stderr] 38 | if client.current_nickname() != nick { [INFO] [stderr] 39 | client.send(Command::NICK(nick.to_string())).unwrap(); [INFO] [stderr] 40 | } [INFO] [stderr] 41 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `plugins::lastseen::LastSeenHandler` [INFO] [stderr] --> src/plugins/lastseen.rs:34:5 [INFO] [stderr] | [INFO] [stderr] 34 | / pub fn new() -> LastSeenHandler { [INFO] [stderr] 35 | | let seen_matcher = Regex::new(r"^!(?:last)?seen +(.+) *$").unwrap(); [INFO] [stderr] 36 | | LastSeenHandler { [INFO] [stderr] 37 | | events: HashMap::new(), [INFO] [stderr] 38 | | seen_matcher, [INFO] [stderr] 39 | | } [INFO] [stderr] 40 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 33 | impl Default for plugins::lastseen::LastSeenHandler { [INFO] [stderr] 34 | fn default() -> Self { [INFO] [stderr] 35 | Self::new() [INFO] [stderr] 36 | } [INFO] [stderr] 37 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `rusty-butler`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `plugins::time::TimeHandler` [INFO] [stderr] --> src/plugins/time.rs:7:5 [INFO] [stderr] | [INFO] [stderr] 7 | / pub fn new() -> TimeHandler { [INFO] [stderr] 8 | | TimeHandler {} [INFO] [stderr] 9 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 4 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: this loop never actually loops [INFO] [stderr] --> src/plugins/strava.rs:47:9 [INFO] [stderr] | [INFO] [stderr] 47 | / for captures in self.segment_matcher.captures_iter(msg) { [INFO] [stderr] 48 | | println!("{}", captures.get(1).unwrap().as_str()); [INFO] [stderr] 49 | | let segment = Segment::fetch(captures.get(1).unwrap().as_str(), access_token); [INFO] [stderr] 50 | | return match segment { [INFO] [stderr] ... | [INFO] [stderr] 56 | | }; [INFO] [stderr] 57 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::never_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#never_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/plugins/strava.rs:99:9 [INFO] [stderr] | [INFO] [stderr] 99 | / match self.access_token { [INFO] [stderr] 100 | | Some(ref access_token) => { [INFO] [stderr] 101 | | if let Command::PRIVMSG(ref channel, ref message) = msg.command { [INFO] [stderr] 102 | | let segment_reply = self.handle_segments(message, &access_token); [INFO] [stderr] ... | [INFO] [stderr] 116 | | None => (), [INFO] [stderr] 117 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 99 | if let Some(ref access_token) = self.access_token { [INFO] [stderr] 100 | if let Command::PRIVMSG(ref channel, ref message) = msg.command { [INFO] [stderr] 101 | let segment_reply = self.handle_segments(message, &access_token); [INFO] [stderr] 102 | match segment_reply { [INFO] [stderr] 103 | Some(segment_id) => client.send_privmsg(&channel, &segment_id).unwrap(), [INFO] [stderr] 104 | _ => (), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/plugins/strava.rs:103:21 [INFO] [stderr] | [INFO] [stderr] 103 | / match segment_reply { [INFO] [stderr] 104 | | Some(segment_id) => client.send_privmsg(&channel, &segment_id).unwrap(), [INFO] [stderr] 105 | | _ => (), [INFO] [stderr] 106 | | } [INFO] [stderr] | |_____________________^ help: try this: `if let Some(segment_id) = segment_reply { client.send_privmsg(&channel, &segment_id).unwrap() }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: casting u32 to i64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:190:44 [INFO] [stderr] | [INFO] [stderr] 190 | .sort_unstable_by_key(|a| -(a.moving_time as i64)), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `i64::from(a.moving_time)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/plugins/strava.rs:241:13 [INFO] [stderr] | [INFO] [stderr] 241 | idx = idx + 1; [INFO] [stderr] | ^^^^^^^^^^^^^ help: replace it with: `idx += 1` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:250:21 [INFO] [stderr] | [INFO] [stderr] 250 | let pace = (self.moving_time as f64 / (self.distance / 1000.0)).round() as u32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(self.moving_time)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:253:22 [INFO] [stderr] | [INFO] [stderr] 253 | let hours = (self.moving_time as f64 / 3600.0) as u32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(self.moving_time)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:254:25 [INFO] [stderr] | [INFO] [stderr] 254 | let minutes = ((self.moving_time as f64 % 3600.0) / 60.0) as u32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(self.moving_time)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:365:18 [INFO] [stderr] | [INFO] [stderr] 365 | let hours = (seconds as f64 / 3600.0).floor(); [INFO] [stderr] | ^^^^^^^^^^^^^^ help: try: `f64::from(seconds)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/plugins/strava.rs:366:20 [INFO] [stderr] | [INFO] [stderr] 366 | let minutes = ((seconds % 3600) as f64 / 60.0).floor(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `f64::from(seconds % 3600)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_ok()` [INFO] [stderr] --> src/plugins/strava.rs:403:20 [INFO] [stderr] | [INFO] [stderr] 403 | if let Ok(_) = f.read_to_string(&mut buffer) { [INFO] [stderr] | _____________- ^^^^^ [INFO] [stderr] 404 | | match serde_json::from_str(&buffer) { [INFO] [stderr] 405 | | Ok(parsed) => return Some(parsed), [INFO] [stderr] 406 | | Err(e) => { [INFO] [stderr] ... | [INFO] [stderr] 410 | | } [INFO] [stderr] 411 | | } [INFO] [stderr] | |_____________- help: try this: `if f.read_to_string(&mut buffer).is_ok()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise [INFO] [stderr] --> src/plugins/strava.rs:443:18 [INFO] [stderr] | [INFO] [stderr] 443 | Some(nicks.get(0).unwrap().to_owned()) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: try this: `&nicks[0]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/plugins/strava.rs:459:9 [INFO] [stderr] | [INFO] [stderr] 459 | / if self.users.contains_key(&strava_id) { [INFO] [stderr] 460 | | let user = self.users.get_mut(&strava_id).unwrap(); [INFO] [stderr] 461 | | if !user.nicks.contains(&owned_nick) { [INFO] [stderr] 462 | | user.nicks.push(owned_nick) [INFO] [stderr] ... | [INFO] [stderr] 469 | | self.users.insert(strava_id, new_user); [INFO] [stderr] 470 | | } [INFO] [stderr] | |_________^ help: consider using: `self.users.entry(strava_id)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_entry)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/plugins/strava.rs:528:28 [INFO] [stderr] | [INFO] [stderr] 528 | assert_eq!("ward", result.get(0).unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&result[0]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/plugins/strava.rs:535:28 [INFO] [stderr] | [INFO] [stderr] 535 | assert_eq!("ward", result.get(0).unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&result[0]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/plugins/strava.rs:536:29 [INFO] [stderr] | [INFO] [stderr] 536 | assert_eq!("ward_", result.get(1).unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&result[1]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/plugins/strava.rs:538:30 [INFO] [stderr] | [INFO] [stderr] 538 | assert_eq!("butler", result.get(0).unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&result[0]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `plugins::calc::CalcHandler` [INFO] [stderr] --> src/plugins/calc.rs:15:5 [INFO] [stderr] | [INFO] [stderr] 15 | / pub fn new() -> CalcHandler { [INFO] [stderr] 16 | | let mut ctx = rink::load().expect("Could not create calculator core?"); [INFO] [stderr] 17 | | ctx.short_output = true; [INFO] [stderr] 18 | | let mut shortcuts = vec![]; [INFO] [stderr] ... | [INFO] [stderr] 59 | | } [INFO] [stderr] 60 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 14 | impl Default for plugins::calc::CalcHandler { [INFO] [stderr] 15 | fn default() -> Self { [INFO] [stderr] 16 | Self::new() [INFO] [stderr] 17 | } [INFO] [stderr] 18 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/plugins/nickname.rs:37:9 [INFO] [stderr] | [INFO] [stderr] 37 | / match self.nick { [INFO] [stderr] 38 | | Some(ref nick) => { [INFO] [stderr] 39 | | if client.current_nickname() != nick { [INFO] [stderr] 40 | | client.send(Command::NICK(nick.to_string())).unwrap(); [INFO] [stderr] ... | [INFO] [stderr] 43 | | None => (), [INFO] [stderr] 44 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 37 | if let Some(ref nick) = self.nick { [INFO] [stderr] 38 | if client.current_nickname() != nick { [INFO] [stderr] 39 | client.send(Command::NICK(nick.to_string())).unwrap(); [INFO] [stderr] 40 | } [INFO] [stderr] 41 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `plugins::lastseen::LastSeenHandler` [INFO] [stderr] --> src/plugins/lastseen.rs:34:5 [INFO] [stderr] | [INFO] [stderr] 34 | / pub fn new() -> LastSeenHandler { [INFO] [stderr] 35 | | let seen_matcher = Regex::new(r"^!(?:last)?seen +(.+) *$").unwrap(); [INFO] [stderr] 36 | | LastSeenHandler { [INFO] [stderr] 37 | | events: HashMap::new(), [INFO] [stderr] 38 | | seen_matcher, [INFO] [stderr] 39 | | } [INFO] [stderr] 40 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 33 | impl Default for plugins::lastseen::LastSeenHandler { [INFO] [stderr] 34 | fn default() -> Self { [INFO] [stderr] 35 | Self::new() [INFO] [stderr] 36 | } [INFO] [stderr] 37 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `rusty-butler`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "407f22b47ad9abbcce19ca0a92846f0dc9e9efaadf6617790c48b7fbeddea38c"` [INFO] running `"docker" "rm" "-f" "407f22b47ad9abbcce19ca0a92846f0dc9e9efaadf6617790c48b7fbeddea38c"` [INFO] [stdout] 407f22b47ad9abbcce19ca0a92846f0dc9e9efaadf6617790c48b7fbeddea38c