[INFO] updating cached repository neosmart/static-compress [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/neosmart/static-compress [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/neosmart/static-compress" "work/ex/clippy-test-run/sources/stable/gh/neosmart/static-compress"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/neosmart/static-compress'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/neosmart/static-compress" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/neosmart/static-compress"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/neosmart/static-compress'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 995aaaf7cdb7083f39b098d51fc388be76e1e622 [INFO] sha for GitHub repo neosmart/static-compress: 995aaaf7cdb7083f39b098d51fc388be76e1e622 [INFO] validating manifest of neosmart/static-compress 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 neosmart/static-compress 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 neosmart/static-compress [INFO] finished frobbing neosmart/static-compress [INFO] frobbed toml for neosmart/static-compress written to work/ex/clippy-test-run/sources/stable/gh/neosmart/static-compress/Cargo.toml [INFO] started frobbing neosmart/static-compress [INFO] finished frobbing neosmart/static-compress [INFO] frobbed toml for neosmart/static-compress written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/neosmart/static-compress/Cargo.toml [INFO] crate neosmart/static-compress 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 neosmart/static-compress against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-4/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/neosmart/static-compress:/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] f1bc5a59d923ec88cf04e1f5a91a515d60f8137944ad830678c0d25f538f2661 [INFO] running `"docker" "start" "-a" "f1bc5a59d923ec88cf04e1f5a91a515d60f8137944ad830678c0d25f538f2661"` [INFO] [stderr] Checking encode_unicode v0.3.1 [INFO] [stderr] Checking adler32 v0.2.0 [INFO] [stderr] Compiling miniz-sys v0.1.9 [INFO] [stderr] Compiling brotli-sys v0.3.0 [INFO] [stderr] Checking memchr v1.0.1 [INFO] [stderr] Checking term_size v0.3.0 [INFO] [stderr] Checking atty v0.2.2 [INFO] [stderr] Checking time v0.1.38 [INFO] [stderr] Checking filetime v0.1.10 [INFO] [stderr] Checking crc v1.4.0 [INFO] [stderr] Checking pretty-bytes v0.2.1 [INFO] [stderr] Checking chan v0.1.19 [INFO] [stderr] Checking textwrap v0.6.0 [INFO] [stderr] Checking aho-corasick v0.6.3 [INFO] [stderr] Checking csv v0.15.0 [INFO] [stderr] Checking backtrace-sys v0.1.11 [INFO] [stderr] Checking zopfli v0.3.6 [INFO] [stderr] Checking stderr v0.7.1 [INFO] [stderr] Checking clap v2.25.0 [INFO] [stderr] Checking backtrace v0.3.2 [INFO] [stderr] Checking prettytable-rs v0.6.7 [INFO] [stderr] Checking regex v0.2.2 [INFO] [stderr] Checking flate2 v0.2.19 [INFO] [stderr] Checking error-chain v0.10.0 [INFO] [stderr] Checking globset v0.2.0 [INFO] [stderr] Checking brotli2 v0.3.0 [INFO] [stderr] Checking static-compress v0.3.2 (/opt/crater/workdir) [INFO] [stderr] warning: using `writeln!(f, "")` [INFO] [stderr] --> src/structs.rs:97:9 [INFO] [stderr] | [INFO] [stderr] 97 | writeln!(f, "")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: replace it with: `writeln!(f)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::writeln_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#writeln_empty_string [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/main.rs:91:9 [INFO] [stderr] | [INFO] [stderr] 91 | compressor: compressor, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `compressor` [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: using `writeln!(f, "")` [INFO] [stderr] --> src/structs.rs:97:9 [INFO] [stderr] | [INFO] [stderr] 97 | writeln!(f, "")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: replace it with: `writeln!(f)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::writeln_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#writeln_empty_string [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/main.rs:91:9 [INFO] [stderr] | [INFO] [stderr] 91 | compressor: compressor, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `compressor` [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: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/lists.rs:1:23 [INFO] [stderr] | [INFO] [stderr] 1 | pub const COMP_EXTS: &'static [&'static str] = &[ [INFO] [stderr] | -^^^^^^^--------------- help: consider removing `'static`: `&[&'static str]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::const_static_lifetime)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/lists.rs:1:33 [INFO] [stderr] | [INFO] [stderr] 1 | pub const COMP_EXTS: &'static [&'static str] = &[ [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/structs.rs:32:9 [INFO] [stderr] | [INFO] [stderr] 32 | return Ok(r); [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(r)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/structs.rs:87:9 [INFO] [stderr] | [INFO] [stderr] 87 | return self.total_compressed as f32 / self.total_uncompressed as f32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `self.total_compressed as f32 / self.total_uncompressed as f32` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/structs.rs:91:9 [INFO] [stderr] | [INFO] [stderr] 91 | return self.total_compressed_now as f32 / self.total_uncompressed_now as f32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `self.total_compressed_now as f32 / self.total_uncompressed_now as f32` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/main.rs:290:5 [INFO] [stderr] | [INFO] [stderr] 290 | return Ok(r); [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(r)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/lists.rs:1:23 [INFO] [stderr] | [INFO] [stderr] 1 | pub const COMP_EXTS: &'static [&'static str] = &[ [INFO] [stderr] | -^^^^^^^--------------- help: consider removing `'static`: `&[&'static str]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::const_static_lifetime)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/lists.rs:1:33 [INFO] [stderr] | [INFO] [stderr] 1 | pub const COMP_EXTS: &'static [&'static str] = &[ [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/structs.rs:32:9 [INFO] [stderr] | [INFO] [stderr] 32 | return Ok(r); [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(r)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/structs.rs:87:9 [INFO] [stderr] | [INFO] [stderr] 87 | return self.total_compressed as f32 / self.total_uncompressed as f32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `self.total_compressed as f32 / self.total_uncompressed as f32` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/structs.rs:91:9 [INFO] [stderr] | [INFO] [stderr] 91 | return self.total_compressed_now as f32 / self.total_uncompressed_now as f32; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `self.total_compressed_now as f32 / self.total_uncompressed_now as f32` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/main.rs:290:5 [INFO] [stderr] | [INFO] [stderr] 290 | return Ok(r); [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(r)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:294:16 [INFO] [stderr] | [INFO] [stderr] 294 | fn fix_filters(mut filters: &mut Vec) { [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/compression.rs:14:9 [INFO] [stderr] | [INFO] [stderr] 14 | / match self { [INFO] [stderr] 15 | | &CompressionAlgorithm::Brotli => "br", [INFO] [stderr] 16 | | &CompressionAlgorithm::GZip => "gz", [INFO] [stderr] 17 | | &CompressionAlgorithm::WebP => "webp", [INFO] [stderr] 18 | | &CompressionAlgorithm::Zopfli => "gz", [INFO] [stderr] 19 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 14 | match *self { [INFO] [stderr] 15 | CompressionAlgorithm::Brotli => "br", [INFO] [stderr] 16 | CompressionAlgorithm::GZip => "gz", [INFO] [stderr] 17 | CompressionAlgorithm::WebP => "webp", [INFO] [stderr] 18 | CompressionAlgorithm::Zopfli => "gz", [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/compression.rs:25:9 [INFO] [stderr] | [INFO] [stderr] 25 | / match self { [INFO] [stderr] 26 | | &CompressionAlgorithm::GZip => gzip_compress(src, dst, quality), [INFO] [stderr] 27 | | &CompressionAlgorithm::Brotli => brotli_compress(src, dst, quality), [INFO] [stderr] 28 | | &CompressionAlgorithm::WebP => webp_compress(src, dst, quality), [INFO] [stderr] 29 | | &CompressionAlgorithm::Zopfli => zopfli_compress(src, dst, quality), [INFO] [stderr] 30 | | // _ => bail!("Compression algorithm not implemented!"), [INFO] [stderr] 31 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 25 | match *self { [INFO] [stderr] 26 | CompressionAlgorithm::GZip => gzip_compress(src, dst, quality), [INFO] [stderr] 27 | CompressionAlgorithm::Brotli => brotli_compress(src, dst, quality), [INFO] [stderr] 28 | CompressionAlgorithm::WebP => webp_compress(src, dst, quality), [INFO] [stderr] 29 | CompressionAlgorithm::Zopfli => zopfli_compress(src, dst, quality), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/compression.rs:71:63 [INFO] [stderr] | [INFO] [stderr] 71 | let mut encoder = brotli2::write::BrotliEncoder::new(dst, level as u32); [INFO] [stderr] | ^^^^^^^^^^^^ help: try: `u32::from(level)` [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: The function/method `zopfli::compress` doesn't need a mutable reference [INFO] [stderr] --> src/compression.rs:95:74 [INFO] [stderr] | [INFO] [stderr] 95 | zopfli::compress(&zopfli::Options::default(), &zopfli::Format::Gzip, &mut src_data, &mut dst)?; [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/main.rs:73:22 [INFO] [stderr] | [INFO] [stderr] 73 | fn get_parameter<'a, T>(matches: &clap::ArgMatches, name: &'static str, default_value: T) -> Result [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/main.rs:88:14 [INFO] [stderr] | [INFO] [stderr] 88 | .unwrap_or(compressor.extension()) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| compressor.extension())` [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 lifetime isn't used in the function definition [INFO] [stderr] --> src/main.rs:143:18 [INFO] [stderr] | [INFO] [stderr] 143 | fn start_workers<'a>(params: &Arc) -> (chan::Sender, mpsc::Receiver, chan::WaitGroup) { [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: this boolean expression can be simplified [INFO] [stderr] --> src/main.rs:258:8 [INFO] [stderr] | [INFO] [stderr] 258 | if !stats_tx.send(local_stats).is_ok() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `stats_tx.send(local_stats).is_err()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::nonminimal_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/main.rs:204:5 [INFO] [stderr] | [INFO] [stderr] 204 | / loop { [INFO] [stderr] 205 | | let src = match rx.recv() { [INFO] [stderr] 206 | | Some(task) => task, [INFO] [stderr] 207 | | None => break, //no more tasks [INFO] [stderr] ... | [INFO] [stderr] 255 | | } [INFO] [stderr] 256 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(task) = rx.recv() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/main.rs:226:25 [INFO] [stderr] | [INFO] [stderr] 226 | / match src_seconds == dst_seconds { [INFO] [stderr] 227 | | true => { [INFO] [stderr] 228 | | local_stats.update(src_metadata.len(), dst_metadata.len(), false); [INFO] [stderr] 229 | | return Ok(());//no need to recompress [INFO] [stderr] ... | [INFO] [stderr] 233 | | } [INFO] [stderr] 234 | | }; [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 226 | if src_seconds == dst_seconds { [INFO] [stderr] 227 | local_stats.update(src_metadata.len(), dst_metadata.len(), false); [INFO] [stderr] 228 | return Ok(());//no need to recompress [INFO] [stderr] 229 | } else { [INFO] [stderr] 230 | std::fs::remove_file(dst)?; //throw if we can't [INFO] [stderr] 231 | }; [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/main.rs:264:16 [INFO] [stderr] | [INFO] [stderr] 264 | let term = match case_sensitive { [INFO] [stderr] | ________________^ [INFO] [stderr] 265 | | true => search_term.to_owned(), [INFO] [stderr] 266 | | false => search_term.to_lowercase(), [INFO] [stderr] 267 | | }; [INFO] [stderr] | |_____^ help: consider using an if/else expression: `if case_sensitive { search_term.to_owned() } else { search_term.to_lowercase() }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/main.rs:275:26 [INFO] [stderr] | [INFO] [stderr] 275 | .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: the loop variable `i` is only used to index `filters`. [INFO] [stderr] --> src/main.rs:295:14 [INFO] [stderr] | [INFO] [stderr] 295 | for i in 0..filters.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 295 | for in &mut filters { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/main.rs:298:17 [INFO] [stderr] | [INFO] [stderr] 298 | let ref path = filters[i]; [INFO] [stderr] | ----^^^^^^^^-------------- help: try: `let path = &filters[i];` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/main.rs:311:27 [INFO] [stderr] | [INFO] [stderr] 311 | fn extract_paths(filters: &Vec) -> Result> { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/main.rs:329:45 [INFO] [stderr] | [INFO] [stderr] 329 | c => { last_char = Some(c.clone()); true } [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*c` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: identical conversion [INFO] [stderr] --> src/main.rs:363:29 [INFO] [stderr] | [INFO] [stderr] 363 | let dir = match PathBuf::from(dir).parent() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: consider removing `PathBuf::from()`: `dir` [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: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:294:16 [INFO] [stderr] | [INFO] [stderr] 294 | fn fix_filters(mut filters: &mut Vec) { [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/compression.rs:14:9 [INFO] [stderr] | [INFO] [stderr] 14 | / match self { [INFO] [stderr] 15 | | &CompressionAlgorithm::Brotli => "br", [INFO] [stderr] 16 | | &CompressionAlgorithm::GZip => "gz", [INFO] [stderr] 17 | | &CompressionAlgorithm::WebP => "webp", [INFO] [stderr] 18 | | &CompressionAlgorithm::Zopfli => "gz", [INFO] [stderr] 19 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 14 | match *self { [INFO] [stderr] 15 | CompressionAlgorithm::Brotli => "br", [INFO] [stderr] 16 | CompressionAlgorithm::GZip => "gz", [INFO] [stderr] 17 | CompressionAlgorithm::WebP => "webp", [INFO] [stderr] 18 | CompressionAlgorithm::Zopfli => "gz", [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/compression.rs:25:9 [INFO] [stderr] | [INFO] [stderr] 25 | / match self { [INFO] [stderr] 26 | | &CompressionAlgorithm::GZip => gzip_compress(src, dst, quality), [INFO] [stderr] 27 | | &CompressionAlgorithm::Brotli => brotli_compress(src, dst, quality), [INFO] [stderr] 28 | | &CompressionAlgorithm::WebP => webp_compress(src, dst, quality), [INFO] [stderr] 29 | | &CompressionAlgorithm::Zopfli => zopfli_compress(src, dst, quality), [INFO] [stderr] 30 | | // _ => bail!("Compression algorithm not implemented!"), [INFO] [stderr] 31 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 25 | match *self { [INFO] [stderr] 26 | CompressionAlgorithm::GZip => gzip_compress(src, dst, quality), [INFO] [stderr] 27 | CompressionAlgorithm::Brotli => brotli_compress(src, dst, quality), [INFO] [stderr] 28 | CompressionAlgorithm::WebP => webp_compress(src, dst, quality), [INFO] [stderr] 29 | CompressionAlgorithm::Zopfli => zopfli_compress(src, dst, quality), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/compression.rs:71:63 [INFO] [stderr] | [INFO] [stderr] 71 | let mut encoder = brotli2::write::BrotliEncoder::new(dst, level as u32); [INFO] [stderr] | ^^^^^^^^^^^^ help: try: `u32::from(level)` [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: The function/method `zopfli::compress` doesn't need a mutable reference [INFO] [stderr] --> src/compression.rs:95:74 [INFO] [stderr] | [INFO] [stderr] 95 | zopfli::compress(&zopfli::Options::default(), &zopfli::Format::Gzip, &mut src_data, &mut dst)?; [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/main.rs:73:22 [INFO] [stderr] | [INFO] [stderr] 73 | fn get_parameter<'a, T>(matches: &clap::ArgMatches, name: &'static str, default_value: T) -> Result [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/main.rs:88:14 [INFO] [stderr] | [INFO] [stderr] 88 | .unwrap_or(compressor.extension()) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| compressor.extension())` [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 lifetime isn't used in the function definition [INFO] [stderr] --> src/main.rs:143:18 [INFO] [stderr] | [INFO] [stderr] 143 | fn start_workers<'a>(params: &Arc) -> (chan::Sender, mpsc::Receiver, chan::WaitGroup) { [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: this boolean expression can be simplified [INFO] [stderr] --> src/main.rs:258:8 [INFO] [stderr] | [INFO] [stderr] 258 | if !stats_tx.send(local_stats).is_ok() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `stats_tx.send(local_stats).is_err()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::nonminimal_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/main.rs:204:5 [INFO] [stderr] | [INFO] [stderr] 204 | / loop { [INFO] [stderr] 205 | | let src = match rx.recv() { [INFO] [stderr] 206 | | Some(task) => task, [INFO] [stderr] 207 | | None => break, //no more tasks [INFO] [stderr] ... | [INFO] [stderr] 255 | | } [INFO] [stderr] 256 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(task) = rx.recv() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/main.rs:226:25 [INFO] [stderr] | [INFO] [stderr] 226 | / match src_seconds == dst_seconds { [INFO] [stderr] 227 | | true => { [INFO] [stderr] 228 | | local_stats.update(src_metadata.len(), dst_metadata.len(), false); [INFO] [stderr] 229 | | return Ok(());//no need to recompress [INFO] [stderr] ... | [INFO] [stderr] 233 | | } [INFO] [stderr] 234 | | }; [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 226 | if src_seconds == dst_seconds { [INFO] [stderr] 227 | local_stats.update(src_metadata.len(), dst_metadata.len(), false); [INFO] [stderr] 228 | return Ok(());//no need to recompress [INFO] [stderr] 229 | } else { [INFO] [stderr] 230 | std::fs::remove_file(dst)?; //throw if we can't [INFO] [stderr] 231 | }; [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/main.rs:264:16 [INFO] [stderr] | [INFO] [stderr] 264 | let term = match case_sensitive { [INFO] [stderr] | ________________^ [INFO] [stderr] 265 | | true => search_term.to_owned(), [INFO] [stderr] 266 | | false => search_term.to_lowercase(), [INFO] [stderr] 267 | | }; [INFO] [stderr] | |_____^ help: consider using an if/else expression: `if case_sensitive { search_term.to_owned() } else { search_term.to_lowercase() }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/main.rs:275:26 [INFO] [stderr] | [INFO] [stderr] 275 | .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: the loop variable `i` is only used to index `filters`. [INFO] [stderr] --> src/main.rs:295:14 [INFO] [stderr] | [INFO] [stderr] 295 | for i in 0..filters.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 295 | for in &mut filters { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/main.rs:298:17 [INFO] [stderr] | [INFO] [stderr] 298 | let ref path = filters[i]; [INFO] [stderr] | ----^^^^^^^^-------------- help: try: `let path = &filters[i];` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/main.rs:311:27 [INFO] [stderr] | [INFO] [stderr] 311 | fn extract_paths(filters: &Vec) -> Result> { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/main.rs:329:45 [INFO] [stderr] | [INFO] [stderr] 329 | c => { last_char = Some(c.clone()); true } [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*c` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: identical conversion [INFO] [stderr] --> src/main.rs:363:29 [INFO] [stderr] | [INFO] [stderr] 363 | let dir = match PathBuf::from(dir).parent() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: consider removing `PathBuf::from()`: `dir` [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] Finished dev [unoptimized + debuginfo] target(s) in 12.95s [INFO] running `"docker" "inspect" "f1bc5a59d923ec88cf04e1f5a91a515d60f8137944ad830678c0d25f538f2661"` [INFO] running `"docker" "rm" "-f" "f1bc5a59d923ec88cf04e1f5a91a515d60f8137944ad830678c0d25f538f2661"` [INFO] [stdout] f1bc5a59d923ec88cf04e1f5a91a515d60f8137944ad830678c0d25f538f2661