@@ -14,9 +14,6 @@ fn main() {
14
14
let args: Vec < String > = env:: args ( ) . collect ( ) ;
15
15
let mut patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
16
16
17
- let mut exclude_patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
18
- let mut include_patterns_filters: Vec < PatternFilter > = Vec :: new ( ) ;
19
-
20
17
for arg in args. iter ( ) {
21
18
if arg. starts_with ( "--patterns=" ) {
22
19
patterns_filters = create_patterns_filters ( & arg) ;
@@ -28,41 +25,19 @@ fn main() {
28
25
return ;
29
26
}
30
27
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) ;
38
29
39
30
let start = Instant :: now ( ) ;
40
31
let changed_files = get_changed_files ( ) ;
41
32
let duration = start. elapsed ( ) ;
42
33
println ! ( "Getting changed files done in: {:?}" , duration) ;
43
34
44
- let mut filtered_files: Vec < String > = Vec :: new ( ) ;
45
-
46
35
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) ;
50
37
let duration = start. elapsed ( ) ;
51
38
println ! ( "Filtering files done in: {:?}" , duration) ;
52
39
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 ( ) ) ;
66
41
67
42
Command :: new ( "sh" )
68
43
. arg ( "-c" )
@@ -72,7 +47,7 @@ fn main() {
72
47
73
48
Command :: new ( "sh" )
74
49
. arg ( "-c" )
75
- . arg ( format ! ( "echo \" DIFF_COUNT={}\" >> $GITHUB_OUTPUT" , filtered_files . len ( ) ) )
50
+ . arg ( format ! ( "echo \" DIFF_COUNT={}\" >> $GITHUB_OUTPUT" , count ) )
76
51
. output ( )
77
52
. expect ( "Failed to execute DIFF_COUNT command" ) ;
78
53
}
@@ -144,15 +119,57 @@ fn get_changed_files() -> Vec<String> {
144
119
changed_files
145
120
}
146
121
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 > {
148
132
let pattern = Pattern :: new ( & pattern_filter. pattern ) . expect ( "Failed to create pattern" ) ;
149
133
150
- let filtered_files: Vec < String > = files
134
+ let mut filtered_files: Vec < String > = files
151
135
. iter ( )
152
136
. filter ( |file| pattern. matches ( file) )
153
137
. filter ( |_| pattern_filter. exclude == false )
154
138
. map ( |file| file. to_string ( ) )
155
139
. collect ( ) ;
156
140
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
+
157
149
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;
158
175
}
0 commit comments