From 3d9135248ba0ac28fae50bdfc06f4593e03fb940 Mon Sep 17 00:00:00 2001
From: Ludovic Fernandez <ldez@users.noreply.github.com>
Date: Mon, 4 Mar 2024 20:11:09 +0100
Subject: [PATCH] feat: option to not override severity from linters (#4452)

---
 .golangci.reference.yml           | 4 ++++
 pkg/config/severity.go            | 7 ++++---
 pkg/lint/runner.go                | 1 +
 pkg/result/processors/severity.go | 7 +++++++
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/.golangci.reference.yml b/.golangci.reference.yml
index 400faa6a..2144cdf9 100644
--- a/.golangci.reference.yml
+++ b/.golangci.reference.yml
@@ -2856,6 +2856,10 @@ severity:
   # Default: false
   case-sensitive: true
 
+  # Don't override severity defined by linters.
+  # Default: false
+  keep-linter-severity: true
+
   # 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 91a6503d..c707959c 100644
--- a/pkg/config/severity.go
+++ b/pkg/config/severity.go
@@ -8,9 +8,10 @@ import (
 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"`
+	Rules              []SeverityRule `mapstructure:"rules"`
+	KeepLinterSeverity bool           `mapstructure:"keep-linter-severity"` // TODO(ldez): in v2 should be changed to `Override`.
 }
 
 func (s *Severity) Validate() error {
diff --git a/pkg/lint/runner.go b/pkg/lint/runner.go
index d1a096db..150e6c7f 100644
--- a/pkg/lint/runner.go
+++ b/pkg/lint/runner.go
@@ -332,6 +332,7 @@ func getSeverityRulesProcessor(cfg *config.Severity, log logutils.Log, files *fs
 		Default:       cfg.Default,
 		Rules:         severityRules,
 		CaseSensitive: cfg.CaseSensitive,
+		Override:      !cfg.KeepLinterSeverity,
 	}
 
 	return processors.NewSeverity(log.Child(logutils.DebugKeySeverityRules), files, severityOpts)
diff --git a/pkg/result/processors/severity.go b/pkg/result/processors/severity.go
index b24fd584..fdbbe322 100644
--- a/pkg/result/processors/severity.go
+++ b/pkg/result/processors/severity.go
@@ -24,6 +24,7 @@ type SeverityOptions struct {
 	Default       string
 	Rules         []SeverityRule
 	CaseSensitive bool
+	Override      bool
 }
 
 type Severity struct {
@@ -35,6 +36,7 @@ type Severity struct {
 
 	defaultSeverity string
 	rules           []severityRule
+	override        bool
 }
 
 func NewSeverity(log logutils.Log, files *fsutils.Files, opts SeverityOptions) *Severity {
@@ -43,6 +45,7 @@ func NewSeverity(log logutils.Log, files *fsutils.Files, opts SeverityOptions) *
 		files:           files,
 		log:             log,
 		defaultSeverity: opts.Default,
+		override:        opts.Override,
 	}
 
 	prefix := "(?i)"
@@ -62,6 +65,10 @@ func (p *Severity) Process(issues []result.Issue) ([]result.Issue, error) {
 	}
 
 	return transformIssues(issues, func(i *result.Issue) *result.Issue {
+		if i.Severity != "" && !p.override {
+			return i
+		}
+
 		for _, rule := range p.rules {
 			rule := rule