1
0
Fork 0
mirror of synced 2024-06-15 00:45:29 +12:00
This commit is contained in:
Rafał Mikrut 2023-05-02 20:55:23 +02:00
parent 3be13a914b
commit 2cfc243912
17 changed files with 49 additions and 45 deletions

16
Cargo.lock generated
View file

@ -57,9 +57,9 @@ dependencies = [
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.3.1" version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6342bd4f5a1205d7f41e94a41a901f5647c938cdfa96036338e8533c9d6c2450" checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"anstyle-parse", "anstyle-parse",
@ -389,9 +389,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.2.5" version = "4.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a1f23fa97e1d1641371b51f35535cb26959b8e27ab50d167a8b996b5bada819" checksum = "3d70680e56dc65cb226c361aaa4e4a16d1f7e082bfed9ffceaee39c2012384ec"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@ -400,9 +400,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.2.5" version = "4.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fdc5d93c358224b4d6867ef1356d740de2303e9892edc06c5340daeccd96bab" checksum = "3fad499d5e07338414687350c5fdb82b1ab0001e9b26aa6275deccb684b14164"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@ -3746,9 +3746,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.4.4" version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5617da7e1f97bf363947d767b91aaf3c2bbc19db7fda9c65af1278713d58e0a2" checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]

View file

