Skip to content

Commit 582e541

Browse files
authored
Unify progress data (#972)
* Unify progress data code * Do not increment in threads values every time when finding file/folder(works quite good, may works bad with folders with ~several thousands of files) * Partial changes * Simplify creating tree_view * Allow setting thread number in CLI * Simplified code and add tests with help of copilot
1 parent 78d00ee commit 582e541

21 files changed

+691
-1179
lines changed

czkawka_cli/src/commands.rs

+28
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ pub enum Commands {
8585

8686
#[derive(Debug, clap::Args)]
8787
pub struct DuplicatesArgs {
88+
#[clap(flatten)]
89+
pub thread_number: ThreadNumber,
8890
#[clap(flatten)]
8991
pub directories: Directories,
9092
#[clap(flatten)]
@@ -163,6 +165,8 @@ pub struct DuplicatesArgs {
163165

164166
#[derive(Debug, clap::Args)]
165167
pub struct EmptyFoldersArgs {
168+
#[clap(flatten)]
169+
pub thread_number: ThreadNumber,
166170
#[clap(flatten)]
167171
pub directories: Directories,
168172
#[clap(flatten)]
@@ -180,6 +184,8 @@ pub struct EmptyFoldersArgs {
180184

181185
#[derive(Debug, clap::Args)]
182186
pub struct BiggestFilesArgs {
187+
#[clap(flatten)]
188+
pub thread_number: ThreadNumber,
183189
#[clap(flatten)]
184190
pub directories: Directories,
185191
#[clap(flatten)]
@@ -205,6 +211,8 @@ pub struct BiggestFilesArgs {
205211

206212
#[derive(Debug, clap::Args)]
207213
pub struct EmptyFilesArgs {
214+
#[clap(flatten)]
215+
pub thread_number: ThreadNumber,
208216
#[clap(flatten)]
209217
pub directories: Directories,
210218
#[clap(flatten)]
@@ -226,6 +234,8 @@ pub struct EmptyFilesArgs {
226234

227235
#[derive(Debug, clap::Args)]
228236
pub struct TemporaryArgs {
237+
#[clap(flatten)]
238+
pub thread_number: ThreadNumber,
229239
#[clap(flatten)]
230240
pub directories: Directories,
231241
#[clap(flatten)]
@@ -245,6 +255,8 @@ pub struct TemporaryArgs {
245255

246256
#[derive(Debug, clap::Args)]
247257
pub struct SimilarImagesArgs {
258+
#[clap(flatten)]
259+
pub thread_number: ThreadNumber,
248260
#[clap(flatten)]
249261
pub directories: Directories,
250262
#[clap(flatten)]
@@ -313,6 +325,8 @@ pub struct SimilarImagesArgs {
313325

314326
#[derive(Debug, clap::Args)]
315327
pub struct SameMusicArgs {
328+
#[clap(flatten)]
329+
pub thread_number: ThreadNumber,
316330
#[clap(flatten)]
317331
pub directories: Directories,
318332
#[clap(flatten)]
@@ -359,6 +373,8 @@ pub struct SameMusicArgs {
359373

360374
#[derive(Debug, clap::Args)]
361375
pub struct InvalidSymlinksArgs {
376+
#[clap(flatten)]
377+
pub thread_number: ThreadNumber,
362378
#[clap(flatten)]
363379
pub directories: Directories,
364380
#[clap(flatten)]
@@ -380,6 +396,8 @@ pub struct InvalidSymlinksArgs {
380396

381397
#[derive(Debug, clap::Args)]
382398
pub struct BrokenFilesArgs {
399+
#[clap(flatten)]
400+
pub thread_number: ThreadNumber,
383401
#[clap(flatten)]
384402
pub directories: Directories,
385403
#[clap(flatten)]
@@ -401,6 +419,8 @@ pub struct BrokenFilesArgs {
401419

402420
#[derive(Debug, clap::Args)]
403421
pub struct SimilarVideosArgs {
422+
#[clap(flatten)]
423+
pub thread_number: ThreadNumber,
404424
#[clap(flatten)]
405425
pub directories: Directories,
406426
#[clap(flatten)]
@@ -449,6 +469,8 @@ pub struct SimilarVideosArgs {
449469

450470
#[derive(Debug, clap::Args)]
451471
pub struct BadExtensionsArgs {
472+
#[clap(flatten)]
473+
pub thread_number: ThreadNumber,
452474
#[clap(flatten)]
453475
pub directories: Directories,
454476
#[clap(flatten)]
@@ -517,6 +539,12 @@ pub struct NotRecursive {
517539
pub not_recursive: bool,
518540
}
519541

542+
#[derive(Debug, clap::Args)]
543+
pub struct ThreadNumber {
544+
#[clap(short = 'T', long, default_value = "0", help = "Limits thread number, 0(default) will use all available threads")]
545+
pub thread_number: usize,
546+
}
547+
520548
#[cfg(target_family = "unix")]
521549
#[derive(Debug, clap::Args)]
522550
pub struct ExcludeOtherFilesystems {

czkawka_cli/src/main.rs

+34-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use clap::Parser;
66

77
use commands::Commands;
88
use czkawka_core::big_file::SearchMode;
9-
use czkawka_core::common::{get_number_of_threads, set_default_number_of_threads};
9+
use czkawka_core::common::set_number_of_threads;
1010
#[allow(unused_imports)] // It is used in release for print_results().
1111
use czkawka_core::common_traits::*;
1212
use czkawka_core::similar_images::test_image_conversion_speed;
@@ -34,8 +34,6 @@ mod commands;
3434
fn main() {
3535
let command = Args::parse().command;
3636

37-
set_default_number_of_threads();
38-
println!("Set thread number to {}", get_number_of_threads());
3937
#[cfg(debug_assertions)]
4038
println!("{command:?}");
4139

@@ -59,6 +57,7 @@ fn main() {
5957

6058
fn duplicates(duplicates: DuplicatesArgs) {
6159
let DuplicatesArgs {
60+
thread_number,
6261
directories,
6362
excluded_directories,
6463
excluded_items,
@@ -78,6 +77,8 @@ fn duplicates(duplicates: DuplicatesArgs) {
7877
case_sensitive_name_comparison,
7978
} = duplicates;
8079

80+
set_number_of_threads(thread_number.thread_number);
81+
8182
let mut df = DuplicateFinder::new();
8283

8384
df.set_included_directory(directories.directories);
@@ -113,6 +114,7 @@ fn duplicates(duplicates: DuplicatesArgs) {
113114

114115
fn empty_folders(empty_folders: EmptyFoldersArgs) {
115116
let EmptyFoldersArgs {
117+
thread_number,
116118
directories,
117119
delete_folders,
118120
file_to_save,
@@ -122,6 +124,8 @@ fn empty_folders(empty_folders: EmptyFoldersArgs) {
122124
exclude_other_filesystems,
123125
} = empty_folders;
124126

127+
set_number_of_threads(thread_number.thread_number);
128+
125129
let mut ef = EmptyFolder::new();
126130

127131
ef.set_included_directory(directories.directories);
@@ -147,6 +151,7 @@ fn empty_folders(empty_folders: EmptyFoldersArgs) {
147151

148152
fn biggest_files(biggest_files: BiggestFilesArgs) {
149153
let BiggestFilesArgs {
154+
thread_number,
150155
directories,
151156
excluded_directories,
152157
excluded_items,
@@ -160,6 +165,8 @@ fn biggest_files(biggest_files: BiggestFilesArgs) {
160165
smallest_mode,
161166
} = biggest_files;
162167

168+
set_number_of_threads(thread_number.thread_number);
169+
163170
let mut bf = BigFile::new();
164171

165172
bf.set_included_directory(directories.directories);
@@ -193,6 +200,7 @@ fn biggest_files(biggest_files: BiggestFilesArgs) {
193200

194201
fn empty_files(empty_files: EmptyFilesArgs) {
195202
let EmptyFilesArgs {
203+
thread_number,
196204
directories,
197205
excluded_directories,
198206
excluded_items,
@@ -204,6 +212,8 @@ fn empty_files(empty_files: EmptyFilesArgs) {
204212
exclude_other_filesystems,
205213
} = empty_files;
206214

215+
set_number_of_threads(thread_number.thread_number);
216+
207217
let mut ef = EmptyFiles::new();
208218

209219
ef.set_included_directory(directories.directories);
@@ -234,6 +244,7 @@ fn empty_files(empty_files: EmptyFilesArgs) {
234244

235245
fn temporary(temporary: TemporaryArgs) {
236246
let TemporaryArgs {
247+
thread_number,
237248
directories,
238249
excluded_directories,
239250
excluded_items,
@@ -244,6 +255,8 @@ fn temporary(temporary: TemporaryArgs) {
244255
not_recursive,
245256
} = temporary;
246257

258+
set_number_of_threads(thread_number.thread_number);
259+
247260
let mut tf = Temporary::new();
248261

249262
tf.set_included_directory(directories.directories);
@@ -273,6 +286,7 @@ fn temporary(temporary: TemporaryArgs) {
273286

274287
fn similar_images(similar_images: SimilarImagesArgs) {
275288
let SimilarImagesArgs {
289+
thread_number,
276290
directories,
277291
excluded_directories,
278292
excluded_items,
@@ -288,6 +302,8 @@ fn similar_images(similar_images: SimilarImagesArgs) {
288302
hash_size,
289303
} = similar_images;
290304

305+
set_number_of_threads(thread_number.thread_number);
306+
291307
let mut sf = SimilarImages::new();
292308

293309
sf.set_included_directory(directories.directories);
@@ -320,6 +336,7 @@ fn similar_images(similar_images: SimilarImagesArgs) {
320336

321337
fn same_music(same_music: SameMusicArgs) {
322338
let SameMusicArgs {
339+
thread_number,
323340
directories,
324341
excluded_directories,
325342
excluded_items,
@@ -333,6 +350,8 @@ fn same_music(same_music: SameMusicArgs) {
333350
music_similarity,
334351
} = same_music;
335352

353+
set_number_of_threads(thread_number.thread_number);
354+
336355
let mut mf = SameMusic::new();
337356

338357
mf.set_included_directory(directories.directories);
@@ -365,6 +384,7 @@ fn same_music(same_music: SameMusicArgs) {
365384

366385
fn invalid_symlinks(invalid_symlinks: InvalidSymlinksArgs) {
367386
let InvalidSymlinksArgs {
387+
thread_number,
368388
directories,
369389
excluded_directories,
370390
excluded_items,
@@ -376,6 +396,8 @@ fn invalid_symlinks(invalid_symlinks: InvalidSymlinksArgs) {
376396
delete_files,
377397
} = invalid_symlinks;
378398

399+
set_number_of_threads(thread_number.thread_number);
400+
379401
let mut ifs = InvalidSymlinks::new();
380402

381403
ifs.set_included_directory(directories.directories);
@@ -405,6 +427,7 @@ fn invalid_symlinks(invalid_symlinks: InvalidSymlinksArgs) {
405427

406428
fn broken_files(broken_files: BrokenFilesArgs) {
407429
let BrokenFilesArgs {
430+
thread_number,
408431
directories,
409432
excluded_directories,
410433
excluded_items,
@@ -416,6 +439,8 @@ fn broken_files(broken_files: BrokenFilesArgs) {
416439
exclude_other_filesystems,
417440
} = broken_files;
418441

442+
set_number_of_threads(thread_number.thread_number);
443+
419444
let mut br = BrokenFiles::new();
420445

421446
br.set_included_directory(directories.directories);
@@ -446,6 +471,7 @@ fn broken_files(broken_files: BrokenFilesArgs) {
446471

447472
fn similar_videos(similar_videos: SimilarVideosArgs) {
448473
let SimilarVideosArgs {
474+
thread_number,
449475
directories,
450476
excluded_directories,
451477
excluded_items,
@@ -459,6 +485,8 @@ fn similar_videos(similar_videos: SimilarVideosArgs) {
459485
allowed_extensions,
460486
} = similar_videos;
461487

488+
set_number_of_threads(thread_number.thread_number);
489+
462490
let mut vr = SimilarVideos::new();
463491

464492
vr.set_included_directory(directories.directories);
@@ -488,6 +516,7 @@ fn similar_videos(similar_videos: SimilarVideosArgs) {
488516

489517
fn bad_extensions(bad_extensions: BadExtensionsArgs) {
490518
let BadExtensionsArgs {
519+
thread_number,
491520
directories,
492521
excluded_directories,
493522
excluded_items,
@@ -498,6 +527,8 @@ fn bad_extensions(bad_extensions: BadExtensionsArgs) {
498527
allowed_extensions,
499528
} = bad_extensions;
500529

530+
set_number_of_threads(thread_number.thread_number);
531+
501532
let mut be = BadExtensions::new();
502533

503534
be.set_included_directory(directories.directories);

czkawka_core/src/bad_extensions.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use mime_guess::get_mime_extensions;
1313
use rayon::prelude::*;
1414

1515
use crate::common::{prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads};
16-
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData};
16+
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType};
1717
use crate::common_directory::Directories;
1818
use crate::common_extensions::Extensions;
1919
use crate::common_items::ExcludedItems;
@@ -124,6 +124,7 @@ const WORKAROUNDS: &[(&str, &str)] = &[
124124
("xml", "vbox"), // VirtualBox
125125
("xml", "vbox-prev"), // VirtualBox
126126
("xml", "vcproj"), // VisualStudio
127+
("xml", "vcxproj"), // VisualStudio
127128
("xml", "xba"), // Libreoffice
128129
("xml", "xcd"), // Libreoffice files
129130
("zip", "apk"), // Android apk
@@ -172,6 +173,7 @@ impl Info {
172173
}
173174

174175
pub struct BadExtensions {
176+
tool_type: ToolType,
175177
text_messages: Messages,
176178
information: Info,
177179
files_to_check: Vec<FileEntry>,
@@ -191,6 +193,7 @@ impl BadExtensions {
191193
#[must_use]
192194
pub fn new() -> Self {
193195
Self {
196+
tool_type: ToolType::BadExtensions,
194197
text_messages: Messages::new(),
195198
information: Info::new(),
196199
recursive_search: true,
@@ -314,7 +317,7 @@ impl BadExtensions {
314317

315318
fn look_for_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
316319
let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) =
317-
prepare_thread_handler_common(progress_sender, 1, 1, self.files_to_check.len(), CheckingMethod::None);
320+
prepare_thread_handler_common(progress_sender, 1, 1, self.files_to_check.len(), CheckingMethod::None, self.tool_type);
318321

319322
let files_to_check = mem::take(&mut self.files_to_check);
320323

czkawka_core/src/big_file.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use humansize::BINARY;
1414
use rayon::prelude::*;
1515

1616
use crate::common::{check_folder_children, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, split_path};
17-
use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData};
17+
use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType};
1818
use crate::common_directory::Directories;
1919
use crate::common_extensions::Extensions;
2020
use crate::common_items::ExcludedItems;
@@ -55,6 +55,7 @@ impl Info {
5555

5656
/// Struct with required information's to work
5757
pub struct BigFile {
58+
tool_type: ToolType,
5859
text_messages: Messages,
5960
information: Info,
6061
big_files: Vec<(u64, FileEntry)>,
@@ -72,6 +73,7 @@ impl BigFile {
7273
#[must_use]
7374
pub fn new() -> Self {
7475
Self {
76+
tool_type: ToolType::BigFile,
7577
text_messages: Default::default(),
7678
information: Info::new(),
7779
big_files: Default::default(),
@@ -148,7 +150,8 @@ impl BigFile {
148150
folders_to_check.push(id.clone());
149151
}
150152

151-
let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None);
153+
let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) =
154+
prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None, self.tool_type);
152155

153156
while !folders_to_check.is_empty() {
154157
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {

0 commit comments

Comments
 (0)