Skip to content

Commit 4c612a8

Browse files
committed
TST
1 parent 6a03aa9 commit 4c612a8

2 files changed

Lines changed: 81 additions & 19 deletions

File tree

czkawka_core/src/common/directories.rs

Lines changed: 80 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,34 @@ impl Directories {
2828
pub(crate) fn set_reference_paths(&mut self, reference_paths: Vec<PathBuf>) -> Messages {
2929
self.reference_files = Vec::new();
3030
self.reference_directories = Vec::new();
31-
self.process_paths(reference_paths, true, false)
31+
let paths = if cfg!(target_family = "windows") {
32+
reference_paths.into_iter().map(|p| normalize_windows_path(p)).collect()
33+
} else {
34+
reference_paths
35+
};
36+
self.process_paths(paths, true, false)
3237
}
3338

3439
pub(crate) fn set_included_paths(&mut self, included_paths: Vec<PathBuf>) -> Messages {
3540
self.included_files = Vec::new();
3641
self.included_directories = Vec::new();
37-
self.process_paths(included_paths, false, false)
42+
let paths = if cfg!(target_family = "windows") {
43+
included_paths.into_iter().map(|p| normalize_windows_path(p)).collect()
44+
} else {
45+
included_paths
46+
};
47+
self.process_paths(paths, false, false)
3848
}
3949

4050
pub(crate) fn set_excluded_paths(&mut self, excluded_paths: Vec<PathBuf>) -> Messages {
4151
self.excluded_files = Vec::new();
4252
self.excluded_directories = Vec::new();
43-
self.process_paths(excluded_paths, false, true)
53+
let paths = if cfg!(target_family = "windows") {
54+
excluded_paths.into_iter().map(|p| normalize_windows_path(p)).collect()
55+
} else {
56+
excluded_paths
57+
};
58+
self.process_paths(paths, false, true)
4459
}
4560

4661
fn process_paths(&mut self, paths: Vec<PathBuf>, is_reference: bool, is_excluded: bool) -> Messages {
@@ -116,14 +131,16 @@ impl Directories {
116131
self.exclude_other_filesystems = Some(exclude_other_filesystems);
117132
}
118133

119-
pub(crate) fn optimize_directories(&mut self, recursive_search: bool) -> Result<Messages, Messages> {
134+
pub(crate) fn optimize_directories(&mut self, recursive_search: bool, skip_exist_check: bool) -> Result<Messages, Messages> {
120135
let mut messages: Messages = Messages::new();
121136

137+
dbg!("1", &self);
122138
if self.included_directories.is_empty() && self.included_files.is_empty() {
123139
messages.critical = Some(flc!("core_missing_no_chosen_included_path"));
124140
return Err(messages);
125141
}
126142

143+
dbg!("2", &self);
127144
// Remove duplicated entries like: "/", "/"
128145
for items in &mut [
129146
&mut self.included_directories,
@@ -133,14 +150,10 @@ impl Directories {
133150
&mut self.excluded_files,
134151
&mut self.reference_files,
135152
] {
136-
if cfg!(target_family = "windows") {
137-
items.iter_mut().for_each(|item| {
138-
*item = normalize_windows_path(item.clone());
139-
});
140-
}
141153
items.sort_unstable();
142154
items.dedup();
143155
}
156+
dbg!("3", &self);
144157

145158
// Optimize for duplicated included directories - "/", "/home". "/home/Pulpit" to "/"
146159
// Do not use when not using recursive search
@@ -150,41 +163,49 @@ impl Directories {
150163
kk.retain(|item| !cloned.iter().any(|other_item| item != other_item && item.starts_with(other_item)));
151164
}
152165
}
166+
dbg!("4", &self);
153167

154168
// Remove included directories which are inside any excluded directory
155169
// Same with included files
156170
for kk in [&mut self.included_directories, &mut self.included_files] {
157171
kk.retain(|id| !self.excluded_directories.iter().any(|ed| id.starts_with(ed)));
158172
}
173+
dbg!("5", &self);
159174

160175
// Also check if files are not excluded directly
161176
{
162177
let kk = &mut self.included_files;
163178
kk.retain(|id| !self.excluded_directories.iter().any(|ed| id == ed));
164179
}
180+
dbg!("6", &self);
165181

166182
// Remove non existed directories and files
167-
for kk in [
168-
&mut self.excluded_files,
169-
&mut self.excluded_directories,
170-
&mut self.included_files,
171-
&mut self.included_directories,
172-
] {
173-
kk.retain(|path| path.exists());
183+
if !skip_exist_check {
184+
for kk in [
185+
&mut self.excluded_files,
186+
&mut self.excluded_directories,
187+
&mut self.included_files,
188+
&mut self.included_directories,
189+
] {
190+
kk.retain(|path| path.exists());
191+
}
174192
}
193+
dbg!("7", &self);
175194

176195
// Excluded paths must are inside included path, because otherwise they are pointless
177196
// So first, removing included files, that are inside excluded directories
178197
// So this will allow to remove excluded directories outside included directories
179198
self.included_files.retain(|ifile| !self.excluded_directories.iter().any(|ed| ifile.starts_with(ed)));
180199
self.excluded_directories.retain(|ed| self.included_directories.iter().any(|id| ed.starts_with(id)));
181200

201+
dbg!("8", &self);
182202
// Selecting Reference folders
183203
{
184204
self.reference_directories.retain(|folder| self.included_directories.iter().any(|e| folder.starts_with(e)));
185205
self.reference_files
186206
.retain(|file| self.included_directories.iter().any(|e| file.starts_with(e)) || self.included_files.iter().any(|f| file == f));
187207
}
208+
dbg!("9", &self);
188209

189210
// Not needed, but better is to have sorted everything
190211
for items in &mut [
@@ -197,6 +218,7 @@ impl Directories {
197218
] {
198219
items.sort_unstable();
199220
}
221+
dbg!("10", &self);
200222

201223
// Get device IDs for included directories, probably ther better solution would be to get one id per directory, but this is faster, but a little less precise
202224
#[cfg(target_family = "unix")]
@@ -208,15 +230,19 @@ impl Directories {
208230
}
209231
}
210232
}
233+
dbg!("11", &self);
211234

212235
if self.included_directories.is_empty() && self.included_files.is_empty() {
213-
messages.errors.push(flc!("core_missing_no_chosen_included_path"));
236+
messages.critical = Some(flc!("core_missing_no_chosen_included_path"));
214237
return Err(messages);
215238
}
239+
dbg!("12", &self);
216240

217241
if self.reference_directories == self.included_directories && self.included_files == self.reference_files {
218-
messages.warnings.push(flc!("core_reference_included_paths_same"));
242+
messages.critical = Some(flc!("core_reference_included_paths_same"));
243+
return Err(messages);
219244
}
245+
dbg!("13", &self);
220246

221247
Ok(messages)
222248
}
@@ -271,3 +297,39 @@ impl Directories {
271297
.collect::<Vec<(T, Vec<T>)>>()
272298
}
273299
}
300+
301+
#[cfg(test)]
302+
mod tests {
303+
use super::*;
304+
use std::path::PathBuf;
305+
306+
#[test]
307+
fn test_no_included_paths_errors() {
308+
let mut d = Directories::new();
309+
let msgs = d.optimize_directories(true, true).unwrap_err();
310+
assert!(msgs.critical.is_some());
311+
}
312+
313+
#[test]
314+
fn test_dedup_included_directories() {
315+
let p = PathBuf::from("/this/path/does/not/exist/dedup");
316+
let mut d = Directories::new();
317+
d.included_directories.push(p.clone());
318+
d.included_directories.push(p.clone());
319+
let msgs = d.optimize_directories(true, true).unwrap();
320+
assert_eq!(d.included_directories, vec![
321+
p.clone(),
322+
]);
323+
}
324+
325+
#[test]
326+
fn test_excluded_removes_included_inside() {
327+
let base = PathBuf::from("/this/base/does/not/exist");
328+
let sub = base.join("sub");
329+
let mut d = Directories::new();
330+
d.included_directories.push(sub.clone());
331+
d.excluded_directories.push(base.clone());
332+
let _msgs = d.optimize_directories(true, true).unwrap_err();
333+
assert_eq!(d.included_directories, Vec::<PathBuf>::new());
334+
}
335+
}

czkawka_core/src/common/tool_data.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ pub trait CommonData {
283283
fn prepare_items(&mut self, tool_extensions: Option<&[&str]>) -> Result<(), ()> {
284284
let recursive_search = self.get_cd().recursive_search;
285285
// Optimizes directories and removes recursive calls
286-
match self.get_cd_mut().directories.optimize_directories(recursive_search) {
286+
match self.get_cd_mut().directories.optimize_directories(recursive_search, false) {
287287
Ok(messages) => {
288288
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
289289
}

0 commit comments

Comments
 (0)