[INFO] crate liner 0.4.4 is already in cache [INFO] extracting crate liner 0.4.4 into work/ex/clippy-test-run/sources/stable/reg/liner/0.4.4 [INFO] extracting crate liner 0.4.4 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/liner/0.4.4 [INFO] validating manifest of liner-0.4.4 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 liner-0.4.4 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 liner-0.4.4 [INFO] finished frobbing liner-0.4.4 [INFO] frobbed toml for liner-0.4.4 written to work/ex/clippy-test-run/sources/stable/reg/liner/0.4.4/Cargo.toml [INFO] started frobbing liner-0.4.4 [INFO] finished frobbing liner-0.4.4 [INFO] frobbed toml for liner-0.4.4 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/liner/0.4.4/Cargo.toml [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [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 liner-0.4.4 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-0/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/liner/0.4.4:/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] be02db3a9e4073a08775c9c8ebf938bca9a75d1e92e75ae3a6b95ef792bb3ead [INFO] running `"docker" "start" "-a" "be02db3a9e4073a08775c9c8ebf938bca9a75d1e92e75ae3a6b95ef792bb3ead"` [INFO] [stderr] Checking liner v0.4.4 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/event.rs:15:13 [INFO] [stderr] | [INFO] [stderr] 15 | editor: editor, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `editor` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/event.rs:16:13 [INFO] [stderr] | [INFO] [stderr] 16 | kind: kind, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `kind` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/editor.rs:122:13 [INFO] [stderr] | [INFO] [stderr] 122 | out: out, [INFO] [stderr] | ^^^^^^^^ help: replace it with: `out` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/editor.rs:125:13 [INFO] [stderr] | [INFO] [stderr] 125 | context: context, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `context` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/editor.rs:704:17 [INFO] [stderr] | [INFO] [stderr] 704 | write!(self.out, "\r\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::write_with_newline)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/buffer.rs:204:13 [INFO] [stderr] | [INFO] [stderr] 204 | start: start, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `start` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/buffer.rs:213:13 [INFO] [stderr] | [INFO] [stderr] 213 | start: start, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `start` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/history.rs:67:13 [INFO] [stderr] | [INFO] [stderr] 67 | sender: sender, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `sender` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/history.rs:83:13 [INFO] [stderr] | [INFO] [stderr] 83 | bg_stop: bg_stop, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `bg_stop` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/history.rs:85:13 [INFO] [stderr] | [INFO] [stderr] 85 | max_file_size: max_file_size, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `max_file_size` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/keymap/vi.rs:320:13 [INFO] [stderr] | [INFO] [stderr] 320 | ed: ed, [INFO] [stderr] | ^^^^^^ help: replace it with: `ed` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/keymap/mod.rs:78:17 [INFO] [stderr] | [INFO] [stderr] 78 | ed: ed, [INFO] [stderr] | ^^^^^^ help: replace it with: `ed` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/event.rs:15:13 [INFO] [stderr] | [INFO] [stderr] 15 | editor: editor, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `editor` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/event.rs:16:13 [INFO] [stderr] | [INFO] [stderr] 16 | kind: kind, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `kind` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/editor.rs:122:13 [INFO] [stderr] | [INFO] [stderr] 122 | out: out, [INFO] [stderr] | ^^^^^^^^ help: replace it with: `out` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/editor.rs:125:13 [INFO] [stderr] | [INFO] [stderr] 125 | context: context, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `context` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/editor.rs:704:17 [INFO] [stderr] | [INFO] [stderr] 704 | write!(self.out, "\r\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::write_with_newline)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/buffer.rs:204:13 [INFO] [stderr] | [INFO] [stderr] 204 | start: start, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `start` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/buffer.rs:213:13 [INFO] [stderr] | [INFO] [stderr] 213 | start: start, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `start` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/history.rs:67:13 [INFO] [stderr] | [INFO] [stderr] 67 | sender: sender, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `sender` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/history.rs:83:13 [INFO] [stderr] | [INFO] [stderr] 83 | bg_stop: bg_stop, [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `bg_stop` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/history.rs:85:13 [INFO] [stderr] | [INFO] [stderr] 85 | max_file_size: max_file_size, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `max_file_size` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/keymap/vi.rs:320:13 [INFO] [stderr] | [INFO] [stderr] 320 | ed: ed, [INFO] [stderr] | ^^^^^^ help: replace it with: `ed` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/keymap/mod.rs:78:17 [INFO] [stderr] | [INFO] [stderr] 78 | ed: ed, [INFO] [stderr] | ^^^^^^ help: replace it with: `ed` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: unnecessary parentheses around function argument [INFO] [stderr] --> src/editor.rs:225:27 [INFO] [stderr] | [INFO] [stderr] 225 | let cols = max(1, (w as usize / (max_word_size))); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_parens)] on by default [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/editor.rs:363:16 [INFO] [stderr] | [INFO] [stderr] 363 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 364 | | if self.context.history.len() > 0 { [INFO] [stderr] 365 | | self.cur_history_loc = Some(self.context.history.len() - 1); [INFO] [stderr] 366 | | } else { [INFO] [stderr] 367 | | return self.display(); [INFO] [stderr] 368 | | } [INFO] [stderr] 369 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 363 | } else if self.context.history.len() > 0 { [INFO] [stderr] 364 | self.cur_history_loc = Some(self.context.history.len() - 1); [INFO] [stderr] 365 | } else { [INFO] [stderr] 366 | return self.display(); [INFO] [stderr] 367 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this if statement can be collapsed [INFO] [stderr] --> src/editor.rs:638:9 [INFO] [stderr] | [INFO] [stderr] 638 | / if self.no_eol { [INFO] [stderr] 639 | | if self.cursor >= 1 && self.cursor == buf_num_chars { [INFO] [stderr] 640 | | self.cursor -= 1; [INFO] [stderr] 641 | | } [INFO] [stderr] 642 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 638 | if self.no_eol && self.cursor >= 1 && self.cursor == buf_num_chars { [INFO] [stderr] 639 | self.cursor -= 1; [INFO] [stderr] 640 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/context.rs:26:16 [INFO] [stderr] | [INFO] [stderr] 26 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 27 | | if c != ' ' { [INFO] [stderr] 28 | | word_start = Some(i); [INFO] [stderr] 29 | | } [INFO] [stderr] 30 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 26 | } else if c != ' ' { [INFO] [stderr] 27 | word_start = Some(i); [INFO] [stderr] 28 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unnecessary parentheses around function argument [INFO] [stderr] --> src/editor.rs:225:27 [INFO] [stderr] | [INFO] [stderr] 225 | let cols = max(1, (w as usize / (max_word_size))); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_parens)] on by default [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/editor.rs:363:16 [INFO] [stderr] | [INFO] [stderr] 363 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 364 | | if self.context.history.len() > 0 { [INFO] [stderr] 365 | | self.cur_history_loc = Some(self.context.history.len() - 1); [INFO] [stderr] 366 | | } else { [INFO] [stderr] 367 | | return self.display(); [INFO] [stderr] 368 | | } [INFO] [stderr] 369 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 363 | } else if self.context.history.len() > 0 { [INFO] [stderr] 364 | self.cur_history_loc = Some(self.context.history.len() - 1); [INFO] [stderr] 365 | } else { [INFO] [stderr] 366 | return self.display(); [INFO] [stderr] 367 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this if statement can be collapsed [INFO] [stderr] --> src/editor.rs:638:9 [INFO] [stderr] | [INFO] [stderr] 638 | / if self.no_eol { [INFO] [stderr] 639 | | if self.cursor >= 1 && self.cursor == buf_num_chars { [INFO] [stderr] 640 | | self.cursor -= 1; [INFO] [stderr] 641 | | } [INFO] [stderr] 642 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 638 | if self.no_eol && self.cursor >= 1 && self.cursor == buf_num_chars { [INFO] [stderr] 639 | self.cursor -= 1; [INFO] [stderr] 640 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/context.rs:26:16 [INFO] [stderr] | [INFO] [stderr] 26 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 27 | | if c != ' ' { [INFO] [stderr] 28 | | word_start = Some(i); [INFO] [stderr] 29 | | } [INFO] [stderr] 30 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 26 | } else if c != ' ' { [INFO] [stderr] 27 | word_start = Some(i); [INFO] [stderr] 28 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/editor.rs:575:21 [INFO] [stderr] | [INFO] [stderr] 575 | let mut buf = self.current_buffer_mut(); [INFO] [stderr] | ----^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_mut)] on by default [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/context.rs:73:9 [INFO] [stderr] | [INFO] [stderr] 73 | mut handler: &mut EventHandler>, [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/context.rs:91:9 [INFO] [stderr] | [INFO] [stderr] 91 | mut handler: &mut EventHandler>, [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/context.rs:109:9 [INFO] [stderr] | [INFO] [stderr] 109 | mut handler: &mut EventHandler, [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/editor.rs:33:12 [INFO] [stderr] | [INFO] [stderr] 33 | if words.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `words.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/editor.rs:174:13 [INFO] [stderr] | [INFO] [stderr] 174 | try!(self.out.write(b"\r\n")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::unused_io_amount)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/editor.rs:274:12 [INFO] [stderr] | [INFO] [stderr] 274 | if completions.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `completions.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/complete.rs:41:9 [INFO] [stderr] | [INFO] [stderr] 41 | / let start_owned; [INFO] [stderr] 42 | | if start.starts_with("\"") || start.starts_with("'") { [INFO] [stderr] 43 | | start = &start[1..]; [INFO] [stderr] 44 | | if start.len() >= 1 { [INFO] [stderr] ... | [INFO] [stderr] 49 | | start_owned = start.replace("\\ ", " "); [INFO] [stderr] 50 | | } [INFO] [stderr] | |_________^ help: it is more idiomatic to write: `let start_owned = if start.starts_with("\"") || start.starts_with("'") { ..; start.into() } else { start.replace("\\ ", " ") };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:42:30 [INFO] [stderr] | [INFO] [stderr] 42 | if start.starts_with("\"") || start.starts_with("'") { [INFO] [stderr] | ^^^^ help: try using a char instead: `'\"'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:42:57 [INFO] [stderr] | [INFO] [stderr] 42 | if start.starts_with("\"") || start.starts_with("'") { [INFO] [stderr] | ^^^ help: try using a char instead: `'''` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/complete.rs:44:16 [INFO] [stderr] | [INFO] [stderr] 44 | if start.len() >= 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!start.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:68:67 [INFO] [stderr] | [INFO] [stderr] 68 | Some(parent) if start != "" && !start_owned.ends_with("/") && [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:81:65 [INFO] [stderr] | [INFO] [stderr] 81 | completing_dir = start == "" || start.ends_with("/") || full_path.ends_with(".."); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/complete.rs:110:21 [INFO] [stderr] | [INFO] [stderr] 110 | s = s + "/"; [INFO] [stderr] | ^^^^^^^^^^^ help: replace it with: `s += "/"` [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: you should consider adding a `Default` implementation for `context::Context` [INFO] [stderr] --> src/context.rs:57:5 [INFO] [stderr] | [INFO] [stderr] 57 | / pub fn new() -> Self { [INFO] [stderr] 58 | | Context { [INFO] [stderr] 59 | | history: History::new(), [INFO] [stderr] 60 | | completer: None, [INFO] [stderr] ... | [INFO] [stderr] 63 | | } [INFO] [stderr] 64 | | } [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] 56 | impl Default for context::Context { [INFO] [stderr] 57 | fn default() -> Self { [INFO] [stderr] 58 | Self::new() [INFO] [stderr] 59 | } [INFO] [stderr] 60 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `buffer::Buffer` [INFO] [stderr] --> src/buffer.rs:85:5 [INFO] [stderr] | [INFO] [stderr] 85 | / pub fn new() -> Self { [INFO] [stderr] 86 | | Buffer { [INFO] [stderr] 87 | | data: Vec::new(), [INFO] [stderr] 88 | | actions: Vec::new(), [INFO] [stderr] 89 | | undone_actions: Vec::new(), [INFO] [stderr] 90 | | } [INFO] [stderr] 91 | | } [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] 41 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/buffer.rs:161:12 [INFO] [stderr] | [INFO] [stderr] 161 | if self.actions.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.actions.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable [INFO] [stderr] --> src/buffer.rs:231:9 [INFO] [stderr] | [INFO] [stderr] 231 | self.data[start..end].iter().cloned().collect() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::iter_cloned_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/buffer.rs:259:9 [INFO] [stderr] | [INFO] [stderr] 259 | try!(out.write(string.as_bytes())); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/buffer.rs:277:9 [INFO] [stderr] | [INFO] [stderr] 277 | out.write(string.as_bytes())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/buffer.rs:297:12 [INFO] [stderr] | [INFO] [stderr] 297 | if other.data.len() != 0 && self_len != other_len { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!other.data.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: avoid using `collect()` when not needed [INFO] [stderr] --> src/buffer.rs:302:17 [INFO] [stderr] | [INFO] [stderr] 302 | / .collect::>() [INFO] [stderr] 303 | | .len(); [INFO] [stderr] | |______________________^ help: replace with: `.count()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_collect [INFO] [stderr] [INFO] [stderr] warning: item `history::History` has a public `len` method but no corresponding `is_empty` method [INFO] [stderr] --> src/history.rs:44:1 [INFO] [stderr] | [INFO] [stderr] 44 | / impl History { [INFO] [stderr] 45 | | /// It's important to execute this function before exiting your program, as it will [INFO] [stderr] 46 | | /// ensure that all history data has been written to the disk. [INFO] [stderr] 47 | | pub fn commit_history(&mut self) { [INFO] [stderr] ... | [INFO] [stderr] 183 | | } [INFO] [stderr] 184 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_without_is_empty)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_without_is_empty [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `history::History` [INFO] [stderr] --> src/history.rs:57:5 [INFO] [stderr] | [INFO] [stderr] 57 | / pub fn new() -> History { [INFO] [stderr] 58 | | let max_file_size = Arc::new(AtomicUsize::new(DEFAULT_MAX_SIZE)); [INFO] [stderr] 59 | | let bg_stop = Arc::new(AtomicBool::new(false)); [INFO] [stderr] 60 | | let (sender, receiver) = channel(); [INFO] [stderr] ... | [INFO] [stderr] 87 | | } [INFO] [stderr] 88 | | } [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] 44 | impl Default for history::History { [INFO] [stderr] 45 | fn default() -> Self { [INFO] [stderr] 46 | Self::new() [INFO] [stderr] 47 | } [INFO] [stderr] 48 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: called `map(f)` on an Option value where `f` is a unit closure [INFO] [stderr] --> src/history.rs:99:9 [INFO] [stderr] | [INFO] [stderr] 99 | self.file_name.as_ref().map(|name| { [INFO] [stderr] | _________^ [INFO] [stderr] | |_________| [INFO] [stderr] | || [INFO] [stderr] 100 | || let _ = self.sender.send((new_item.clone(), name.to_owned())); [INFO] [stderr] 101 | || }); [INFO] [stderr] | ||__________^- help: try this: `if let Some(name) = self.file_name.as_ref() { let _ = self.sender.send((new_item.clone(), name.to_owned())); }` [INFO] [stderr] | |___________| [INFO] [stderr] | [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::option_map_unit_fn)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_unit_fn [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/history.rs:125:33 [INFO] [stderr] | [INFO] [stderr] 125 | let pos = curr_position.unwrap_or(self.buffers.len()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| self.buffers.len())` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the VecDeque [INFO] [stderr] --> src/history.rs:191:28 [INFO] [stderr] | [INFO] [stderr] 191 | self.buffers_ref().into_iter() [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/keymap/vi.rs:47:9 [INFO] [stderr] | [INFO] [stderr] 47 | / self.0.last() [INFO] [stderr] 48 | | .map(|&m| m) [INFO] [stderr] | |________________________^ help: Consider calling the dedicated `cloned` method: `self.0.last().cloned()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_clone)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/keymap/vi.rs:95:20 [INFO] [stderr] | [INFO] [stderr] 95 | pub fn advance(&self, cursor: &mut usize, max: usize) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/keymap/vi.rs:99:20 [INFO] [stderr] | [INFO] [stderr] 99 | pub fn go_back(&self, cursor: &mut usize, max: usize) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/keymap/vi.rs:106:20 [INFO] [stderr] | [INFO] [stderr] 106 | fn move_cursor(&self, cursor: &mut usize, max: usize, dir: ViMoveDir) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` [INFO] [stderr] --> src/keymap/vi.rs:271:5 [INFO] [stderr] | [INFO] [stderr] 271 | / buf.chars() [INFO] [stderr] 272 | | .enumerate() [INFO] [stderr] 273 | | .skip(start) [INFO] [stderr] 274 | | .filter(|&(_, &c)| c == ch) [INFO] [stderr] 275 | | .skip(count - 1) [INFO] [stderr] 276 | | .next() [INFO] [stderr] | |_______________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::iter_skip_next)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_skip_next [INFO] [stderr] [INFO] [stderr] warning: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` [INFO] [stderr] --> src/keymap/vi.rs:283:5 [INFO] [stderr] | [INFO] [stderr] 283 | / buf.chars() [INFO] [stderr] 284 | | .enumerate() [INFO] [stderr] 285 | | .rev() [INFO] [stderr] 286 | | .skip(rstart) [INFO] [stderr] 287 | | .filter(|&(_, &c)| c == ch) [INFO] [stderr] 288 | | .skip(count - 1) [INFO] [stderr] 289 | | .next() [INFO] [stderr] | |_______________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_skip_next [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/keymap/vi.rs:378:9 [INFO] [stderr] | [INFO] [stderr] 378 | / match last_mode { [INFO] [stderr] 379 | | Delete(start_pos) => { [INFO] [stderr] 380 | | // perform the delete operation [INFO] [stderr] 381 | | match move_type { [INFO] [stderr] ... | [INFO] [stderr] 395 | | _ => {} [INFO] [stderr] 396 | | }; [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] 378 | if let Delete(start_pos) = last_mode { [INFO] [stderr] 379 | // perform the delete operation [INFO] [stderr] 380 | match move_type { [INFO] [stderr] 381 | Exclusive => try!(self.ed.delete_until(start_pos)), [INFO] [stderr] 382 | Inclusive => try!(self.ed.delete_until_inclusive(start_pos)), [INFO] [stderr] 383 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:9:8 [INFO] [stderr] | [INFO] [stderr] 9 | if among.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `among.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:16:12 [INFO] [stderr] | [INFO] [stderr] 16 | if s.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `s.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [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/util.rs:72:35 [INFO] [stderr] | [INFO] [stderr] 72 | AnsiState::Osc => match c { [INFO] [stderr] | ___________________________________^ [INFO] [stderr] 73 | | '\x07' => s = AnsiState::Norm, [INFO] [stderr] 74 | | _ => (), [INFO] [stderr] 75 | | } [INFO] [stderr] | |_________________^ help: try this: `if let '\x07' = c { s = AnsiState::Norm }` [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] error: aborting due to 3 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `liner`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/editor.rs:575:21 [INFO] [stderr] | [INFO] [stderr] 575 | let mut buf = self.current_buffer_mut(); [INFO] [stderr] | ----^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_mut)] on by default [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/context.rs:73:9 [INFO] [stderr] | [INFO] [stderr] 73 | mut handler: &mut EventHandler>, [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/context.rs:91:9 [INFO] [stderr] | [INFO] [stderr] 91 | mut handler: &mut EventHandler>, [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/context.rs:109:9 [INFO] [stderr] | [INFO] [stderr] 109 | mut handler: &mut EventHandler, [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/editor.rs:33:12 [INFO] [stderr] | [INFO] [stderr] 33 | if words.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `words.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/editor.rs:174:13 [INFO] [stderr] | [INFO] [stderr] 174 | try!(self.out.write(b"\r\n")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::unused_io_amount)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/editor.rs:274:12 [INFO] [stderr] | [INFO] [stderr] 274 | if completions.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `completions.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/complete.rs:41:9 [INFO] [stderr] | [INFO] [stderr] 41 | / let start_owned; [INFO] [stderr] 42 | | if start.starts_with("\"") || start.starts_with("'") { [INFO] [stderr] 43 | | start = &start[1..]; [INFO] [stderr] 44 | | if start.len() >= 1 { [INFO] [stderr] ... | [INFO] [stderr] 49 | | start_owned = start.replace("\\ ", " "); [INFO] [stderr] 50 | | } [INFO] [stderr] | |_________^ help: it is more idiomatic to write: `let start_owned = if start.starts_with("\"") || start.starts_with("'") { ..; start.into() } else { start.replace("\\ ", " ") };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:42:30 [INFO] [stderr] | [INFO] [stderr] 42 | if start.starts_with("\"") || start.starts_with("'") { [INFO] [stderr] | ^^^^ help: try using a char instead: `'\"'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:42:57 [INFO] [stderr] | [INFO] [stderr] 42 | if start.starts_with("\"") || start.starts_with("'") { [INFO] [stderr] | ^^^ help: try using a char instead: `'''` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/complete.rs:44:16 [INFO] [stderr] | [INFO] [stderr] 44 | if start.len() >= 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!start.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:68:67 [INFO] [stderr] | [INFO] [stderr] 68 | Some(parent) if start != "" && !start_owned.ends_with("/") && [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/complete.rs:81:65 [INFO] [stderr] | [INFO] [stderr] 81 | completing_dir = start == "" || start.ends_with("/") || full_path.ends_with(".."); [INFO] [stderr] | ^^^ help: try using a char instead: `'/'` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/complete.rs:110:21 [INFO] [stderr] | [INFO] [stderr] 110 | s = s + "/"; [INFO] [stderr] | ^^^^^^^^^^^ help: replace it with: `s += "/"` [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: you should consider adding a `Default` implementation for `context::Context` [INFO] [stderr] --> src/context.rs:57:5 [INFO] [stderr] | [INFO] [stderr] 57 | / pub fn new() -> Self { [INFO] [stderr] 58 | | Context { [INFO] [stderr] 59 | | history: History::new(), [INFO] [stderr] 60 | | completer: None, [INFO] [stderr] ... | [INFO] [stderr] 63 | | } [INFO] [stderr] 64 | | } [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] 56 | impl Default for context::Context { [INFO] [stderr] 57 | fn default() -> Self { [INFO] [stderr] 58 | Self::new() [INFO] [stderr] 59 | } [INFO] [stderr] 60 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `buffer::Buffer` [INFO] [stderr] --> src/buffer.rs:85:5 [INFO] [stderr] | [INFO] [stderr] 85 | / pub fn new() -> Self { [INFO] [stderr] 86 | | Buffer { [INFO] [stderr] 87 | | data: Vec::new(), [INFO] [stderr] 88 | | actions: Vec::new(), [INFO] [stderr] 89 | | undone_actions: Vec::new(), [INFO] [stderr] 90 | | } [INFO] [stderr] 91 | | } [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] 41 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/buffer.rs:161:12 [INFO] [stderr] | [INFO] [stderr] 161 | if self.actions.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.actions.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable [INFO] [stderr] --> src/buffer.rs:231:9 [INFO] [stderr] | [INFO] [stderr] 231 | self.data[start..end].iter().cloned().collect() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::iter_cloned_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/buffer.rs:259:9 [INFO] [stderr] | [INFO] [stderr] 259 | try!(out.write(string.as_bytes())); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/buffer.rs:277:9 [INFO] [stderr] | [INFO] [stderr] 277 | out.write(string.as_bytes())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/buffer.rs:297:12 [INFO] [stderr] | [INFO] [stderr] 297 | if other.data.len() != 0 && self_len != other_len { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!other.data.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: avoid using `collect()` when not needed [INFO] [stderr] --> src/buffer.rs:302:17 [INFO] [stderr] | [INFO] [stderr] 302 | / .collect::>() [INFO] [stderr] 303 | | .len(); [INFO] [stderr] | |______________________^ help: replace with: `.count()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_collect [INFO] [stderr] [INFO] [stderr] warning: item `history::History` has a public `len` method but no corresponding `is_empty` method [INFO] [stderr] --> src/history.rs:44:1 [INFO] [stderr] | [INFO] [stderr] 44 | / impl History { [INFO] [stderr] 45 | | /// It's important to execute this function before exiting your program, as it will [INFO] [stderr] 46 | | /// ensure that all history data has been written to the disk. [INFO] [stderr] 47 | | pub fn commit_history(&mut self) { [INFO] [stderr] ... | [INFO] [stderr] 183 | | } [INFO] [stderr] 184 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_without_is_empty)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_without_is_empty [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `history::History` [INFO] [stderr] --> src/history.rs:57:5 [INFO] [stderr] | [INFO] [stderr] 57 | / pub fn new() -> History { [INFO] [stderr] 58 | | let max_file_size = Arc::new(AtomicUsize::new(DEFAULT_MAX_SIZE)); [INFO] [stderr] 59 | | let bg_stop = Arc::new(AtomicBool::new(false)); [INFO] [stderr] 60 | | let (sender, receiver) = channel(); [INFO] [stderr] ... | [INFO] [stderr] 87 | | } [INFO] [stderr] 88 | | } [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] 44 | impl Default for history::History { [INFO] [stderr] 45 | fn default() -> Self { [INFO] [stderr] 46 | Self::new() [INFO] [stderr] 47 | } [INFO] [stderr] 48 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: called `map(f)` on an Option value where `f` is a unit closure [INFO] [stderr] --> src/history.rs:99:9 [INFO] [stderr] | [INFO] [stderr] 99 | self.file_name.as_ref().map(|name| { [INFO] [stderr] | _________^ [INFO] [stderr] | |_________| [INFO] [stderr] | || [INFO] [stderr] 100 | || let _ = self.sender.send((new_item.clone(), name.to_owned())); [INFO] [stderr] 101 | || }); [INFO] [stderr] | ||__________^- help: try this: `if let Some(name) = self.file_name.as_ref() { let _ = self.sender.send((new_item.clone(), name.to_owned())); }` [INFO] [stderr] | |___________| [INFO] [stderr] | [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::option_map_unit_fn)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#option_map_unit_fn [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/history.rs:125:33 [INFO] [stderr] | [INFO] [stderr] 125 | let pos = curr_position.unwrap_or(self.buffers.len()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| self.buffers.len())` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the VecDeque [INFO] [stderr] --> src/history.rs:191:28 [INFO] [stderr] | [INFO] [stderr] 191 | self.buffers_ref().into_iter() [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/keymap/vi.rs:47:9 [INFO] [stderr] | [INFO] [stderr] 47 | / self.0.last() [INFO] [stderr] 48 | | .map(|&m| m) [INFO] [stderr] | |________________________^ help: Consider calling the dedicated `cloned` method: `self.0.last().cloned()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_clone)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/keymap/vi.rs:95:20 [INFO] [stderr] | [INFO] [stderr] 95 | pub fn advance(&self, cursor: &mut usize, max: usize) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/keymap/vi.rs:99:20 [INFO] [stderr] | [INFO] [stderr] 99 | pub fn go_back(&self, cursor: &mut usize, max: usize) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/keymap/vi.rs:106:20 [INFO] [stderr] | [INFO] [stderr] 106 | fn move_cursor(&self, cursor: &mut usize, max: usize, dir: ViMoveDir) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` [INFO] [stderr] --> src/keymap/vi.rs:271:5 [INFO] [stderr] | [INFO] [stderr] 271 | / buf.chars() [INFO] [stderr] 272 | | .enumerate() [INFO] [stderr] 273 | | .skip(start) [INFO] [stderr] 274 | | .filter(|&(_, &c)| c == ch) [INFO] [stderr] 275 | | .skip(count - 1) [INFO] [stderr] 276 | | .next() [INFO] [stderr] | |_______________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::iter_skip_next)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_skip_next [INFO] [stderr] [INFO] [stderr] warning: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` [INFO] [stderr] --> src/keymap/vi.rs:283:5 [INFO] [stderr] | [INFO] [stderr] 283 | / buf.chars() [INFO] [stderr] 284 | | .enumerate() [INFO] [stderr] 285 | | .rev() [INFO] [stderr] 286 | | .skip(rstart) [INFO] [stderr] 287 | | .filter(|&(_, &c)| c == ch) [INFO] [stderr] 288 | | .skip(count - 1) [INFO] [stderr] 289 | | .next() [INFO] [stderr] | |_______________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_skip_next [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/keymap/vi.rs:378:9 [INFO] [stderr] | [INFO] [stderr] 378 | / match last_mode { [INFO] [stderr] 379 | | Delete(start_pos) => { [INFO] [stderr] 380 | | // perform the delete operation [INFO] [stderr] 381 | | match move_type { [INFO] [stderr] ... | [INFO] [stderr] 395 | | _ => {} [INFO] [stderr] 396 | | }; [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] 378 | if let Delete(start_pos) = last_mode { [INFO] [stderr] 379 | // perform the delete operation [INFO] [stderr] 380 | match move_type { [INFO] [stderr] 381 | Exclusive => try!(self.ed.delete_until(start_pos)), [INFO] [stderr] 382 | Inclusive => try!(self.ed.delete_until_inclusive(start_pos)), [INFO] [stderr] 383 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: in an 'if' condition, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a 'let' [INFO] [stderr] --> src/keymap/vi.rs:1047:47 [INFO] [stderr] | [INFO] [stderr] 1047 | if keymap.handle_key(*k, &mut |_| {}).unwrap() { [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::block_in_if_condition_stmt)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#block_in_if_condition_stmt [INFO] [stderr] [INFO] [stderr] warning: in an 'if' condition, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a 'let' [INFO] [stderr] --> src/keymap/emacs.rs:202:47 [INFO] [stderr] | [INFO] [stderr] 202 | if keymap.handle_key(*k, &mut |_| {}).unwrap() { [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#block_in_if_condition_stmt [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:9:8 [INFO] [stderr] | [INFO] [stderr] 9 | if among.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `among.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/util.rs:16:12 [INFO] [stderr] | [INFO] [stderr] 16 | if s.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `s.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [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/util.rs:72:35 [INFO] [stderr] | [INFO] [stderr] 72 | AnsiState::Osc => match c { [INFO] [stderr] | ___________________________________^ [INFO] [stderr] 73 | | '\x07' => s = AnsiState::Norm, [INFO] [stderr] 74 | | _ => (), [INFO] [stderr] 75 | | } [INFO] [stderr] | |_________________^ help: try this: `if let '\x07' = c { s = AnsiState::Norm }` [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: identical conversion [INFO] [stderr] --> src/test.rs:93:30 [INFO] [stderr] | [INFO] [stderr] 93 | h.set_file_name(Some(String::from(tmp_file.to_string_lossy().into_owned()))); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `String::from()`: `tmp_file.to_string_lossy().into_owned()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::identity_conversion)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_conversion [INFO] [stderr] [INFO] [stderr] warning: identical conversion [INFO] [stderr] --> src/test.rs:129:26 [INFO] [stderr] | [INFO] [stderr] 129 | h.set_file_name(Some(String::from(tmp_file.to_string_lossy().into_owned()))); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `String::from()`: `tmp_file.to_string_lossy().into_owned()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_conversion [INFO] [stderr] [INFO] [stderr] error: aborting due to 3 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `liner`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "be02db3a9e4073a08775c9c8ebf938bca9a75d1e92e75ae3a6b95ef792bb3ead"` [INFO] running `"docker" "rm" "-f" "be02db3a9e4073a08775c9c8ebf938bca9a75d1e92e75ae3a6b95ef792bb3ead"` [INFO] [stdout] be02db3a9e4073a08775c9c8ebf938bca9a75d1e92e75ae3a6b95ef792bb3ead