From c9694dea09d1fb8ec4971fe259046e3ff46ccd91 Mon Sep 17 00:00:00 2001 From: beeb Date: Sun, 8 Jan 2023 11:22:43 +0100 Subject: [PATCH 1/7] fix: clippy warnings --- src/scanner.rs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/scanner.rs b/src/scanner.rs index 2301f43..92813bd 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -1,12 +1,12 @@ use crate::database; -use crate::{params::Params, database::File}; +use crate::{database::File, params::Params}; use anyhow::Result; +use fxhash::hash32 as hasher; use glob::glob; use itertools::Itertools; use rayon::prelude::*; use std::fs; use std::path::PathBuf; -use fxhash::hash32 as hasher; pub fn duplicates(app_opts: &Params, connection: &sqlite::Connection) -> Result> { let scan_results = scan(app_opts, connection)?; @@ -16,34 +16,31 @@ pub fn duplicates(app_opts: &Params, connection: &sqlite::Connection) -> Result< database::duplicate_hashes(connection, &base_path) } -fn get_glob_patterns(opts: &Params, directory: &String) -> Vec { +fn get_glob_patterns(opts: &Params, directory: &str) -> Vec { opts.types .clone() - .unwrap_or(String::from("*")) - .split(",") + .unwrap_or_else(|| String::from("*")) + .split(',') .map(|filetype| format!("*.{}", filetype)) .map(|filetype| { - vec![directory.clone(), String::from("**"), filetype] + vec![directory.to_owned(), String::from("**"), filetype] .iter() .collect() }) .collect() } -fn is_indexed_file(path: &String, indexed: &Vec) -> bool { - indexed - .into_iter() - .map(|file| file.path.clone()) - .contains(path) +fn is_indexed_file(path: &String, indexed: &[File]) -> bool { + indexed.iter().map(|file| file.path.clone()).contains(path) } fn scan(app_opts: &Params, connection: &sqlite::Connection) -> Result> { let directory = app_opts.get_directory()?; - let glob_patterns: Vec = get_glob_patterns(&app_opts, &directory); + let glob_patterns: Vec = get_glob_patterns(app_opts, &directory); let indexed_paths = database::indexed_paths(connection)?; let files: Vec = glob_patterns .into_par_iter() - .map(|glob_pattern| glob(&glob_pattern.as_os_str().to_str().unwrap())) + .map(|glob_pattern| glob(glob_pattern.as_os_str().to_str().unwrap())) .map(|glob_result| glob_result.unwrap()) .flat_map(|file_vec| { file_vec From be7e8d38ae67b4421be99e851592b1b4a0ecee24 Mon Sep 17 00:00:00 2001 From: beeb Date: Sun, 8 Jan 2023 11:48:49 +0100 Subject: [PATCH 2/7] refactor: avoid unwraps --- src/scanner.rs | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/scanner.rs b/src/scanner.rs index 92813bd..110c9d2 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -12,7 +12,7 @@ pub fn duplicates(app_opts: &Params, connection: &sqlite::Connection) -> Result< let scan_results = scan(app_opts, connection)?; let base_path = app_opts.get_directory()?; - index_files(scan_results, connection); + index_files(scan_results, connection)?; database::duplicate_hashes(connection, &base_path) } @@ -30,8 +30,11 @@ fn get_glob_patterns(opts: &Params, directory: &str) -> Vec { .collect() } -fn is_indexed_file(path: &String, indexed: &[File]) -> bool { - indexed.iter().map(|file| file.path.clone()).contains(path) +fn is_indexed_file(path: impl Into, indexed: &[File]) -> bool { + indexed + .iter() + .map(|file| file.path.clone()) + .contains(&path.into()) } fn scan(app_opts: &Params, connection: &sqlite::Connection) -> Result> { @@ -40,13 +43,16 @@ fn scan(app_opts: &Params, connection: &sqlite::Connection) -> Result = glob_patterns .into_par_iter() - .map(|glob_pattern| glob(glob_pattern.as_os_str().to_str().unwrap())) - .map(|glob_result| glob_result.unwrap()) + .filter_map(|glob_pattern| glob(glob_pattern.as_os_str().to_str()?).ok()) .flat_map(|file_vec| { file_vec - .map(|x| x.unwrap().as_os_str().to_str().unwrap().to_string()) + .filter_map(|x| Some(x.ok()?.as_os_str().to_str()?.to_string())) .filter(|fpath| !is_indexed_file(fpath, &indexed_paths)) - .filter(|glob_result| fs::metadata(glob_result).unwrap().is_file()) + .filter(|glob_result| { + fs::metadata(glob_result) + .map(|f| f.is_file()) + .unwrap_or(false) + }) .collect::>() }) .collect(); @@ -54,18 +60,18 @@ fn scan(app_opts: &Params, connection: &sqlite::Connection) -> Result, connection: &sqlite::Connection) { +fn index_files(files: Vec, connection: &sqlite::Connection) -> Result<()> { let hashed: Vec = files .into_par_iter() - .map(|file| { - let hash = hash_file(&file).unwrap(); - database::File { path: file, hash } + .filter_map(|file| { + let hash = hash_file(&file).ok()?; + Some(database::File { path: file, hash }) }) .collect(); - hashed.into_iter().for_each(|file| { - database::put(&file, connection).unwrap(); - }); + hashed + .into_iter() + .try_for_each(|file| database::put(&file, connection)) } pub fn hash_file(filepath: &str) -> Result { From 8ed0b13ff0b6803f4b56f243da1236af68840c7b Mon Sep 17 00:00:00 2001 From: beeb Date: Sun, 8 Jan 2023 12:19:25 +0100 Subject: [PATCH 3/7] style: order imports --- src/scanner.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/scanner.rs b/src/scanner.rs index 110c9d2..9b9bdcf 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -1,12 +1,14 @@ -use crate::database; -use crate::{database::File, params::Params}; +use std::fs; +use std::path::PathBuf; + use anyhow::Result; use fxhash::hash32 as hasher; use glob::glob; use itertools::Itertools; use rayon::prelude::*; -use std::fs; -use std::path::PathBuf; + +use crate::database; +use crate::{database::File, params::Params}; pub fn duplicates(app_opts: &Params, connection: &sqlite::Connection) -> Result> { let scan_results = scan(app_opts, connection)?; From 4490ea4c6919f1d3a0b7fb4eb7ab318662327649 Mon Sep 17 00:00:00 2001 From: beeb Date: Sun, 8 Jan 2023 12:19:56 +0100 Subject: [PATCH 4/7] style: combine use statements for database --- src/scanner.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/scanner.rs b/src/scanner.rs index 9b9bdcf..4930f1f 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -7,8 +7,10 @@ use glob::glob; use itertools::Itertools; use rayon::prelude::*; -use crate::database; -use crate::{database::File, params::Params}; +use crate::{ + database::{self, File}, + params::Params, +}; pub fn duplicates(app_opts: &Params, connection: &sqlite::Connection) -> Result> { let scan_results = scan(app_opts, connection)?; From ad467d70a8a58c6a9394085b67c5503dc130ae76 Mon Sep 17 00:00:00 2001 From: beeb Date: Sun, 8 Jan 2023 12:20:27 +0100 Subject: [PATCH 5/7] style: combine use statements for std --- src/scanner.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/scanner.rs b/src/scanner.rs index 4930f1f..f5aae5a 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -1,5 +1,4 @@ -use std::fs; -use std::path::PathBuf; +use std::{fs, path::PathBuf}; use anyhow::Result; use fxhash::hash32 as hasher; From cc243f413a9e382b92a7fbfac55af58866665fbd Mon Sep 17 00:00:00 2001 From: beeb Date: Sun, 8 Jan 2023 13:08:27 +0100 Subject: [PATCH 6/7] refactor: no need to consume iterator items --- src/scanner.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scanner.rs b/src/scanner.rs index f5aae5a..80217bf 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -73,8 +73,8 @@ fn index_files(files: Vec, connection: &sqlite::Connection) -> Result<() .collect(); hashed - .into_iter() - .try_for_each(|file| database::put(&file, connection)) + .iter() + .try_for_each(|file| database::put(file, connection)) } pub fn hash_file(filepath: &str) -> Result { From 0b5effd06ef729446620f7bb03f3fc2d73a6a8bb Mon Sep 17 00:00:00 2001 From: beeb Date: Sun, 8 Jan 2023 13:09:43 +0100 Subject: [PATCH 7/7] refactor: no need to consume pathbuf iterator --- src/scanner.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scanner.rs b/src/scanner.rs index 80217bf..e8d8088 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -45,7 +45,7 @@ fn scan(app_opts: &Params, connection: &sqlite::Connection) -> Result = get_glob_patterns(app_opts, &directory); let indexed_paths = database::indexed_paths(connection)?; let files: Vec = glob_patterns - .into_par_iter() + .par_iter() .filter_map(|glob_pattern| glob(glob_pattern.as_os_str().to_str()?).ok()) .flat_map(|file_vec| { file_vec