@@ -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+ }
0 commit comments