From 2d6356adeea913ef1e5a68c83a2cf561a26961ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Sat, 13 Jan 2024 23:00:04 +0100 Subject: [PATCH] Save --- Cargo.lock | 57 ++++++++++++++++++ czkawka_cli/Cargo.toml | 3 + czkawka_cli/src/main.rs | 35 ++++++++--- czkawka_cli/src/progress.rs | 60 +++++++++++++++++++ .../connect_things/connect_progress_window.rs | 41 +++++++++++++ 5 files changed, 187 insertions(+), 9 deletions(-) create mode 100644 czkawka_cli/src/progress.rs diff --git a/Cargo.lock b/Cargo.lock index 752ac22..02f2f9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -953,6 +953,19 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + [[package]] name = "const-field-offset" version = "0.1.3" @@ -1179,6 +1192,16 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "ctrlc" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b467862cc8610ca6fc9a1532d7777cee0804e678ab45410897b9396495994a0b" +dependencies = [ + "nix 0.27.1", + "windows-sys 0.52.0", +] + [[package]] name = "cursor-icon" version = "1.1.0" @@ -1190,10 +1213,13 @@ name = "czkawka_cli" version = "6.1.0" dependencies = [ "clap", + "crossbeam-channel", + "ctrlc", "czkawka_core", "fun_time", "handsome_logger", "image_hasher", + "indicatif", "log", ] @@ -1574,6 +1600,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.33" @@ -3081,6 +3113,19 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "indicatif" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + [[package]] name = "infer" version = "0.15.0" @@ -3898,6 +3943,12 @@ dependencies = [ "libc", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "objc" version = "0.2.7" @@ -6102,6 +6153,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + [[package]] name = "untrusted" version = "0.9.0" diff --git a/czkawka_cli/Cargo.toml b/czkawka_cli/Cargo.toml index d3838f6..55d4d06 100644 --- a/czkawka_cli/Cargo.toml +++ b/czkawka_cli/Cargo.toml @@ -19,6 +19,9 @@ log = "0.4.20" handsome_logger = "0.8" fun_time = { version = "0.3", features = ["log"] } czkawka_core = { path = "../czkawka_core", version = "6.1.0", features = [] } +indicatif = "0.17" +crossbeam-channel = { version = "0.5", features = [] } +ctrlc = { version = "3.4", features = ["termination"] } [features] default = [] diff --git a/czkawka_cli/src/main.rs b/czkawka_cli/src/main.rs index 5565425..dda8ca3 100644 --- a/czkawka_cli/src/main.rs +++ b/czkawka_cli/src/main.rs @@ -1,6 +1,11 @@ #![allow(clippy::needless_late_init)] +use std::thread; +use std::time::Duration; + use clap::Parser; +use crossbeam_channel::{bounded, unbounded, Receiver, Sender}; +use indicatif::{ProgressBar, ProgressStyle}; use log::error; use commands::Commands; @@ -8,6 +13,7 @@ use czkawka_core::bad_extensions::BadExtensions; use czkawka_core::big_file::{BigFile, SearchMode}; use czkawka_core::broken_files::BrokenFiles; use czkawka_core::common::{print_version_mode, set_number_of_threads, setup_logger}; +use czkawka_core::common_dir_traversal::ProgressData; use czkawka_core::common_tool::{CommonData, DeleteMethod}; #[allow(unused_imports)] // It is used in release for print_results_to_output(). use czkawka_core::common_traits::*; @@ -24,8 +30,10 @@ use crate::commands::{ Args, BadExtensionsArgs, BiggestFilesArgs, BrokenFilesArgs, CommonCliItems, DuplicatesArgs, EmptyFilesArgs, EmptyFoldersArgs, InvalidSymlinksArgs, SameMusicArgs, SimilarImagesArgs, SimilarVideosArgs, TemporaryArgs, }; +use crate::progress::connect_progress; mod commands; +mod progress; fn main() { let command = Args::parse().command; @@ -37,10 +45,13 @@ fn main() { println!("{command:?}"); } - match command { + let (progress_sender, progress_receiver): (Sender, Receiver) = unbounded(); + let (stop_sender, stop_receiver): (Sender<()>, Receiver<()>) = bounded(1); + + let calculate_thread = thread::spawn(move || match command { Commands::Duplicates(duplicates_args) => duplicates(duplicates_args), Commands::EmptyFolders(empty_folders_args) => empty_folders(empty_folders_args), - Commands::BiggestFiles(biggest_files_args) => biggest_files(biggest_files_args), + Commands::BiggestFiles(biggest_files_args) => biggest_files(biggest_files_args, stop_receiver, progress_sender), Commands::EmptyFiles(empty_files_args) => empty_files(empty_files_args), Commands::Temporary(temporary_args) => temporary(temporary_args), Commands::SimilarImages(similar_images_args) => similar_images(similar_images_args), @@ -52,7 +63,16 @@ fn main() { Commands::Tester {} => { test_image_conversion_speed(); } - } + }); + ctrlc::set_handler(move || { + println!("Get Sender"); + stop_sender.send(()).expect("Could not send signal on channel.") + }) + .expect("Error setting Ctrl-C handler"); + + connect_progress(progress_receiver); + + calculate_thread.join().unwrap(); } fn duplicates(duplicates: DuplicatesArgs) { @@ -102,7 +122,7 @@ fn empty_folders(empty_folders: EmptyFoldersArgs) { save_and_print_results(&mut item, &common_cli_items); } -fn biggest_files(biggest_files: BiggestFilesArgs) { +fn biggest_files(biggest_files: BiggestFilesArgs, stop_sender: Receiver<()>, progress_sender: Sender) { let BiggestFilesArgs { common_cli_items, number_of_files, @@ -121,7 +141,7 @@ fn biggest_files(biggest_files: BiggestFilesArgs) { item.set_search_mode(SearchMode::SmallestFiles); } - item.find_big_files(None, None); + item.find_big_files(Some(&stop_sender), Some(&progress_sender)); save_and_print_results(&mut item, &common_cli_items); } @@ -132,7 +152,6 @@ fn empty_files(empty_files: EmptyFilesArgs) { let mut item = EmptyFiles::new(); set_common_settings(&mut item, &common_cli_items); - if delete_files { item.set_delete_method(DeleteMethod::Delete); } @@ -148,7 +167,6 @@ fn temporary(temporary: TemporaryArgs) { let mut item = Temporary::new(); set_common_settings(&mut item, &common_cli_items); - if delete_files { item.set_delete_method(DeleteMethod::Delete); } @@ -181,7 +199,6 @@ fn similar_images(similar_images: SimilarImagesArgs) { item.set_hash_size(hash_size); item.set_delete_method(delete_method.delete_method); item.set_dry_run(dry_run.dry_run); - item.set_similarity(return_similarity_from_similarity_preset(&similarity_preset, hash_size)); item.find_similar_images(None, None); @@ -240,7 +257,6 @@ fn broken_files(broken_files: BrokenFilesArgs) { let mut item = BrokenFiles::new(); set_common_settings(&mut item, &common_cli_items); - if delete_files { item.set_delete_method(DeleteMethod::Delete); } @@ -302,6 +318,7 @@ fn save_and_print_results(component: &mut T, commo error!("Failed to save pretty json results to file {e}"); } } + if !cfg!(debug_assertions) { component.print_results_to_output(); } diff --git a/czkawka_cli/src/progress.rs b/czkawka_cli/src/progress.rs new file mode 100644 index 0000000..6eb3ad7 --- /dev/null +++ b/czkawka_cli/src/progress.rs @@ -0,0 +1,60 @@ +use std::time::Duration; + +use crossbeam_channel::Receiver; +use indicatif::{ProgressBar, ProgressStyle}; + +use czkawka_core::common_dir_traversal::{ProgressData, ToolType}; + +pub fn connect_progress(progress_receiver: Receiver) { + let mut pb = ProgressBar::new(1); + let mut latest_id = None; + while let Ok(progress_data) = progress_receiver.recv() { + if latest_id != Some(progress_data.current_stage) { + pb.finish_and_clear(); + if progress_data.current_stage == 0 { + pb = get_progress_bar_for_collect_files(); + } else { + pb = ProgressBar::new_spinner(); + } + latest_id = Some(progress_data.current_stage); + } + + if progress_data.current_stage == 0 && progress_data.tool_type != ToolType::EmptyFolders { + pb.set_message(format!("Collecting files: {}", progress_data.entries_checked)); + } else if progress_data.current_stage == 0 { + pb.set_message(format!("Collecting folders: {}", progress_data.entries_checked)); + } else { + pb.set_message(format!("Loading cache: {}", progress_data.entries_checked)); + } + // println!("{:?}", progress_data); + } + pb.finish(); + println!("AAA"); +} + +pub fn check_if_loading_saving_cache(progress_data: &ProgressData) -> bool {} + +pub fn get_progress_bar_for_collect_files() -> ProgressBar { + let pb = ProgressBar::new_spinner(); + pb.enable_steady_tick(Duration::from_millis(120)); + pb.set_style( + ProgressStyle::with_template("{spinner:.blue} {msg}") + .unwrap() + .tick_strings(&["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸", "▪▪▪▪▪"]), + ); + pb +} + +pub fn get_progress_known_values(max_value: usize) -> ProgressBar { + let pb = ProgressBar::new(max_value as u64); + pb.set_style( + ProgressStyle::default_bar() + .template("{spinner:.blue} {msg} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {pos}/{len} ({eta})") + .progress_chars("##-"), + ); + pb +} + +// pub fn get_progress_loading_saving_cache() -> ProgressBar { +// +// } diff --git a/czkawka_gui/src/connect_things/connect_progress_window.rs b/czkawka_gui/src/connect_things/connect_progress_window.rs index facf5f4..138976f 100644 --- a/czkawka_gui/src/connect_things/connect_progress_window.rs +++ b/czkawka_gui/src/connect_things/connect_progress_window.rs @@ -19,6 +19,47 @@ use crate::localizer_core::generate_translation_hashmap; use crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE; use crate::taskbar_progress::TaskbarProgress; +// Empty files +// 0 - Collecting files +// Empty folders +// 0 - Collecting folders +// Big files +// 0 - Collecting files +// Same music +// 0 - Collecting files +// 1 - Loading cache +// 2 - Checking tags / content +// 3 - Saving cache +// 4 - Checking tags / content - progress +// 5 - Only content - ending +// Similar images +// 0 - Collecting files +// 1 - Scanning images +// 2 - Comparing hashes +// Similar videos +// 0 - Collecting files +// 1 - Scanning videos +// Temporary files +// 0 - Collecting files +// Invalid symlinks +// 0 - Collecting files +// Broken files +// 0 - Collecting files +// 1 - Scanning files +// Bad extensions +// 0 - Collecting files +// 1 - Scanning files +// Duplicates - Hash +// 0 - Collecting files +// 1 - Loading cache +// 2 - Hash - first 1KB file +// 3 - Saving cache +// 4 - Loading cache +// 5 - Hash - normal hash +// 6 - Saving cache +// Duplicates - Name or SizeName or Size +// 0 - Collecting files + #[allow(clippy::too_many_arguments)] pub fn connect_progress_window(gui_data: &GuiData, progress_receiver: Receiver) { let main_context = MainContext::default();