1
1
use git2:: Repository ;
2
+ use std:: collections:: HashSet ;
2
3
use std:: env;
3
4
use glob:: Pattern ;
4
5
use std:: process:: Command ;
5
6
use std:: time:: Instant ;
6
7
7
- #[ derive( Clone ) ]
8
+ #[ derive( Clone , Debug ) ]
8
9
struct PatternFilter {
9
10
pattern : String ,
10
11
exclude : bool ,
@@ -32,13 +33,18 @@ fn main() {
32
33
let duration = start. elapsed ( ) ;
33
34
println ! ( "Getting changed files done in: {:?}" , duration) ;
34
35
36
+ println ! ( "Changed files: {:?}" , changed_files) ;
37
+
35
38
let start = Instant :: now ( ) ;
36
- let filtered_files = filter ( changed_files, include_patterns_filters, exclude_patterns_filters) ;
39
+ let filtered_files = filter_files ( changed_files, include_patterns_filters, exclude_patterns_filters) ;
37
40
let duration = start. elapsed ( ) ;
38
41
println ! ( "Filtering files done in: {:?}" , duration) ;
39
42
40
43
let count = get_count ( filtered_files. clone ( ) ) ;
41
44
45
+ println ! ( "Filtered files: {:?}" , filtered_files) ;
46
+ println ! ( "Count: {}" , count) ;
47
+
42
48
Command :: new ( "sh" )
43
49
. arg ( "-c" )
44
50
. arg ( format ! ( "echo \" DIFF_FILES={:?}\" >> $GITHUB_OUTPUT" , filtered_files) )
@@ -53,10 +59,18 @@ fn main() {
53
59
}
54
60
55
61
fn create_patterns_filters ( arg : & str ) -> Vec < PatternFilter > {
56
- let patterns = arg
62
+ let binding = arg
57
63
. split ( '=' )
58
64
. last ( )
59
65
. expect ( "Failed to get patterns" )
66
+ . replace ( " " , "" )
67
+ . replace ( "\n " , "," )
68
+ . replace ( "\r " , "" )
69
+ . replace ( ",," , "," )
70
+ . trim_end_matches ( ',' )
71
+ . to_string ( ) ;
72
+
73
+ let patterns = binding
60
74
. split ( ',' )
61
75
. collect :: < Vec < & str > > ( ) ;
62
76
@@ -85,6 +99,7 @@ fn get_changed_files() -> Vec<String> {
85
99
let head = repository. head ( ) . expect ( "Failed to get HEAD" ) ;
86
100
let head_commit = head. peel_to_commit ( ) . expect ( "Failed to peel HEAD to commit" ) ;
87
101
102
+ // Refers to base branch in case of pull request. For example: main
88
103
let base_ref_env = env:: var ( "GITHUB_BASE_REF" ) . expect ( "Failed to get GITHUB_BASE_REF env variable" ) ;
89
104
90
105
Command :: new ( "sh" )
@@ -119,49 +134,39 @@ fn get_changed_files() -> Vec<String> {
119
134
changed_files
120
135
}
121
136
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 ( ) ;
137
+ fn filter_files ( changed_files : Vec < String > , include_patterns_filters : HashSet < String > , exclude_patterns_filters : HashSet < String > ) -> HashSet < String > {
138
+ let mut hash_set_filtered_files = HashSet :: new ( ) ;
127
139
128
- filtered_files
129
- }
140
+ for changed_file in changed_files. iter ( ) {
141
+ include_patterns_filters. iter ( ) . for_each ( |pattern| {
142
+ if Pattern :: new ( pattern) . expect ( "Failed to create pattern" ) . matches ( changed_file) {
143
+ hash_set_filtered_files. insert ( changed_file. to_string ( ) ) ;
144
+ }
130
145
131
- fn filter_files_by_pattern ( pattern_filter : & PatternFilter , files : & Vec < String > , exclude_patterns : & Vec < PatternFilter > ) -> Vec < String > {
132
- let pattern = Pattern :: new ( & pattern_filter. pattern ) . expect ( "Failed to create pattern" ) ;
133
-
134
- let mut filtered_files: Vec < String > = files
135
- . iter ( )
136
- . filter ( |file| pattern. matches ( file) )
137
- . filter ( |_| pattern_filter. exclude == false )
138
- . map ( |file| file. to_string ( ) )
139
- . collect ( ) ;
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 ( ) ;
146
+ exclude_patterns_filters. iter ( ) . for_each ( |pattern| {
147
+ if Pattern :: new ( pattern) . expect ( "Failed to create pattern" ) . matches ( changed_file) {
148
+ hash_set_filtered_files. remove ( changed_file) ;
149
+ }
150
+ } ) ;
151
+ } ) ;
147
152
}
148
153
149
- filtered_files
154
+ hash_set_filtered_files
150
155
}
151
156
152
- fn get_count ( filtered_files : Vec < String > ) -> usize {
157
+ fn get_count ( filtered_files : HashSet < String > ) -> usize {
153
158
filtered_files. len ( )
154
159
}
155
160
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 ( ) ;
161
+ fn categorize_filters ( filters : Vec < PatternFilter > ) -> ( HashSet < String > , HashSet < String > ) {
162
+ let mut exclude_patterns_filters: HashSet < String > = HashSet :: new ( ) ;
163
+ let mut include_patterns_filters: HashSet < String > = HashSet :: new ( ) ;
159
164
160
165
filters. iter ( ) . for_each ( |pattern_filter| {
161
166
if pattern_filter. exclude {
162
- exclude_patterns_filters. push ( pattern_filter. clone ( ) ) ;
167
+ exclude_patterns_filters. insert ( pattern_filter. clone ( ) . pattern ) ;
163
168
} else {
164
- include_patterns_filters. push ( pattern_filter. clone ( ) ) ;
169
+ include_patterns_filters. insert ( pattern_filter. clone ( ) . pattern ) ;
165
170
}
166
171
} ) ;
167
172
0 commit comments