From 7992ba30de1f2c04512c235001e00e49516daac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= <41945903+qarmin@users.noreply.github.com> Date: Sun, 10 Jan 2021 20:44:10 +0100 Subject: [PATCH] Fix included/excluded files which contains commas (#195) --- czkawka_cli/src/commands.rs | 4 +- czkawka_cli/src/main.rs | 61 +++++++++++------------- czkawka_core/src/big_file.rs | 6 +-- czkawka_core/src/common_directory.rs | 11 ++--- czkawka_core/src/common_items.rs | 5 +- czkawka_core/src/duplicate.rs | 6 +-- czkawka_core/src/empty_files.rs | 6 +-- czkawka_core/src/empty_folder.rs | 6 +-- czkawka_core/src/invalid_symlinks.rs | 6 +-- czkawka_core/src/same_music.rs | 6 +-- czkawka_core/src/similar_images.rs | 6 +-- czkawka_core/src/temporary.rs | 6 +-- czkawka_core/src/zeroed.rs | 6 +-- czkawka_gui/src/connect_button_search.rs | 6 +-- czkawka_gui/src/help_functions.rs | 25 +++++----- 15 files changed, 79 insertions(+), 87 deletions(-) diff --git a/czkawka_cli/src/commands.rs b/czkawka_cli/src/commands.rs index 3478a3a..ce7c00d 100644 --- a/czkawka_cli/src/commands.rs +++ b/czkawka_cli/src/commands.rs @@ -180,8 +180,8 @@ pub struct ExcludedDirectories { #[derive(Debug, StructOpt)] pub struct ExcludedItems { - #[structopt(short = "E", long, parse(from_os_str), help = "Excluded item(s)", long_help = "List of excluded item(s) which contains * wildcard(may be slow, so use -e where possible)")] - pub excluded_items: Vec, + #[structopt(short = "E", long, help = "Excluded item(s)", long_help = "List of excluded item(s) which contains * wildcard(may be slow, so use -e where possible)")] + pub excluded_items: Vec, } #[derive(Debug, StructOpt)] diff --git a/czkawka_cli/src/main.rs b/czkawka_cli/src/main.rs index d5aa16a..5706826 100644 --- a/czkawka_cli/src/main.rs +++ b/czkawka_cli/src/main.rs @@ -17,14 +17,9 @@ use czkawka_core::{ temporary::{self, Temporary}, zeroed::{self, ZeroedFiles}, }; -use std::{path::PathBuf, process}; +use std::process; use structopt::StructOpt; -fn path_list_to_str(path_list: Vec) -> String { - let path_list: Vec = path_list.into_iter().filter_map(|a| a.into_os_string().into_string().ok()).collect(); - path_list.join(",") -} - fn main() { let command = Commands::from_args(); @@ -45,9 +40,9 @@ fn main() { } => { let mut df = DuplicateFinder::new(); - df.set_included_directory(path_list_to_str(directories.directories)); - df.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - df.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + df.set_included_directory(directories.directories); + df.set_excluded_directory(excluded_directories.excluded_directories); + df.set_excluded_items(excluded_items.excluded_items); df.set_minimal_file_size(minimal_file_size); df.set_allowed_extensions(allowed_extensions.allowed_extensions.join(",")); df.set_check_method(search_method); @@ -76,9 +71,9 @@ fn main() { } => { let mut ef = EmptyFolder::new(); - ef.set_included_directory(path_list_to_str(directories.directories)); - ef.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - ef.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + ef.set_included_directory(directories.directories); + ef.set_excluded_directory(excluded_directories.excluded_directories); + ef.set_excluded_items(excluded_items.excluded_items); ef.set_delete_folder(delete_folders); ef.find_empty_folders(None, None); @@ -106,9 +101,9 @@ fn main() { } => { let mut bf = BigFile::new(); - bf.set_included_directory(path_list_to_str(directories.directories)); - bf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - bf.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + bf.set_included_directory(directories.directories); + bf.set_excluded_directory(excluded_directories.excluded_directories); + bf.set_excluded_items(excluded_items.excluded_items); bf.set_allowed_extensions(allowed_extensions.allowed_extensions.join(",")); bf.set_number_of_files_to_check(number_of_files); bf.set_recursive_search(!not_recursive.not_recursive); @@ -140,9 +135,9 @@ fn main() { } => { let mut ef = EmptyFiles::new(); - ef.set_included_directory(path_list_to_str(directories.directories)); - ef.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - ef.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + ef.set_included_directory(directories.directories); + ef.set_excluded_directory(excluded_directories.excluded_directories); + ef.set_excluded_items(excluded_items.excluded_items); ef.set_allowed_extensions(allowed_extensions.allowed_extensions.join(",")); ef.set_recursive_search(!not_recursive.not_recursive); @@ -173,9 +168,9 @@ fn main() { } => { let mut tf = Temporary::new(); - tf.set_included_directory(path_list_to_str(directories.directories)); - tf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - tf.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + tf.set_included_directory(directories.directories); + tf.set_excluded_directory(excluded_directories.excluded_directories); + tf.set_excluded_items(excluded_items.excluded_items); tf.set_recursive_search(!not_recursive.not_recursive); if delete_files { @@ -206,9 +201,9 @@ fn main() { } => { let mut sf = SimilarImages::new(); - sf.set_included_directory(path_list_to_str(directories.directories)); - sf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - sf.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + sf.set_included_directory(directories.directories); + sf.set_excluded_directory(excluded_directories.excluded_directories); + sf.set_excluded_items(excluded_items.excluded_items); sf.set_minimal_file_size(minimal_file_size); sf.set_recursive_search(!not_recursive.not_recursive); sf.set_similarity(similarity); @@ -238,9 +233,9 @@ fn main() { } => { let mut zf = ZeroedFiles::new(); - zf.set_included_directory(path_list_to_str(directories.directories)); - zf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - zf.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + zf.set_included_directory(directories.directories); + zf.set_excluded_directory(excluded_directories.excluded_directories); + zf.set_excluded_items(excluded_items.excluded_items); zf.set_allowed_extensions(allowed_extensions.allowed_extensions.join(",")); zf.set_minimal_file_size(minimal_file_size); zf.set_recursive_search(!not_recursive.not_recursive); @@ -274,9 +269,9 @@ fn main() { } => { let mut mf = SameMusic::new(); - mf.set_included_directory(path_list_to_str(directories.directories)); - mf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - mf.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + mf.set_included_directory(directories.directories); + mf.set_excluded_directory(excluded_directories.excluded_directories); + mf.set_excluded_items(excluded_items.excluded_items); mf.set_minimal_file_size(minimal_file_size); mf.set_recursive_search(!not_recursive.not_recursive); mf.set_music_similarity(music_similarity); @@ -309,9 +304,9 @@ fn main() { } => { let mut ifs = InvalidSymlinks::new(); - ifs.set_included_directory(path_list_to_str(directories.directories)); - ifs.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories)); - ifs.set_excluded_items(path_list_to_str(excluded_items.excluded_items)); + ifs.set_included_directory(directories.directories); + ifs.set_excluded_directory(excluded_directories.excluded_directories); + ifs.set_excluded_items(excluded_items.excluded_items); ifs.set_allowed_extensions(allowed_extensions.allowed_extensions.join(",")); ifs.set_recursive_search(!not_recursive.not_recursive); if delete_files { diff --git a/czkawka_core/src/big_file.rs b/czkawka_core/src/big_file.rs index 04601a2..5c8ed2a 100644 --- a/czkawka_core/src/big_file.rs +++ b/czkawka_core/src/big_file.rs @@ -276,7 +276,7 @@ impl BigFile { /// Setting excluded items which needs to contains * wildcard /// Are a lot of slower than absolute path, so it should be used to heavy - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } @@ -286,12 +286,12 @@ impl BigFile { } /// Setting included directories, at least one must be provided - pub fn set_included_directory(&mut self, included_directory: String) { + pub fn set_included_directory(&mut self, included_directory: Vec) { self.directories.set_included_directory(included_directory, &mut self.text_messages); } /// Setting absolute path to exclude - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } diff --git a/czkawka_core/src/common_directory.rs b/czkawka_core/src/common_directory.rs index af040d0..d91938d 100644 --- a/czkawka_core/src/common_directory.rs +++ b/czkawka_core/src/common_directory.rs @@ -14,7 +14,7 @@ impl Directories { } /// Setting included directories, at least one must be provided - pub fn set_included_directory(&mut self, included_directory: String, text_messages: &mut Messages) -> bool { + pub fn set_included_directory(&mut self, included_directory: Vec, text_messages: &mut Messages) -> bool { let start_time: SystemTime = SystemTime::now(); if included_directory.is_empty() { @@ -22,8 +22,7 @@ impl Directories { return false; } - let included_directory = included_directory.replace("\"", ""); - let directories: Vec<_> = included_directory.split(',').map(|dir| dir.trim()).filter(|dir| !dir.is_empty()).map(PathBuf::from).collect(); + let directories: Vec = included_directory; let mut checked_directories: Vec = Vec::new(); for directory in directories { @@ -66,15 +65,13 @@ impl Directories { } /// Setting absolute path to exclude - pub fn set_excluded_directory(&mut self, excluded_directory: String, text_messages: &mut Messages) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec, text_messages: &mut Messages) { let start_time: SystemTime = SystemTime::now(); if excluded_directory.is_empty() { return; } - let excluded_directory = excluded_directory.replace("\"", ""); - - let directories: Vec = excluded_directory.split(',').map(|dir| dir.trim()).filter(|dir| !dir.is_empty()).map(PathBuf::from).collect(); + let directories: Vec = excluded_directory; let mut checked_directories: Vec = Vec::new(); for directory in directories { diff --git a/czkawka_core/src/common_items.rs b/czkawka_core/src/common_items.rs index 104e7ff..7d37f70 100644 --- a/czkawka_core/src/common_items.rs +++ b/czkawka_core/src/common_items.rs @@ -14,15 +14,14 @@ impl ExcludedItems { } /// Setting excluded items which needs to contains * wildcard /// Are a lot of slower than absolute path, so it should be used to heavy - pub fn set_excluded_items(&mut self, mut excluded_items: String, text_messages: &mut Messages) { + pub fn set_excluded_items(&mut self, excluded_items: Vec, text_messages: &mut Messages) { let start_time: SystemTime = SystemTime::now(); if excluded_items.is_empty() { return; } - excluded_items = excluded_items.replace("\"", ""); - let expressions: Vec = excluded_items.split(',').map(String::from).collect(); + let expressions: Vec = excluded_items; let mut checked_expressions: Vec = Vec::new(); for expression in expressions { diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index d2e01d4..eea4314 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -202,18 +202,18 @@ impl DuplicateFinder { self.recursive_search = recursive_search; } - pub fn set_included_directory(&mut self, included_directory: String) -> bool { + pub fn set_included_directory(&mut self, included_directory: Vec) -> bool { self.directories.set_included_directory(included_directory, &mut self.text_messages) } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } pub fn set_allowed_extensions(&mut self, allowed_extensions: String) { self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages); } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } diff --git a/czkawka_core/src/empty_files.rs b/czkawka_core/src/empty_files.rs index a3a7b76..2df9684 100644 --- a/czkawka_core/src/empty_files.rs +++ b/czkawka_core/src/empty_files.rs @@ -111,18 +111,18 @@ impl EmptyFiles { self.recursive_search = recursive_search; } - pub fn set_included_directory(&mut self, included_directory: String) -> bool { + pub fn set_included_directory(&mut self, included_directory: Vec) -> bool { self.directories.set_included_directory(included_directory, &mut self.text_messages) } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } pub fn set_allowed_extensions(&mut self, allowed_extensions: String) { self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages); } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } diff --git a/czkawka_core/src/empty_folder.rs b/czkawka_core/src/empty_folder.rs index 0d9be4c..f7b65a0 100644 --- a/czkawka_core/src/empty_folder.rs +++ b/czkawka_core/src/empty_folder.rs @@ -89,11 +89,11 @@ impl EmptyFolder { &self.information } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } /// Public function used by CLI to search for empty folders @@ -283,7 +283,7 @@ impl EmptyFolder { } /// Set included dir which needs to be relative, exists etc. - pub fn set_included_directory(&mut self, included_directory: String) { + pub fn set_included_directory(&mut self, included_directory: Vec) { self.directories.set_included_directory(included_directory, &mut self.text_messages); } } diff --git a/czkawka_core/src/invalid_symlinks.rs b/czkawka_core/src/invalid_symlinks.rs index 4e463d8..f577fa3 100644 --- a/czkawka_core/src/invalid_symlinks.rs +++ b/czkawka_core/src/invalid_symlinks.rs @@ -120,18 +120,18 @@ impl InvalidSymlinks { self.recursive_search = recursive_search; } - pub fn set_included_directory(&mut self, included_directory: String) -> bool { + pub fn set_included_directory(&mut self, included_directory: Vec) -> bool { self.directories.set_included_directory(included_directory, &mut self.text_messages) } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } pub fn set_allowed_extensions(&mut self, allowed_extensions: String) { self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages); } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index 782f5bd..50f937d 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -157,15 +157,15 @@ impl SameMusic { self.recursive_search = recursive_search; } - pub fn set_included_directory(&mut self, included_directory: String) -> bool { + pub fn set_included_directory(&mut self, included_directory: Vec) -> bool { self.directories.set_included_directory(included_directory, &mut self.text_messages) } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index d47b967..c3ac406 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -531,15 +531,15 @@ impl SimilarImages { } /// Set included dir which needs to be relative, exists etc. - pub fn set_included_directory(&mut self, included_directory: String) { + pub fn set_included_directory(&mut self, included_directory: Vec) { self.directories.set_included_directory(included_directory, &mut self.text_messages); } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } } diff --git a/czkawka_core/src/temporary.rs b/czkawka_core/src/temporary.rs index eef7549..414854f 100644 --- a/czkawka_core/src/temporary.rs +++ b/czkawka_core/src/temporary.rs @@ -106,15 +106,15 @@ impl Temporary { self.recursive_search = recursive_search; } - pub fn set_included_directory(&mut self, included_directory: String) -> bool { + pub fn set_included_directory(&mut self, included_directory: Vec) -> bool { self.directories.set_included_directory(included_directory, &mut self.text_messages) } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } diff --git a/czkawka_core/src/zeroed.rs b/czkawka_core/src/zeroed.rs index b38824b..f3a7293 100644 --- a/czkawka_core/src/zeroed.rs +++ b/czkawka_core/src/zeroed.rs @@ -128,18 +128,18 @@ impl ZeroedFiles { self.recursive_search = recursive_search; } - pub fn set_included_directory(&mut self, included_directory: String) -> bool { + pub fn set_included_directory(&mut self, included_directory: Vec) -> bool { self.directories.set_included_directory(included_directory, &mut self.text_messages) } - pub fn set_excluded_directory(&mut self, excluded_directory: String) { + pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } pub fn set_allowed_extensions(&mut self, allowed_extensions: String) { self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages); } - pub fn set_excluded_items(&mut self, excluded_items: String) { + pub fn set_excluded_items(&mut self, excluded_items: Vec) { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } diff --git a/czkawka_gui/src/connect_button_search.rs b/czkawka_gui/src/connect_button_search.rs index 4ffe496..598ca73 100644 --- a/czkawka_gui/src/connect_button_search.rs +++ b/czkawka_gui/src/connect_button_search.rs @@ -83,10 +83,10 @@ pub fn connect_button_search( let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone(); buttons_search_clone.connect_clicked(move |_| { - let included_directories = get_string_from_list_store(&tree_view_included_directories); - let excluded_directories = get_string_from_list_store(&tree_view_excluded_directories); + let included_directories = get_path_buf_from_vector_of_strings(get_string_from_list_store(&tree_view_included_directories)); + let excluded_directories = get_path_buf_from_vector_of_strings(get_string_from_list_store(&tree_view_excluded_directories)); let recursive_search = check_button_recursive.get_active(); - let excluded_items = entry_excluded_items.get_text().as_str().to_string(); + let excluded_items = entry_excluded_items.get_text().as_str().to_string().split(',').map(|e| e.to_string()).collect::>(); let allowed_extensions = entry_allowed_extensions.get_text().as_str().to_string(); let show_dialog = Arc::new(AtomicBool::new(true)); diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index f2528d8..e4d3024 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -12,7 +12,7 @@ use czkawka_core::zeroed::ZeroedFiles; use gtk::prelude::*; use gtk::{ListStore, TextView}; use std::collections::HashMap; -use std::path::Path; +use std::path::{Path, PathBuf}; pub enum Message { Duplicates(DuplicateFinder), @@ -110,27 +110,28 @@ pub const HEADER_ROW_COLOR: &str = "#272727"; //pub const MAIN_ROW_COLOR: &str = "#f4f434"; // TEST //pub const HEADER_ROW_COLOR: &str = "#010101"; // TEST -pub fn get_string_from_list_store(tree_view: >k::TreeView) -> String { +pub fn get_string_from_list_store(tree_view: >k::TreeView) -> Vec { let list_store: gtk::ListStore = get_list_store(&tree_view); - let mut first: bool = true; - let mut return_string: String = "".to_string(); + let mut string_vector: Vec = Vec::new(); + let tree_iter = match list_store.get_iter_first() { Some(t) => t, - None => return return_string, + None => { + return string_vector; + } }; loop { - if !first { - return_string += ","; - } else { - first = false; - } - return_string += list_store.get_value(&tree_iter, 0).get::().unwrap().unwrap().as_str(); + string_vector.push(list_store.get_value(&tree_iter, 0).get::().unwrap().unwrap()); if !list_store.iter_next(&tree_iter) { - return return_string; + return string_vector; } } } +pub fn get_path_buf_from_vector_of_strings(vec_string: Vec) -> Vec { + vec_string.iter().map(PathBuf::from).collect() +} + pub fn split_path(path: &Path) -> (String, String) { match (path.parent(), path.file_name()) { (Some(dir), Some(file)) => (dir.display().to_string(), file.to_string_lossy().into_owned()),