11use git2:: Repository ;
2+ use std:: collections:: HashSet ;
23use std:: env;
34use glob:: Pattern ;
45use std:: process:: Command ;
56use std:: time:: Instant ;
67
7- #[ derive( Clone ) ]
8+ #[ derive( Clone , Debug ) ]
89struct PatternFilter {
910 pattern : String ,
1011 exclude : bool ,
@@ -32,13 +33,18 @@ fn main() {
3233 let duration = start. elapsed ( ) ;
3334 println ! ( "Getting changed files done in: {:?}" , duration) ;
3435
36+ println ! ( "Changed files: {:?}" , changed_files) ;
37+
3538 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) ;
3740 let duration = start. elapsed ( ) ;
3841 println ! ( "Filtering files done in: {:?}" , duration) ;
3942
4043 let count = get_count ( filtered_files. clone ( ) ) ;
4144
45+ println ! ( "Filtered files: {:?}" , filtered_files) ;
46+ println ! ( "Count: {}" , count) ;
47+
4248 Command :: new ( "sh" )
4349 . arg ( "-c" )
4450 . arg ( format ! ( "echo \" DIFF_FILES={:?}\" >> $GITHUB_OUTPUT" , filtered_files) )
@@ -53,10 +59,18 @@ fn main() {
5359}
5460
5561fn create_patterns_filters ( arg : & str ) -> Vec < PatternFilter > {
56- let patterns = arg
62+ let binding = arg
5763 . split ( '=' )
5864 . last ( )
5965 . 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
6074 . split ( ',' )
6175 . collect :: < Vec < & str > > ( ) ;
6276
@@ -85,6 +99,7 @@ fn get_changed_files() -> Vec<String> {
8599 let head = repository. head ( ) . expect ( "Failed to get HEAD" ) ;
86100 let head_commit = head. peel_to_commit ( ) . expect ( "Failed to peel HEAD to commit" ) ;
87101
102+ // Refers to base branch in case of pull request. For example: main
88103 let base_ref_env = env:: var ( "GITHUB_BASE_REF" ) . expect ( "Failed to get GITHUB_BASE_REF env variable" ) ;
89104
90105 Command :: new ( "sh" )
@@ -119,49 +134,39 @@ fn get_changed_files() -> Vec<String> {
119134 changed_files
120135}
121136
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 ( ) ;
127139
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+ }
130145
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+ } ) ;
147152 }
148153
149- filtered_files
154+ hash_set_filtered_files
150155}
151156
152- fn get_count ( filtered_files : Vec < String > ) -> usize {
157+ fn get_count ( filtered_files : HashSet < String > ) -> usize {
153158 filtered_files. len ( )
154159}
155160
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 ( ) ;
159164
160165 filters. iter ( ) . for_each ( |pattern_filter| {
161166 if pattern_filter. exclude {
162- exclude_patterns_filters. push ( pattern_filter. clone ( ) ) ;
167+ exclude_patterns_filters. insert ( pattern_filter. clone ( ) . pattern ) ;
163168 } else {
164- include_patterns_filters. push ( pattern_filter. clone ( ) ) ;
169+ include_patterns_filters. insert ( pattern_filter. clone ( ) . pattern ) ;
165170 }
166171 } ) ;
167172
0 commit comments