@ -4,10 +4,6 @@ use std::process;
use clap::Parser; use clap::Parser;
use crate::commands::{
Args, BadExtensionsArgs, BiggestFilesArgs, BrokenFilesArgs, DuplicatesArgs, EmptyFilesArgs, EmptyFoldersArgs, InvalidSymlinksArgs, SameMusicArgs, SimilarImagesArgs,
SimilarVideosArgs, TemporaryArgs,
};
use commands::Commands; use commands::Commands;
use czkawka_core::big_file::SearchMode; use czkawka_core::big_file::SearchMode;
use czkawka_core::common::{get_number_of_threads, set_default_number_of_threads}; use czkawka_core::common::{get_number_of_threads, set_default_number_of_threads};
@ -28,6 +24,11 @@ use czkawka_core::{
temporary::{self, Temporary}, temporary::{self, Temporary},
}; };
use crate::commands::{
Args, BadExtensionsArgs, BiggestFilesArgs, BrokenFilesArgs, DuplicatesArgs, EmptyFilesArgs, EmptyFoldersArgs, InvalidSymlinksArgs, SameMusicArgs, SimilarImagesArgs,
SimilarVideosArgs, TemporaryArgs,
};
mod commands; mod commands;
fn main() { fn main() {

View file

@ -2,11 +2,10 @@ use std::collections::{BTreeSet, HashMap};
use std::fs::File; use std::fs::File;
use std::io::prelude::*; use std::io::prelude::*;
use std::io::BufWriter; use std::io::BufWriter;
use std::mem;
use std::path::PathBuf; use std::path::PathBuf;
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::mem;
use std::time::SystemTime; use std::time::SystemTime;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
@ -393,7 +392,7 @@ impl BadExtensions {
}; };
let proper_extension = kind.extension(); let proper_extension = kind.extension();
let Some(current_extension)= self.get_and_validate_extension(&file_entry, proper_extension) else { let Some(current_extension) = self.get_and_validate_extension(&file_entry, proper_extension) else {
return Some(None); return Some(None);
}; };

View file

@ -1,12 +1,11 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::fs;
use std::fs::{DirEntry, File, Metadata}; use std::fs::{DirEntry, File, Metadata};
use std::io::{BufWriter, Write}; use std::io::{BufWriter, Write};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::fs;
use std::time::SystemTime; use std::time::SystemTime;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
@ -175,7 +174,7 @@ impl BigFile {
// Check every sub folder/file/link etc. // Check every sub folder/file/link etc.
for entry in read_dir { for entry in read_dir {
let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { let Some((entry_data, metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else {
continue; continue;
}; };

View file

@ -5,7 +5,6 @@ use std::io::{BufReader, BufWriter};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::time::SystemTime; use std::time::SystemTime;
use std::{fs, mem, panic}; use std::{fs, mem, panic};
@ -91,7 +90,8 @@ pub struct BrokenFiles {
stopped_search: bool, stopped_search: bool,
checked_types: CheckedTypes, checked_types: CheckedTypes,
use_cache: bool, use_cache: bool,
delete_outdated_cache: bool, // TODO add this to GUI // TODO add this to GUI
delete_outdated_cache: bool,
save_also_as_json: bool, save_also_as_json: bool,
} }
@ -224,7 +224,7 @@ impl BrokenFiles {
// Check every sub folder/file/link etc. // Check every sub folder/file/link etc.
for entry in read_dir { for entry in read_dir {
let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { let Some((entry_data, metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else {
continue; continue;
}; };

View file

@ -14,13 +14,14 @@ use directories_next::ProjectDirs;
use futures::channel::mpsc::UnboundedSender; use futures::channel::mpsc::UnboundedSender;
use image::{DynamicImage, ImageBuffer, Rgb}; use image::{DynamicImage, ImageBuffer, Rgb};
use imagepipe::{ImageSource, Pipeline}; use imagepipe::{ImageSource, Pipeline};
#[cfg(feature = "heif")]
use libheif_rs::{ColorSpace, HeifContext, RgbChroma};
// #[cfg(feature = "heif")] // #[cfg(feature = "heif")]
// use libheif_rs::LibHeif; // use libheif_rs::LibHeif;
use crate::common_dir_traversal::{CheckingMethod, ProgressData}; use crate::common_dir_traversal::{CheckingMethod, ProgressData};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
#[cfg(feature = "heif")]
use libheif_rs::{ColorSpace, HeifContext, RgbChroma};
static NUMBER_OF_THREADS: state::Storage<usize> = state::Storage::new(); static NUMBER_OF_THREADS: state::Storage<usize> = state::Storage::new();
@ -32,13 +33,16 @@ pub fn get_number_of_threads() -> usize {
num_cpus::get() num_cpus::get()
} }
} }
pub fn set_default_number_of_threads() { pub fn set_default_number_of_threads() {
set_number_of_threads(num_cpus::get()); set_number_of_threads(num_cpus::get());
} }
#[must_use] #[must_use]
pub fn get_default_number_of_threads() -> usize { pub fn get_default_number_of_threads() -> usize {
num_cpus::get() num_cpus::get()
} }
pub fn set_number_of_threads(thread_number: usize) { pub fn set_number_of_threads(thread_number: usize) {
NUMBER_OF_THREADS.set(thread_number); NUMBER_OF_THREADS.set(thread_number);
@ -182,8 +186,8 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
} }
}; };
let Some(image) = ImageBuffer::<Rgb<u8>, Vec<u8>>::from_raw(image.width as u32, image.height as u32, image.data) else { let Some(image) = ImageBuffer::<Rgb<u8>, Vec<u8>>::from_raw(image.width as u32, image.height as u32, image.data) else {
return None; return None;
}; };
// println!("Properly hashed {:?}", path); // println!("Properly hashed {:?}", path);

View file

@ -370,7 +370,7 @@ where
// Check every sub folder/file/link etc. // Check every sub folder/file/link etc.
'dir: for entry in read_dir { 'dir: for entry in read_dir {
let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { let Some((entry_data, metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else {
continue; continue;
}; };
@ -692,6 +692,7 @@ pub fn common_read_dir(current_folder: &Path, warnings: &mut Vec<String>) -> Opt
} }
} }
} }
pub fn common_get_entry_data_metadata<'a>(entry: &'a Result<DirEntry, std::io::Error>, warnings: &mut Vec<String>, current_folder: &Path) -> Option<(&'a DirEntry, Metadata)> { pub fn common_get_entry_data_metadata<'a>(entry: &'a Result<DirEntry, std::io::Error>, warnings: &mut Vec<String>, current_folder: &Path) -> Option<(&'a DirEntry, Metadata)> {
let entry_data = match entry { let entry_data = match entry {
Ok(t) => t, Ok(t) => t,
@ -715,6 +716,7 @@ pub fn common_get_entry_data_metadata<'a>(entry: &'a Result<DirEntry, std::io::E
}; };
Some((entry_data, metadata)) Some((entry_data, metadata))
} }
pub fn get_modified_time(metadata: &Metadata, warnings: &mut Vec<String>, current_file_name: &Path, is_folder: bool) -> u64 { pub fn get_modified_time(metadata: &Metadata, warnings: &mut Vec<String>, current_file_name: &Path, is_folder: bool) -> u64 {
match metadata.modified() { match metadata.modified() {
Ok(t) => match t.duration_since(UNIX_EPOCH) { Ok(t) => match t.duration_since(UNIX_EPOCH) {

View file

@ -1494,7 +1494,7 @@ pub fn load_hashes_from_file(text_messages: &mut Messages, delete_outdated_cache
open_cache_folder(&get_file_hash_name(type_of_hash, is_prehash), false, false, &mut text_messages.warnings) open_cache_folder(&get_file_hash_name(type_of_hash, is_prehash), false, false, &mut text_messages.warnings)
{ {
// Unwrap could fail when failed to open cache file, but json would exists // Unwrap could fail when failed to open cache file, but json would exists
let Some(file_handler) = file_handler else { return Default::default() }; let Some(file_handler) = file_handler else { return Default::default(); };
let reader = BufReader::new(file_handler); let reader = BufReader::new(file_handler);
let mut hashmap_loaded_entries: BTreeMap<u64, Vec<FileEntry>> = Default::default(); let mut hashmap_loaded_entries: BTreeMap<u64, Vec<FileEntry>> = Default::default();

View file

@ -424,7 +424,7 @@ impl SameMusic {
true true
} }
fn read_single_file_tag(&self, path: &str, mut music_entry: MusicEntry) -> Option<MusicEntry> { fn read_single_file_tag(&self, path: &str, mut music_entry: MusicEntry) -> Option<MusicEntry> {
let Ok(mut file) = File::open(path) else{return None}; let Ok(mut file) = File::open(path) else { return None; };
let result = panic::catch_unwind(move || { let result = panic::catch_unwind(move || {
match read_from(&mut file) { match read_from(&mut file) {

View file

@ -2,12 +2,11 @@ use std::collections::{BTreeSet, HashMap, HashSet};
use std::fs::{DirEntry, File, Metadata}; use std::fs::{DirEntry, File, Metadata};
use std::io::Write; use std::io::Write;
use std::io::*; use std::io::*;
use std::mem;
use std::panic; use std::panic;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::mem;
use std::time::SystemTime; use std::time::SystemTime;
use bk_tree::BKTree; use bk_tree::BKTree;
@ -92,7 +91,8 @@ pub struct SimilarImages {
recursive_search: bool, recursive_search: bool,
minimal_file_size: u64, minimal_file_size: u64,
maximal_file_size: u64, maximal_file_size: u64,
image_hashes: HashMap<ImHash, Vec<FileEntry>>, // Hashmap with image hashes and Vector with names of files image_hashes: HashMap<ImHash, Vec<FileEntry>>,
// Hashmap with image hashes and Vector with names of files
stopped_search: bool, stopped_search: bool,
similarity: u32, similarity: u32,
images_to_check: HashMap<String, FileEntry>, images_to_check: HashMap<String, FileEntry>,
@ -318,7 +318,7 @@ impl SimilarImages {
}; };
for entry in read_dir { for entry in read_dir {
let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { let Some((entry_data, metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else {
continue; continue;
}; };

View file

@ -2,11 +2,10 @@ use std::collections::{BTreeMap, BTreeSet, HashMap};
use std::fs::{DirEntry, File, Metadata}; use std::fs::{DirEntry, File, Metadata};
use std::io::Write; use std::io::Write;
use std::io::*; use std::io::*;
use std::mem;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::mem;
use std::time::SystemTime; use std::time::SystemTime;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
@ -283,7 +282,7 @@ impl SimilarVideos {
// Check every sub folder/file/link etc. // Check every sub folder/file/link etc.
for entry in read_dir { for entry in read_dir {
let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { let Some((entry_data, metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else {
continue; continue;
}; };
@ -327,7 +326,7 @@ impl SimilarVideos {
fn add_video_file_entry(&self, metadata: &Metadata, entry_data: &DirEntry, fe_result: &mut Vec<(String, FileEntry)>, warnings: &mut Vec<String>, current_folder: &Path) { fn add_video_file_entry(&self, metadata: &Metadata, entry_data: &DirEntry, fe_result: &mut Vec<(String, FileEntry)>, warnings: &mut Vec<String>, current_folder: &Path) {
let Some(file_name_lowercase) = get_lowercase_name(entry_data, let Some(file_name_lowercase) = get_lowercase_name(entry_data,
warnings) else { warnings) else {
return; return;
}; };
if !self.allowed_extensions.matches_filename(&file_name_lowercase) { if !self.allowed_extensions.matches_filename(&file_name_lowercase) {

View file

@ -1,11 +1,10 @@
use std::fs;
use std::fs::{DirEntry, File, Metadata}; use std::fs::{DirEntry, File, Metadata};
use std::io::prelude::*; use std::io::prelude::*;
use std::io::BufWriter; use std::io::BufWriter;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::fs;
use std::time::SystemTime; use std::time::SystemTime;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
@ -175,7 +174,7 @@ impl Temporary {
// Check every sub folder/file/link etc. // Check every sub folder/file/link etc.
for entry in read_dir { for entry in read_dir {
let Some((entry_data,metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else { let Some((entry_data, metadata)) = common_get_entry_data_metadata(&entry, &mut warnings, current_folder) else {
continue; continue;
}; };

View file

@ -1345,6 +1345,7 @@ fn vector_sort_unstable_entry_by_path(vector: &Vec<FileEntry>) -> Vec<FileEntry>
vector.clone() vector.clone()
} }
} }
fn vector_sort_simple_unstable_entry_by_path(vector: &[FileEntry]) -> Vec<FileEntry> { fn vector_sort_simple_unstable_entry_by_path(vector: &[FileEntry]) -> Vec<FileEntry> {
let mut vector = vector.to_owned(); let mut vector = vector.to_owned();
vector.sort_unstable_by_key(|e| { vector.sort_unstable_by_key(|e| {

View file

@ -1,6 +1,6 @@
use fs_extra::dir::CopyOptions;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use fs_extra::dir::CopyOptions;
use gtk4::prelude::*; use gtk4::prelude::*;
use gtk4::{ResponseType, TreePath}; use gtk4::{ResponseType, TreePath};

View file

@ -1,15 +1,14 @@
use futures::channel::mpsc::UnboundedSender;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::thread; use std::thread;
use futures::channel::mpsc::UnboundedSender;
use glib::Sender; use glib::Sender;
use gtk4::prelude::*; use gtk4::prelude::*;
use czkawka_core::bad_extensions::BadExtensions; use czkawka_core::bad_extensions::BadExtensions;
use czkawka_core::big_file::BigFile; use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::{BrokenFiles, CheckedTypes}; use czkawka_core::broken_files::{BrokenFiles, CheckedTypes};
use czkawka_core::common_dir_traversal::ProgressData; use czkawka_core::common_dir_traversal::ProgressData;
use czkawka_core::duplicate::DuplicateFinder; use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles; use czkawka_core::empty_files::EmptyFiles;

View file

@ -5,11 +5,11 @@
#![allow(clippy::type_complexity)] #![allow(clippy::type_complexity)]
#![allow(clippy::needless_late_init)] #![allow(clippy::needless_late_init)]
use futures::channel::mpsc;
use futures::channel::mpsc::{UnboundedReceiver, UnboundedSender};
use std::env; use std::env;
use std::ffi::OsString; use std::ffi::OsString;
use futures::channel::mpsc;
use futures::channel::mpsc::{UnboundedReceiver, UnboundedSender};
use gtk4::gio::ApplicationFlags; use gtk4::gio::ApplicationFlags;
use gtk4::prelude::*; use gtk4::prelude::*;
use gtk4::Application; use gtk4::Application;

View file

@ -1,9 +1,10 @@
use glib::types::Type;
use crate::help_functions::{ use crate::help_functions::{
BottomButtonsEnum, ColumnsBadExtensions, ColumnsBigFiles, ColumnsBrokenFiles, ColumnsDuplicates, ColumnsEmptyFiles, ColumnsEmptyFolders, ColumnsInvalidSymlinks, BottomButtonsEnum, ColumnsBadExtensions, ColumnsBigFiles, ColumnsBrokenFiles, ColumnsDuplicates, ColumnsEmptyFiles, ColumnsEmptyFolders, ColumnsInvalidSymlinks,
ColumnsSameMusic, ColumnsSimilarImages, ColumnsSimilarVideos, ColumnsTemporaryFiles, PopoverTypes, ColumnsSameMusic, ColumnsSimilarImages, ColumnsSimilarVideos, ColumnsTemporaryFiles, PopoverTypes,
}; };
use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS}; use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
use glib::types::Type;
pub struct NotebookObject { pub struct NotebookObject {
pub notebook_type: NotebookMainEnum, pub notebook_type: NotebookMainEnum,