Skip to content

Commit

Permalink
Merge pull request #323 from k1LoW/coverage.exclude
Browse files Browse the repository at this point in the history
Support coverage.exclude: for excluding files from coverage reports
  • Loading branch information
k1LoW authored Feb 8, 2024
2 parents fcd4191 + 4a2ef03 commit 108950a
Show file tree
Hide file tree
Showing 12 changed files with 284 additions and 11 deletions.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,17 @@ coverage:
- tests/coverage.xml
```

### `coverage.exclude:`

Exclude files from the coverage report.

``` yaml
coverage:
exclude:
- 'cmd/*.go'
- 'proto/**/*.pb.go'
```

### `coverage.acceptable:`

acceptable coverage condition.
Expand Down
4 changes: 2 additions & 2 deletions cmd/badge.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ import (
"strings"
"time"

"github.com/k1LoW/octocov/badge"
"github.com/k1LoW/octocov/config"
"github.com/k1LoW/octocov/internal"
"github.com/k1LoW/octocov/badge"
"github.com/k1LoW/octocov/report"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -85,7 +85,7 @@ var badgeCmd = &cobra.Command{
if err := c.CoverageConfigReady(); err != nil {
return err
}
if err := r.MeasureCoverage(c.Coverage.Paths); err != nil {
if err := r.MeasureCoverage(c.Coverage.Paths, c.Coverage.Exclude); err != nil {
return err
}
cp := r.CoveragePercent()
Expand Down
2 changes: 1 addition & 1 deletion cmd/dump.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ var dumpCmd = &cobra.Command{
if err := c.CoverageConfigReady(); err != nil {
cmd.PrintErrf("Skip measuring code coverage: %v\n", err)
} else {
if err := r.MeasureCoverage(c.Coverage.Paths); err != nil {
if err := r.MeasureCoverage(c.Coverage.Paths, c.Coverage.Exclude); err != nil {
cmd.PrintErrf("Skip measuring code coverage: %v\n", err)
}
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/lsFiles.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ var lsFilesCmd = &cobra.Command{
if err != nil {
return err
}
if err := r.MeasureCoverage(c.Coverage.Paths); err != nil {
if err := r.MeasureCoverage(c.Coverage.Paths, c.Coverage.Exclude); err != nil {
return err
}
t := 0
Expand Down
6 changes: 3 additions & 3 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ var rootCmd = &cobra.Command{
if err := c.CoverageConfigReady(); err != nil {
cmd.PrintErrf("Skip measuring code coverage: %v\n", err)
} else {
if err := r.MeasureCoverage(c.Coverage.Paths); err != nil {
if err := r.MeasureCoverage(c.Coverage.Paths, c.Coverage.Exclude); err != nil {
cmd.PrintErrf("Skip measuring code coverage: %v\n", err)
}
}
Expand Down Expand Up @@ -358,7 +358,7 @@ var rootCmd = &cobra.Command{
if err != nil {
return err
}
if err := rt.MeasureCoverage([]string{c.Diff.Path}); err == nil {
if err := rt.MeasureCoverage([]string{c.Diff.Path}, c.Coverage.Exclude); err == nil {
if rPrev == nil || rPrev.Timestamp.UnixNano() < rt.Timestamp.UnixNano() {
rPrev = rt
}
Expand Down Expand Up @@ -508,7 +508,7 @@ func printMetrics(cmd *cobra.Command) error {
}

if err := c.CoverageConfigReady(); err == nil {
if err := r.MeasureCoverage(c.Coverage.Paths); err != nil {
if err := r.MeasureCoverage(c.Coverage.Paths, c.Coverage.Exclude); err != nil {
cmd.PrintErrf("Skip measuring code coverage: %v\n", err)
}
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ var viewCmd = &cobra.Command{
if err != nil {
return err
}
if err := r.MeasureCoverage(c.Coverage.Paths); err != nil {
if err := r.MeasureCoverage(c.Coverage.Paths, c.Coverage.Exclude); err != nil {
return err
}
for _, f := range args {
Expand Down
1 change: 1 addition & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ type Config struct {
type Coverage struct {
Path string `yaml:"path,omitempty"`
Paths []string `yaml:"paths,omitempty"`
Exclude []string `yaml:"exclude,omitempty"`
Badge CoverageBadge `yaml:"badge,omitempty"`
Acceptable string `yaml:"acceptable,omitempty"`
If string `yaml:"if,omitempty"`
Expand Down
43 changes: 43 additions & 0 deletions coverage/exclude.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package coverage

import (
"strings"

"github.com/bmatcuk/doublestar/v4"
)

func (c *Coverage) Exclude(exclude []string) error {
if len(exclude) == 0 {
return c.reCalc()
}

// Exclude files
var files FileCoverages
for i, f := range c.Files {
excluded := false
for _, e := range exclude {
not := false
if strings.HasPrefix(e, "!") {
e = strings.TrimPrefix(e, "!")
not = true
}
match, err := doublestar.Match(e, f.File)
if err != nil {
return err
}
if match {
if not {
excluded = false
} else {
excluded = true
}
}
}
if !excluded {
files = append(files, c.Files[i])
}
}
c.Files = files

return c.reCalc()
}
210 changes: 210 additions & 0 deletions coverage/exclude_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
package coverage

import (
"testing"

"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
)

func TestExclude(t *testing.T) {
tests := []struct {
c *Coverage
exclude []string
want *Coverage
}{
{
&Coverage{
Type: TypeLOC,
Files: FileCoverages{
&FileCoverage{
File: "file_a.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 1),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 0),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
&FileCoverage{
File: "file_b.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 0),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 1),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
},
},
[]string{},
&Coverage{
Type: TypeLOC,
Total: 6,
Covered: 4,
Files: FileCoverages{
&FileCoverage{
File: "file_a.go",
Total: 3,
Covered: 2,
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 1),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 0),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
&FileCoverage{
File: "file_b.go",
Total: 3,
Covered: 2,
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 0),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 1),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
},
},
},
{
&Coverage{
Type: TypeLOC,
Files: FileCoverages{
&FileCoverage{
File: "file_a.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 1),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 0),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
&FileCoverage{
File: "file_b.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 0),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 1),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
},
},
[]string{
"file_a.go",
},
&Coverage{
Type: TypeLOC,
Total: 3,
Covered: 2,
Files: FileCoverages{
&FileCoverage{
File: "file_b.go",
Total: 3,
Covered: 2,
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 0),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 1),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
},
},
},
{
&Coverage{
Type: TypeLOC,
Files: FileCoverages{
&FileCoverage{
File: "file_a.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 1),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 0),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
&FileCoverage{
File: "file_b.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 0),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 1),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
},
},
[]string{
"file_*.go",
},
&Coverage{
Type: TypeLOC,
Total: 0,
Covered: 0,
Files: nil,
},
},
{
&Coverage{
Type: TypeLOC,
Files: FileCoverages{
&FileCoverage{
File: "file_a.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 1),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 0),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
&FileCoverage{
File: "file_b.go",
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 0),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 1),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
},
},
[]string{
"file_*.go",
"!**/*.go",
},
&Coverage{
Type: TypeLOC,
Total: 6,
Covered: 4,
Files: FileCoverages{
&FileCoverage{
File: "file_a.go",
Total: 3,
Covered: 2,
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 1),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 0),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
&FileCoverage{
File: "file_b.go",
Total: 3,
Covered: 2,
Blocks: BlockCoverages{
newBlockCoverage(TypeLOC, 1, -1, 1, -1, -1, 0),
newBlockCoverage(TypeLOC, 2, -1, 2, -1, -1, 1),
newBlockCoverage(TypeLOC, 3, -1, 3, -1, -1, 1),
},
},
},
},
},
}
for _, tt := range tests {
if err := tt.c.Exclude(tt.exclude); err != nil {
t.Fatal(err)
}
got := tt.c

opts := []cmp.Option{
cmpopts.IgnoreUnexported(FileCoverage{}),
}
if diff := cmp.Diff(tt.want, got, opts...); diff != "" {
t.Error(diff)
}
}
}
5 changes: 4 additions & 1 deletion coverage/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ func (c *Coverage) Merge(c2 *Coverage) error {
c.Files = append(c.Files, fc2)
}
}
// Recalculate
return c.reCalc()
}

func (c *Coverage) reCalc() error {
total := 0
covered := 0
for _, f := range c.Files {
Expand Down
7 changes: 6 additions & 1 deletion report/report.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ func (r *Report) Load(path string) error {
return nil
}

func (r *Report) MeasureCoverage(paths []string) error {
func (r *Report) MeasureCoverage(paths, exclude []string) error {
if len(paths) == 0 {
return fmt.Errorf("coverage report not found: %s", paths)
}
Expand Down Expand Up @@ -333,6 +333,11 @@ func (r *Report) MeasureCoverage(paths []string) error {
return cerr
}

if err := r.Coverage.Exclude(exclude); err != nil {
cerr = multierror.Append(cerr, err)
return cerr
}

return nil
}

Expand Down
2 changes: 1 addition & 1 deletion report/report_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ func TestMeasureCoverage(t *testing.T) {
}
for _, tt := range tests {
r := &Report{}
if err := r.MeasureCoverage(tt.paths); err != nil {
if err := r.MeasureCoverage(tt.paths, nil); err != nil {
if !tt.wantErr {
t.Error(err)
}
Expand Down

0 comments on commit 108950a

Please sign in to comment.