From 92500792df45cd0c38655f0d3097973491ed1b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Tue, 2 May 2023 10:34:46 +0200 Subject: [PATCH] Common dir --- czkawka_core/src/common_dir_traversal.rs | 225 ++++++++++++++--------- 1 file changed, 143 insertions(+), 82 deletions(-) diff --git a/czkawka_core/src/common_dir_traversal.rs b/czkawka_core/src/common_dir_traversal.rs index 456d5ab..8eb3eef 100644 --- a/czkawka_core/src/common_dir_traversal.rs +++ b/czkawka_core/src/common_dir_traversal.rs @@ -383,94 +383,36 @@ where match (entry_type(&metadata), collect) { (EntryType::Dir, Collect::Files | Collect::InvalidSymlinks) => { - if !recursive_search { - continue 'dir; - } - - let next_folder = current_folder.join(entry_data.file_name()); - if directories.is_excluded(&next_folder) { - continue 'dir; - } - - if excluded_items.is_excluded(&next_folder) { - continue 'dir; - } - - #[cfg(target_family = "unix")] - if directories.exclude_other_filesystems() { - match directories.is_on_other_filesystems(&next_folder) { - Ok(true) => continue 'dir, - Err(e) => warnings.push(e.to_string()), - _ => (), - } - } - - dir_result.push(next_folder); + process_dir_in_file_symlink_mode(recursive_search, current_folder, entry_data, &directories, &mut dir_result, &mut warnings, &excluded_items); } (EntryType::Dir, Collect::EmptyFolders) => { atomic_entry_counter.fetch_add(1, Ordering::Relaxed); - let next_folder = current_folder.join(entry_data.file_name()); - if excluded_items.is_excluded(&next_folder) || directories.is_excluded(&next_folder) { - set_as_not_empty_folder_list.push(current_folder.clone()); - continue 'dir; - } - - #[cfg(target_family = "unix")] - if directories.exclude_other_filesystems() { - match directories.is_on_other_filesystems(&next_folder) { - Ok(true) => continue 'dir, - Err(e) => warnings.push(e.to_string()), - _ => (), - } - } - - dir_result.push(next_folder.clone()); - folder_entries_list.push(( - next_folder.clone(), - FolderEntry { - parent_path: Some(current_folder.clone()), - is_empty: FolderEmptiness::Maybe, - modified_date: get_modified_time(&metadata, &mut warnings, current_folder, true), - }, - )); + process_dir_in_dir_mode( + &metadata, + current_folder, + entry_data, + &directories, + &mut dir_result, + &mut warnings, + &excluded_items, + &mut set_as_not_empty_folder_list, + &mut folder_entries_list, + ); } (EntryType::File, Collect::Files) => { atomic_entry_counter.fetch_add(1, Ordering::Relaxed); - - let Some(file_name_lowercase) = get_lowercase_name(entry_data, &mut warnings) else { - continue 'dir; - }; - - if !allowed_extensions.matches_filename(&file_name_lowercase) { - continue 'dir; - } - - if (minimal_file_size..=maximal_file_size).contains(&metadata.len()) { - let current_file_name = current_folder.join(entry_data.file_name()); - if excluded_items.is_excluded(¤t_file_name) { - continue 'dir; - } - - #[cfg(target_family = "unix")] - if directories.exclude_other_filesystems() { - match directories.is_on_other_filesystems(¤t_file_name) { - Ok(true) => continue 'dir, - Err(e) => warnings.push(e.to_string()), - _ => (), - } - } - - // Creating new file entry - let fe: FileEntry = FileEntry { - path: current_file_name.clone(), - size: metadata.len(), - modified_date: get_modified_time(&metadata, &mut warnings, ¤t_file_name, false), - hash: String::new(), - symlink_info: None, - }; - - fe_result.push(fe); - } + process_file_in_file_mode( + &metadata, + entry_data, + &mut warnings, + &mut fe_result, + &allowed_extensions, + current_folder, + &directories, + &excluded_items, + minimal_file_size, + maximal_file_size, + ); } (EntryType::File | EntryType::Symlink, Collect::EmptyFolders) => { #[cfg(target_family = "unix")] @@ -546,6 +488,125 @@ where } } +fn process_file_in_file_mode( + metadata: &Metadata, + entry_data: &DirEntry, + warnings: &mut Vec, + fe_result: &mut Vec, + allowed_extensions: &Extensions, + current_folder: &Path, + directories: &Directories, + excluded_items: &ExcludedItems, + minimal_file_size: u64, + maximal_file_size: u64, +) { + let Some(file_name_lowercase) = get_lowercase_name(entry_data, warnings) else { + return; + }; + + if !allowed_extensions.matches_filename(&file_name_lowercase) { + return; + } + + if (minimal_file_size..=maximal_file_size).contains(&metadata.len()) { + let current_file_name = current_folder.join(entry_data.file_name()); + if excluded_items.is_excluded(¤t_file_name) { + return; + } + + #[cfg(target_family = "unix")] + if directories.exclude_other_filesystems() { + match directories.is_on_other_filesystems(¤t_file_name) { + Ok(true) => return, + Err(e) => warnings.push(e), + _ => (), + } + } + + // Creating new file entry + let fe: FileEntry = FileEntry { + path: current_file_name.clone(), + size: metadata.len(), + modified_date: get_modified_time(metadata, warnings, ¤t_file_name, false), + hash: String::new(), + symlink_info: None, + }; + + fe_result.push(fe); + } +} + +fn process_dir_in_dir_mode( + metadata: &Metadata, + current_folder: &Path, + entry_data: &DirEntry, + directories: &Directories, + dir_result: &mut Vec, + warnings: &mut Vec, + excluded_items: &ExcludedItems, + set_as_not_empty_folder_list: &mut Vec, + folder_entries_list: &mut Vec<(PathBuf, FolderEntry)>, +) { + let next_folder = current_folder.join(entry_data.file_name()); + if excluded_items.is_excluded(&next_folder) || directories.is_excluded(&next_folder) { + set_as_not_empty_folder_list.push(current_folder.to_path_buf()); + return; + } + + #[cfg(target_family = "unix")] + if directories.exclude_other_filesystems() { + match directories.is_on_other_filesystems(&next_folder) { + Ok(true) => return, + Err(e) => warnings.push(e), + _ => (), + } + } + + dir_result.push(next_folder.clone()); + folder_entries_list.push(( + next_folder, + FolderEntry { + parent_path: Some(current_folder.to_path_buf()), + is_empty: FolderEmptiness::Maybe, + modified_date: get_modified_time(metadata, warnings, current_folder, true), + }, + )); +} + +fn process_dir_in_file_symlink_mode( + recursive_search: bool, + current_folder: &Path, + entry_data: &DirEntry, + directories: &Directories, + dir_result: &mut Vec, + warnings: &mut Vec, + excluded_items: &ExcludedItems, +) { + if !recursive_search { + return; + } + + let next_folder = current_folder.join(entry_data.file_name()); + if directories.is_excluded(&next_folder) { + return; + } + + if excluded_items.is_excluded(&next_folder) { + return; + } + + #[cfg(target_family = "unix")] + if directories.exclude_other_filesystems() { + match directories.is_on_other_filesystems(&next_folder) { + Ok(true) => return, + Err(e) => warnings.push(e), + _ => (), + } + } + + dir_result.push(next_folder); +} + fn process_symlink_in_symlink_mode( metadata: &Metadata, entry_data: &DirEntry,