@@ -7,8 +7,9 @@ use std::io::Read;
77use std:: collections:: BTreeSet ;
88
99use crate :: diff:: types:: ChangedFile ;
10- use crate :: report:: { CoverageReport , UncoveredFile } ;
10+ use crate :: report:: { CoverageReport , SkippedFile , UncoveredFile } ;
1111use crate :: util:: path:: normalize_path;
12+ use regex:: Regex ;
1213use store:: CoverageStore ;
1314
1415pub trait CoverageParser {
@@ -25,8 +26,10 @@ pub fn analyze_changed_coverage(
2526 changed_files : & [ ChangedFile ] ,
2627 coverage : & CoverageStore ,
2728 treat_missing_as_uncovered : bool ,
29+ skip_paths : & [ Regex ] ,
2830) -> Result < CoverageReport , store:: CoverageLookupError > {
2931 let mut uncovered_files = Vec :: new ( ) ;
32+ let mut skipped_files = Vec :: new ( ) ;
3033 let mut total_changed = 0usize ;
3134 let mut total_covered = 0usize ;
3235
@@ -36,6 +39,16 @@ pub fn analyze_changed_coverage(
3639 if unique_lines. is_empty ( ) {
3740 continue ;
3841 }
42+ if let Some ( matched) = skip_paths
43+ . iter ( )
44+ . find ( |pattern| pattern. is_match ( & normalized_path) )
45+ {
46+ skipped_files. push ( SkippedFile {
47+ path : normalized_path,
48+ pattern : matched. as_str ( ) . to_string ( ) ,
49+ } ) ;
50+ continue ;
51+ }
3952
4053 let file_coverage = coverage. file_coverage ( & normalized_path) ?;
4154 let mut uncovered_lines = Vec :: new ( ) ;
@@ -77,6 +90,7 @@ pub fn analyze_changed_coverage(
7790 total_changed,
7891 total_covered,
7992 uncovered_files,
93+ skipped_files,
8094 } )
8195}
8296
@@ -86,6 +100,7 @@ mod tests {
86100 use crate :: coverage:: store:: CoverageStore ;
87101 use crate :: coverage:: CoverageSink ;
88102 use crate :: diff:: types:: ChangedFile ;
103+ use regex:: Regex ;
89104
90105 #[ test]
91106 fn counts_unique_changed_lines_and_tracks_uncovered ( ) {
@@ -98,11 +113,12 @@ mod tests {
98113 store. on_line ( "src/foo.rs" , 1 , 2 ) ;
99114 store. on_line ( "src/foo.rs" , 2 , 0 ) ;
100115
101- let report = analyze_changed_coverage ( & changed_files, & store, true ) . expect ( "report" ) ;
116+ let report = analyze_changed_coverage ( & changed_files, & store, true , & [ ] ) . expect ( "report" ) ;
102117
103118 assert_eq ! ( report. total_changed, 2 ) ;
104119 assert_eq ! ( report. total_covered, 1 ) ;
105120 assert_eq ! ( report. uncovered_files. len( ) , 1 ) ;
121+ assert ! ( report. skipped_files. is_empty( ) ) ;
106122 let uncovered = & report. uncovered_files [ 0 ] ;
107123 assert_eq ! ( uncovered. path, "src/foo.rs" ) ;
108124 assert_eq ! ( uncovered. uncovered_lines, vec![ 2 ] ) ;
@@ -116,11 +132,12 @@ mod tests {
116132 } ] ;
117133
118134 let store = CoverageStore :: default ( ) ;
119- let report = analyze_changed_coverage ( & changed_files, & store, true ) . expect ( "report" ) ;
135+ let report = analyze_changed_coverage ( & changed_files, & store, true , & [ ] ) . expect ( "report" ) ;
120136
121137 assert_eq ! ( report. total_changed, 2 ) ;
122138 assert_eq ! ( report. total_covered, 0 ) ;
123139 assert_eq ! ( report. uncovered_files. len( ) , 1 ) ;
140+ assert ! ( report. skipped_files. is_empty( ) ) ;
124141 let uncovered = & report. uncovered_files [ 0 ] ;
125142 assert_eq ! ( uncovered. path, "src/foo.rs" ) ;
126143 assert_eq ! ( uncovered. uncovered_lines, vec![ 1 , 2 ] ) ;
@@ -134,10 +151,40 @@ mod tests {
134151 } ] ;
135152
136153 let store = CoverageStore :: default ( ) ;
137- let report = analyze_changed_coverage ( & changed_files, & store, false ) . expect ( "report" ) ;
154+ let report = analyze_changed_coverage ( & changed_files, & store, false , & [ ] ) . expect ( "report" ) ;
138155
139156 assert_eq ! ( report. total_changed, 0 ) ;
140157 assert_eq ! ( report. total_covered, 0 ) ;
141158 assert ! ( report. uncovered_files. is_empty( ) ) ;
159+ assert ! ( report. skipped_files. is_empty( ) ) ;
160+ }
161+
162+ #[ test]
163+ fn skips_files_matching_patterns ( ) {
164+ let changed_files = vec ! [
165+ ChangedFile {
166+ path: "pkg/mongodb/client.go" . to_string( ) ,
167+ changed_lines: vec![ 1 , 2 ] ,
168+ } ,
169+ ChangedFile {
170+ path: "src/main.go" . to_string( ) ,
171+ changed_lines: vec![ 10 ] ,
172+ } ,
173+ ] ;
174+
175+ let mut store = CoverageStore :: default ( ) ;
176+ store. on_line ( "src/main.go" , 10 , 1 ) ;
177+
178+ let patterns = [ Regex :: new ( r"^pkg/mongodb" ) . expect ( "regex" ) ] ;
179+ let report = analyze_changed_coverage ( & changed_files, & store, true , & patterns)
180+ . expect ( "report" ) ;
181+
182+ assert_eq ! ( report. total_changed, 1 ) ;
183+ assert_eq ! ( report. total_covered, 1 ) ;
184+ assert ! ( report. uncovered_files. is_empty( ) ) ;
185+ assert_eq ! ( report. skipped_files. len( ) , 1 ) ;
186+ let skipped = & report. skipped_files [ 0 ] ;
187+ assert_eq ! ( skipped. path, "pkg/mongodb/client.go" ) ;
188+ assert_eq ! ( skipped. pattern, r"^pkg/mongodb" ) ;
142189 }
143190}
0 commit comments