Skip to content

Commit

Permalink
golangci-lint(refactor): support more scenario
Browse files Browse the repository at this point in the history
CarlJi committed Jul 1, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent bb012c3 commit e6c7b98
Showing 2 changed files with 187 additions and 14 deletions.
84 changes: 70 additions & 14 deletions internal/linters/go/golangci_lint/golangci_lint.go
Original file line number Diff line number Diff line change
@@ -17,20 +17,7 @@ func init() {
}

func golangciLintHandler(log *xlog.Logger, a linters.Agent) error {
if linters.IsEmpty(a.LinterConfig.Args...) {
// refer: https://github.com/qiniu/reviewbot/issues/146
a.LinterConfig.Args = append([]string{}, "run", "--timeout=5m0s", "--allow-parallel-runners=true")
}

// recommend to use the line-number format and disable the issued lines, since these are more friendly to the reviewbot
// checking on golangci-lint 1.59.0, there is no problem even with multiple --out-format and --print-issued-lines parameters,
// so we can add these parameters directly
a.LinterConfig.Args = append(a.LinterConfig.Args, "--out-format=line-number", "--print-issued-lines=false")

if a.LinterConfig.ConfigPath != "" {
a.LinterConfig.Args = append(a.LinterConfig.Args, "--config", a.LinterConfig.ConfigPath)
}

a = args(a)
return linters.GeneralHandler(log, a, parser)
}

@@ -54,3 +41,72 @@ func parser(log *xlog.Logger, output []byte) (map[string][]linters.LinterOutput,

return linters.Parse(log, output, lineParser)
}

// args is used to set the default parameters for golangci-lint
// see: ./docs/website/docs/component/go/golangci-lint
func args(a linters.Agent) linters.Agent {
config := a.LinterConfig
if len(config.Command) == 0 || len(config.Command) > 1 || config.Command[0] != lintName {
return a
}

legacyArgs := config.Args

switch {
case len(legacyArgs) == 0:
legacyArgs = []string{}
case len(legacyArgs) > 0 && legacyArgs[0] != "run":
return a
default:
legacyArgs = legacyArgs[1:]
}

var newArgs = []string{"run"}

var (
timeoutFlag bool
parallelFlag bool
outFormatFlag bool
printFlag bool
configFlag bool
)

for _, arg := range legacyArgs {

switch {
case strings.HasPrefix(arg, "--timeout"):
timeoutFlag = true
case strings.HasPrefix(arg, "--allow-parallel-runners"):
parallelFlag = true
case strings.HasPrefix(arg, "--out-format"):
outFormatFlag = true
case strings.HasPrefix(arg, "--print-issued-lines"):
printFlag = true
case strings.HasPrefix(arg, "--config"):
configFlag = true
}

newArgs = append(newArgs, arg)
}

if !timeoutFlag {
newArgs = append(newArgs, "--timeout=5m0s")
}
if !parallelFlag {
newArgs = append(newArgs, "--allow-parallel-runners=true")
}
if !outFormatFlag {
newArgs = append(newArgs, "--out-format=line-number")
}
if !printFlag {
newArgs = append(newArgs, "--print-issued-lines=false")
}
if !configFlag && config.ConfigPath != "" {
newArgs = append(newArgs, "--config", config.ConfigPath)
}

config.Args = newArgs
a.LinterConfig = config

return a
}
117 changes: 117 additions & 0 deletions internal/linters/go/golangci_lint/golangci_lint_test.go
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import (
"reflect"
"testing"

"github.com/qiniu/reviewbot/config"
"github.com/qiniu/reviewbot/internal/linters"
"github.com/qiniu/x/xlog"
)
@@ -86,3 +87,119 @@ golangci_lint.go:16:1: warning: (gochecknoglobals)
}
}
}

func TestArgs(t *testing.T) {
tp := true
tcs := []struct {
id string
input linters.Agent
want linters.Agent
}{
{
id: "case1 - default args",
input: linters.Agent{
LinterConfig: config.Linter{
Enable: &tp,
Command: []string{"golangci-lint"},
},
},
want: linters.Agent{
LinterConfig: config.Linter{
Enable: &tp,
Command: []string{"golangci-lint"},
Args: []string{"run", "--timeout=5m0s", "--allow-parallel-runners=true", "--out-format=line-number", "--print-issued-lines=false"},
},
},
},
{
id: "case2 - custom args",
input: linters.Agent{
LinterConfig: config.Linter{
Enable: &tp,
Command: []string{"golangci-lint"},
Args: []string{"run", "--timeout=10m", "--out-format=tab", "--config", "golangci-lint.yml"},
},
},
want: linters.Agent{
LinterConfig: config.Linter{
Enable: &tp,
Command: []string{"golangci-lint"},
Args: []string{"run", "--timeout=10m", "--out-format=tab", "--config", "golangci-lint.yml", "--allow-parallel-runners=true", "--print-issued-lines=false"},
},
},
},
{
id: "case3 - custom command",
input: linters.Agent{
LinterConfig: config.Linter{
Command: []string{"bash"},
Args: []string{"run"},
},
},
want: linters.Agent{
LinterConfig: config.Linter{
Command: []string{"bash"},
Args: []string{"run"},
},
},
},
{
id: "case4 - not run command",
input: linters.Agent{
LinterConfig: config.Linter{
Command: []string{"golangci-lint"},
Args: []string{"linters"},
},
},
want: linters.Agent{
LinterConfig: config.Linter{
Command: []string{"golangci-lint"},
Args: []string{"linters"},
},
},
},
{
id: "case5 - shell command",
input: linters.Agent{
LinterConfig: config.Linter{
Command: []string{"/bin/bash", "-c", "--"},
Args: []string{"echo 'abc'", "golangci-lint run "},
},
},
want: linters.Agent{
LinterConfig: config.Linter{
Command: []string{"/bin/bash", "-c", "--"},
Args: []string{"echo 'abc'", "golangci-lint run "},
},
},
},
{
id: "case6 - custom config path",
input: linters.Agent{
LinterConfig: config.Linter{
Enable: &tp,
Command: []string{"golangci-lint"},
Args: []string{"run"},
ConfigPath: "config/golangci-lint.yml",
},
},
want: linters.Agent{
LinterConfig: config.Linter{
Enable: &tp,
Command: []string{"golangci-lint"},
Args: []string{"run", "--timeout=5m0s", "--allow-parallel-runners=true", "--out-format=line-number", "--print-issued-lines=false", "--config", "config/golangci-lint.yml"},
ConfigPath: "config/golangci-lint.yml",
},
},
},
}

for _, tc := range tcs {
t.Run(tc.id, func(t *testing.T) {
got := args(tc.input)
if !reflect.DeepEqual(got.LinterConfig, tc.want.LinterConfig) {
t.Errorf("args() = %v, want %v", got.LinterConfig, tc.want.LinterConfig)
}
})
}
}

0 comments on commit e6c7b98

Please sign in to comment.