Save
This commit is contained in:
parent
b668dd38aa
commit
2d6356adee
57
Cargo.lock
generated
57
Cargo.lock
generated
|
@ -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"
|
||||
|
|
|
@ -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 = []
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
60
czkawka_cli/src/progress.rs
Normal file
60
czkawka_cli/src/progress.rs
Normal 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 {
|
||||
//
|
||||
// }
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue