@@ -14,9 +14,6 @@ fn main() {
1414 let args: Vec < String > = env:: args ( ) . collect ( ) ;
1515 let mut patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
1616
17- let mut exclude_patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
18- let mut include_patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
19-
2017 for arg in args. iter ( ) {
2118 if arg. starts_with ( "--patterns=" ) {
2219 patterns_filters = create_patterns_filters ( & arg) ;
@@ -28,41 +25,19 @@ fn main() {
2825 return ;
2926 }
3027
31- patterns_filters. iter ( ) . for_each ( |pattern_filter| {
32- if pattern_filter. exclude {
33- exclude_patterns_filters. push ( pattern_filter. clone ( ) ) ;
34- } else {
35- include_patterns_filters. push ( pattern_filter. clone ( ) ) ;
36- }
37- } ) ;
28+ let ( include_patterns_filters, exclude_patterns_filters) = categorize_filters ( patterns_filters) ;
3829
3930 let start = Instant :: now ( ) ;
4031 let changed_files = get_changed_files ( ) ;
4132 let duration = start. elapsed ( ) ;
4233 println ! ( "Getting changed files done in: {:?}" , duration) ;
4334
44- let mut filtered_files: Vec < String > = Vec :: new ( ) ;
45-
4635 let start = Instant :: now ( ) ;
47- for pattern in include_patterns_filters. iter ( ) {
48- filtered_files. extend ( filter_files_by_pattern ( & pattern, changed_files. clone ( ) ) ) ;
49- }
36+ let filtered_files = filter ( changed_files, include_patterns_filters, exclude_patterns_filters) ;
5037 let duration = start. elapsed ( ) ;
5138 println ! ( "Filtering files done in: {:?}" , duration) ;
5239
53- let start = Instant :: now ( ) ;
54- for pattern in exclude_patterns_filters. iter ( ) {
55- filtered_files = filtered_files
56- . iter ( )
57- . filter ( |file| !Pattern :: new ( & pattern. pattern ) . expect ( "Failed to create pattern" ) . matches ( file) )
58- . map ( |file| file. to_string ( ) )
59- . collect ( ) ;
60- }
61- let duration = start. elapsed ( ) ;
62- println ! ( "Excluding files done in: {:?}" , duration) ;
63-
64- println ! ( "DIFF_FILES: {:?}" , filtered_files) ;
65- println ! ( "DIFF_COUNT: {}" , filtered_files. len( ) ) ;
40+ let count = get_count ( filtered_files. clone ( ) ) ;
6641
6742 Command :: new ( "sh" )
6843 . arg ( "-c" )
@@ -72,7 +47,7 @@ fn main() {
7247
7348 Command :: new ( "sh" )
7449 . arg ( "-c" )
75- . arg ( format ! ( "echo \" DIFF_COUNT={}\" >> $GITHUB_OUTPUT" , filtered_files . len ( ) ) )
50+ . arg ( format ! ( "echo \" DIFF_COUNT={}\" >> $GITHUB_OUTPUT" , count ) )
7651 . output ( )
7752 . expect ( "Failed to execute DIFF_COUNT command" ) ;
7853}
@@ -144,15 +119,57 @@ fn get_changed_files() -> Vec<String> {
144119 changed_files
145120}
146121
147- fn filter_files_by_pattern ( pattern_filter : & PatternFilter , files : Vec < String > ) -> Vec < String > {
122+ fn filter ( changed_files : Vec < String > , include_patterns_filters : Vec < PatternFilter > , exclude_patterns_filters : Vec < PatternFilter > ) -> Vec < String > {
123+ let filtered_files: Vec < String > = include_patterns_filters
124+ . iter ( )
125+ . flat_map ( |pattern| filter_files_by_pattern ( pattern, & changed_files, & exclude_patterns_filters) )
126+ . collect ( ) ;
127+
128+ filtered_files
129+ }
130+
131+ fn filter_files_by_pattern ( pattern_filter : & PatternFilter , files : & Vec < String > , exclude_patterns : & Vec < PatternFilter > ) -> Vec < String > {
148132 let pattern = Pattern :: new ( & pattern_filter. pattern ) . expect ( "Failed to create pattern" ) ;
149133
150- let filtered_files: Vec < String > = files
134+ let mut filtered_files: Vec < String > = files
151135 . iter ( )
152136 . filter ( |file| pattern. matches ( file) )
153137 . filter ( |_| pattern_filter. exclude == false )
154138 . map ( |file| file. to_string ( ) )
155139 . collect ( ) ;
156140
141+ for exclude_pattern in exclude_patterns. iter ( ) {
142+ filtered_files = filtered_files
143+ . iter ( )
144+ . filter ( |file| !Pattern :: new ( & exclude_pattern. pattern ) . expect ( "Failed to create pattern" ) . matches ( file) )
145+ . map ( |file| file. to_string ( ) )
146+ . collect ( ) ;
147+ }
148+
157149 filtered_files
150+ }
151+
152+ fn get_count ( filtered_files : Vec < String > ) -> usize {
153+ filtered_files. len ( )
154+ }
155+
156+ fn categorize_filters ( filters : Vec < PatternFilter > ) -> ( Vec < PatternFilter > , Vec < PatternFilter > ) {
157+ let mut exclude_patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
158+ let mut include_patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
159+
160+ filters. iter ( ) . for_each ( |pattern_filter| {
161+ if pattern_filter. exclude {
162+ exclude_patterns_filters. push ( pattern_filter. clone ( ) ) ;
163+ } else {
164+ include_patterns_filters. push ( pattern_filter. clone ( ) ) ;
165+ }
166+ } ) ;
167+
168+ ( include_patterns_filters, exclude_patterns_filters)
169+ }
170+
171+ #[ cfg( test) ]
172+ mod tests {
173+ mod unit;
174+ mod integration;
158175}
0 commit comments