@@ -5,23 +5,32 @@ import (
55 "bytes"
66 "fmt"
77 "io"
8+ "os"
89 "strings"
910
1011 "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/coverage"
1112)
1213
1314func Check (w io.Writer , cfg Config ) bool {
14- stats , err := coverage .GenerateCoverageStats (coverage.Config {
15- Profiles : strings .Split (cfg .Profile , "," ),
16- LocalPrefix : cfg .LocalPrefix ,
17- ExcludePaths : cfg .Exclude .Paths ,
18- })
15+ currentStats , err := GenerateCoverageStats (cfg )
1916 if err != nil {
2017 fmt .Fprintf (w , "failed to generate coverage statistics: %v\n " , err )
2118 return false
2219 }
2320
24- result := Analyze (cfg , stats )
21+ err = saveCoverageBreakdown (cfg , currentStats )
22+ if err != nil {
23+ fmt .Fprintf (w , "failed to save coverage breakdown: %v\n " , err )
24+ return false
25+ }
26+
27+ baseStats , err := loadBaseCoverageBreakdown (cfg )
28+ if err != nil {
29+ fmt .Fprintf (w , "failed to load base coverage breakdown: %v\n " , err )
30+ return false
31+ }
32+
33+ result := Analyze (cfg , currentStats , baseStats )
2534
2635 report := reportForHuman (w , result )
2736
@@ -56,16 +65,53 @@ func reportForHuman(w io.Writer, result AnalyzeResult) string {
5665 return buffer .String ()
5766}
5867
59- func Analyze (cfg Config , coverageStats []coverage.Stats ) AnalyzeResult {
68+ func GenerateCoverageStats (cfg Config ) ([]coverage.Stats , error ) {
69+ return coverage .GenerateCoverageStats (coverage.Config { //nolint:wrapcheck // err wrapped above
70+ Profiles : strings .Split (cfg .Profile , "," ),
71+ LocalPrefix : cfg .LocalPrefix ,
72+ ExcludePaths : cfg .Exclude .Paths ,
73+ })
74+ }
75+
76+ func Analyze (cfg Config , current , base []coverage.Stats ) AnalyzeResult {
6077 thr := cfg .Threshold
6178 overrideRules := compileOverridePathRules (cfg )
6279
6380 return AnalyzeResult {
6481 Threshold : thr ,
65- FilesBelowThreshold : checkCoverageStatsBelowThreshold (coverageStats , thr .File , overrideRules ),
82+ FilesBelowThreshold : checkCoverageStatsBelowThreshold (current , thr .File , overrideRules ),
6683 PackagesBelowThreshold : checkCoverageStatsBelowThreshold (
67- makePackageStats (coverageStats ), thr .Package , overrideRules ,
84+ makePackageStats (current ), thr .Package , overrideRules ,
6885 ),
69- TotalStats : coverage .CalcTotalStats (coverageStats ),
86+ TotalStats : coverage .CalcTotalStats (current ),
87+ HasBaseBreakdown : len (base ) > 0 ,
88+ Diff : calculateStatsDiff (current , base ),
89+ }
90+ }
91+
92+ func saveCoverageBreakdown (cfg Config , stats []coverage.Stats ) error {
93+ if cfg .BreakdownFileName == "" {
94+ return nil
95+ }
96+
97+ //nolint:mnd,wrapcheck,gosec // relax
98+ return os .WriteFile (cfg .BreakdownFileName , coverage .SerializeStats (stats ), 0o644 )
99+ }
100+
101+ func loadBaseCoverageBreakdown (cfg Config ) ([]coverage.Stats , error ) {
102+ if cfg .Diff .BaseBreakdownFileName == "" {
103+ return nil , nil
104+ }
105+
106+ data , err := os .ReadFile (cfg .Diff .BaseBreakdownFileName )
107+ if err != nil {
108+ return nil , fmt .Errorf ("reading file content failed: %w" , err )
70109 }
110+
111+ stats , err := coverage .DeserializeStats (data )
112+ if err != nil {
113+ return nil , fmt .Errorf ("parsing file failed: %w" , err )
114+ }
115+
116+ return stats , nil
71117}
0 commit comments