Skip to content

Commit 393733f

Browse files
committed
implement max issues per linter limiting
1 parent 4853151 commit 393733f

File tree

11 files changed

+79
-0
lines changed

11 files changed

+79
-0
lines changed

internal/commands/run.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ func (e *Executor) initRun() {
8181
runCmd.Flags().DurationVar(&rc.Deadline, "deadline", time.Second*30, "Deadline for total work")
8282

8383
runCmd.Flags().StringSliceVarP(&rc.ExcludePatterns, "exclude", "e", config.DefaultExcludePatterns, "Exclude issue by regexp")
84+
85+
runCmd.Flags().IntVar(&rc.MaxIssuesPerLinter, "max-issues-per-linter", 50, "Maximum issues count per one linter. Set to 0 to disable")
8486
}
8587

8688
func isFullImportNeeded(linters []pkg.Linter) bool {
@@ -198,6 +200,7 @@ func (e *Executor) runAnalysis(ctx context.Context, args []string) (chan result.
198200
processors.NewExclude(fmt.Sprintf("(%s)", strings.Join(e.cfg.Run.ExcludePatterns, "|"))),
199201
processors.NewNolint(lintCtx.Program.Fset),
200202
processors.NewUniqByLine(),
203+
processors.NewMaxFromLinter(e.cfg.Run.MaxIssuesPerLinter),
201204
processors.NewPathPrettifier(),
202205
},
203206
}

pkg/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ type Run struct {
7777
ExcludePatterns []string
7878

7979
Deadline time.Duration
80+
81+
MaxIssuesPerLinter int
8082
}
8183

8284
type Config struct {

pkg/result/processors/exclude.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,5 @@ func (p Exclude) Process(issues []result.Issue) ([]result.Issue, error) {
3535
return !p.pattern.MatchString(i.Text)
3636
}), nil
3737
}
38+
39+
func (p Exclude) Finish() {}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package processors
2+
3+
import (
4+
"github.com/golangci/golangci-lint/pkg/result"
5+
"github.com/sirupsen/logrus"
6+
)
7+
8+
type MaxFromLinter struct {
9+
lc linterToCountMap
10+
limit int
11+
}
12+
13+
var _ Processor = &MaxFromLinter{}
14+
15+
func NewMaxFromLinter(limit int) *MaxFromLinter {
16+
return &MaxFromLinter{
17+
lc: linterToCountMap{},
18+
limit: limit,
19+
}
20+
}
21+
22+
func (p MaxFromLinter) Name() string {
23+
return "max_from_linter"
24+
}
25+
26+
func (p *MaxFromLinter) Process(issues []result.Issue) ([]result.Issue, error) {
27+
if p.limit <= 0 { // no limit
28+
return issues, nil
29+
}
30+
31+
return filterIssues(issues, func(i *result.Issue) bool {
32+
p.lc[i.FromLinter]++ // always inc for stat
33+
return p.lc[i.FromLinter] <= p.limit
34+
}), nil
35+
}
36+
37+
func (p MaxFromLinter) Finish() {
38+
for linter, count := range p.lc {
39+
if count > p.limit {
40+
logrus.Infof("%d/%d issues from linter %s were hidden, use --max-issues-per-linter",
41+
count-p.limit, count, linter)
42+
}
43+
}
44+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package processors
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestMaxFromLinter(t *testing.T) {
8+
p := NewMaxFromLinter(1)
9+
gosimple := newFromLinterIssue("gosimple")
10+
gofmt := newFromLinterIssue("gofmt")
11+
processAssertSame(t, p, gosimple) // ok
12+
processAssertSame(t, p, gofmt) // ok: another
13+
processAssertEmpty(t, p, gosimple) // skip
14+
}

pkg/result/processors/max_per_file_from_linter.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,5 @@ func (p *MaxPerFileFromLinter) Process(issues []result.Issue) ([]result.Issue, e
4949
return true
5050
}), nil
5151
}
52+
53+
func (p MaxPerFileFromLinter) Finish() {}

pkg/result/processors/nolint.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,5 @@ func extractFileComments(fset *token.FileSet, comments ...*ast.CommentGroup) fil
9494

9595
return ret
9696
}
97+
98+
func (p Nolint) Finish() {}

pkg/result/processors/path_prettifier.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,5 @@ func (p PathPrettifier) Process(issues []result.Issue) ([]result.Issue, error) {
4444
return newI
4545
}), nil
4646
}
47+
48+
func (p PathPrettifier) Finish() {}

pkg/result/processors/processor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ import "github.com/golangci/golangci-lint/pkg/result"
55
type Processor interface {
66
Process(issues []result.Issue) ([]result.Issue, error)
77
Name() string
8+
Finish()
89
}

pkg/result/processors/uniq_by_line.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ func (p *UniqByLine) Process(issues []result.Issue) ([]result.Issue, error) {
4141
return true
4242
}), nil
4343
}
44+
45+
func (p UniqByLine) Finish() {}

0 commit comments

Comments
 (0)