From 4cd6ea01e4d90d42be79cf9812013de3442873eb Mon Sep 17 00:00:00 2001 From: Eduardo Alves Date: Sat, 2 Mar 2024 13:25:48 +0000 Subject: [PATCH] exclude linters from severity-rules --- .golangci.reference.yml | 8 ++++++ pkg/config/severity.go | 7 ++--- pkg/lint/runner.go | 8 ++++-- pkg/result/processors/severity_rules.go | 27 +++++++++++++++----- pkg/result/processors/severity_rules_test.go | 12 ++++----- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/.golangci.reference.yml b/.golangci.reference.yml index 808aea955f2d..2c4edffe1068 100644 --- a/.golangci.reference.yml +++ b/.golangci.reference.yml @@ -2892,6 +2892,14 @@ severity: # Default: false case-sensitive: true + # When a list of exclude-linters is provided, the default severity of issues will not be applied to them. + # This allows for more complex linters such as 'revive' to conserve their own severity rules. + # This takes precedence over `severity-rules`. + # + # Default: [] + exclude-linters: + - revive + # When a list of severity rules are provided, severity information will be added to lint issues. # Severity rules have the same filtering capability as exclude rules # except you are allowed to specify one matcher per severity rule. diff --git a/pkg/config/severity.go b/pkg/config/severity.go index 3068a0ed69ce..e2f2b221c238 100644 --- a/pkg/config/severity.go +++ b/pkg/config/severity.go @@ -3,9 +3,10 @@ package config const severityRuleMinConditionsCount = 1 type Severity struct { - Default string `mapstructure:"default-severity"` - CaseSensitive bool `mapstructure:"case-sensitive"` - Rules []SeverityRule `mapstructure:"rules"` + Default string `mapstructure:"default-severity"` + CaseSensitive bool `mapstructure:"case-sensitive"` + ExcludeLinters []string `mapstructure:"exclude-linters"` + Rules []SeverityRule `mapstructure:"rules"` } type SeverityRule struct { diff --git a/pkg/lint/runner.go b/pkg/lint/runner.go index e7cb17555a5b..43a0a4918b2d 100644 --- a/pkg/lint/runner.go +++ b/pkg/lint/runner.go @@ -30,7 +30,8 @@ type Runner struct { func NewRunner(cfg *config.Config, log logutils.Log, goenv *goutil.Env, es *lintersdb.EnabledSet, lineCache *fsutils.LineCache, fileCache *fsutils.FileCache, - dbManager *lintersdb.Manager, pkgs []*gopackages.Package) (*Runner, error) { + dbManager *lintersdb.Manager, pkgs []*gopackages.Package, +) (*Runner, error) { // Beware that some processors need to add the path prefix when working with paths // because they get invoked before the path prefixer (exclude and severity rules) // or process other paths (skip files). @@ -113,7 +114,8 @@ func NewRunner(cfg *config.Config, log logutils.Log, goenv *goutil.Env, } func (r *Runner) runLinterSafe(ctx context.Context, lintCtx *linter.Context, - lc *linter.Config) (ret []result.Issue, err error) { + lc *linter.Config, +) (ret []result.Issue, err error) { defer func() { if panicData := recover(); panicData != nil { if pe, ok := panicData.(*errorutil.PanicError); ok { @@ -333,6 +335,7 @@ func getSeverityRulesProcessor(cfg *config.Severity, log logutils.Log, files *fs if cfg.CaseSensitive { severityRulesProcessor = processors.NewSeverityRulesCaseSensitive( cfg.Default, + cfg.ExcludeLinters, severityRules, files, log.Child(logutils.DebugKeySeverityRules), @@ -340,6 +343,7 @@ func getSeverityRulesProcessor(cfg *config.Severity, log logutils.Log, files *fs } else { severityRulesProcessor = processors.NewSeverityRules( cfg.Default, + cfg.ExcludeLinters, severityRules, files, log.Child(logutils.DebugKeySeverityRules), diff --git a/pkg/result/processors/severity_rules.go b/pkg/result/processors/severity_rules.go index 0a4a643b7120..c5414881d3cb 100644 --- a/pkg/result/processors/severity_rules.go +++ b/pkg/result/processors/severity_rules.go @@ -2,6 +2,7 @@ package processors import ( "regexp" + "slices" "github.com/golangci/golangci-lint/pkg/fsutils" "github.com/golangci/golangci-lint/pkg/logutils" @@ -20,17 +21,22 @@ type SeverityRule struct { type SeverityRules struct { defaultSeverity string + excludedLinters []string rules []severityRule files *fsutils.Files log logutils.Log } -func NewSeverityRules(defaultSeverity string, rules []SeverityRule, files *fsutils.Files, log logutils.Log) *SeverityRules { +func NewSeverityRules(defaultSeverity string, excludedLinters []string, rules []SeverityRule, + files *fsutils.Files, log logutils.Log, +) *SeverityRules { r := &SeverityRules{ + defaultSeverity: defaultSeverity, + excludedLinters: excludedLinters, files: files, log: log, - defaultSeverity: defaultSeverity, } + r.rules = createSeverityRules(rules, "(?i)") return r @@ -61,11 +67,15 @@ func createSeverityRules(rules []SeverityRule, prefix string) []severityRule { return parsedRules } -func (p SeverityRules) Process(issues []result.Issue) ([]result.Issue, error) { +func (p *SeverityRules) Process(issues []result.Issue) ([]result.Issue, error) { if len(p.rules) == 0 && p.defaultSeverity == "" { return issues, nil } return transformIssues(issues, func(i *result.Issue) *result.Issue { + if slices.Contains(p.excludedLinters, i.FromLinter) { + return i + } + for _, rule := range p.rules { rule := rule @@ -87,19 +97,22 @@ func (p SeverityRules) Process(issues []result.Issue) ([]result.Issue, error) { func (SeverityRules) Name() string { return "severity-rules" } func (SeverityRules) Finish() {} -var _ Processor = SeverityRules{} +var _ Processor = &SeverityRules{} type SeverityRulesCaseSensitive struct { *SeverityRules } -func NewSeverityRulesCaseSensitive(defaultSeverity string, rules []SeverityRule, - files *fsutils.Files, log logutils.Log) *SeverityRulesCaseSensitive { +func NewSeverityRulesCaseSensitive(defaultSeverity string, excludedLinters []string, rules []SeverityRule, + files *fsutils.Files, log logutils.Log, +) *SeverityRulesCaseSensitive { r := &SeverityRules{ + defaultSeverity: defaultSeverity, + excludedLinters: excludedLinters, files: files, log: log, - defaultSeverity: defaultSeverity, } + r.rules = createSeverityRules(rules, "") return &SeverityRulesCaseSensitive{r} diff --git a/pkg/result/processors/severity_rules_test.go b/pkg/result/processors/severity_rules_test.go index c142524ff49b..21c654c258a1 100644 --- a/pkg/result/processors/severity_rules_test.go +++ b/pkg/result/processors/severity_rules_test.go @@ -17,7 +17,7 @@ func TestSeverityRulesMultiple(t *testing.T) { lineCache := fsutils.NewLineCache(fsutils.NewFileCache()) files := fsutils.NewFiles(lineCache, "") log := report.NewLogWrapper(logutils.NewStderrLog(logutils.DebugKeyEmpty), &report.Data{}) - p := NewSeverityRules("error", []SeverityRule{ + p := NewSeverityRules("error", []string{}, []SeverityRule{ { Severity: "info", BaseRule: BaseRule{ @@ -122,7 +122,7 @@ func TestSeverityRulesPathPrefix(t *testing.T) { pathPrefix := path.Join("some", "dir") files := fsutils.NewFiles(lineCache, pathPrefix) log := report.NewLogWrapper(logutils.NewStderrLog(logutils.DebugKeyEmpty), &report.Data{}) - p := NewSeverityRules("error", []SeverityRule{ + p := NewSeverityRules("error", []string{}, []SeverityRule{ { Severity: "info", BaseRule: BaseRule{ @@ -159,7 +159,7 @@ func TestSeverityRulesPathPrefix(t *testing.T) { } func TestSeverityRulesText(t *testing.T) { - p := NewSeverityRules("", []SeverityRule{ + p := NewSeverityRules("", []string{}, []SeverityRule{ { BaseRule: BaseRule{ Text: "^severity$", @@ -190,7 +190,7 @@ func TestSeverityRulesOnlyDefault(t *testing.T) { lineCache := fsutils.NewLineCache(fsutils.NewFileCache()) files := fsutils.NewFiles(lineCache, "") log := report.NewLogWrapper(logutils.NewStderrLog(logutils.DebugKeyEmpty), &report.Data{}) - p := NewSeverityRules("info", []SeverityRule{}, files, log) + p := NewSeverityRules("info", []string{}, []SeverityRule{}, files, log) cases := []issueTestCase{ {Path: "ssl.go", Text: "ssl", Linter: "gosec"}, @@ -219,13 +219,13 @@ func TestSeverityRulesOnlyDefault(t *testing.T) { } func TestSeverityRulesEmpty(t *testing.T) { - processAssertSame(t, NewSeverityRules("", nil, nil, nil), newIssueFromTextTestCase("test")) + processAssertSame(t, NewSeverityRules("", []string{}, nil, nil, nil), newIssueFromTextTestCase("test")) } func TestSeverityRulesCaseSensitive(t *testing.T) { lineCache := fsutils.NewLineCache(fsutils.NewFileCache()) files := fsutils.NewFiles(lineCache, "") - p := NewSeverityRulesCaseSensitive("error", []SeverityRule{ + p := NewSeverityRulesCaseSensitive("error", []string{}, []SeverityRule{ { Severity: "info", BaseRule: BaseRule{