1
0
Fork 0
mirror of synced 2024-05-21 04:43:50 +12:00
This commit is contained in:
Rafał Mikrut 2024-01-13 23:00:04 +01:00
parent b668dd38aa
commit 2d6356adee
5 changed files with 187 additions and 9 deletions

57
Cargo.lock generated
View file

@ -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"

View file

@ -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 = []

View file

@ -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<ProgressData>, Receiver<ProgressData>) = 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<ProgressData>) {
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<T: CommonData + PrintResults>(component: &mut T, commo
error!("Failed to save pretty json results to file {e}");
}
}
if !cfg!(debug_assertions) {
component.print_results_to_output();
}

View file

@ -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<ProgressData>) {
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 {
//
// }

View file

@ -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<ProgressData>) {
let main_context = MainContext::default();