mirror of
https://github.com/scratchfoundation/golangci-lint.git
synced 2025-08-06 19:39:19 -04:00
Update megacheck to the latest version
Also do following improvements: - show proper sublinter name for megacheck sublinters - refactor and make more simple and robust megacheck merging/optimizing - improve handling of unknown linter names in //nolint directives - minimize diff of our megacheck version from the upstream, https://github.com/golang/go/issues/29612 blocks usage of the upstream version - support the new `stylecheck` linter - improve tests coverage for megacheck and nolint related cases - update and use upstream versions of unparam and interfacer instead of forked ones - don't use golangci/tools repo anymore - fix newly found issues after updating linters Also should be noted that megacheck works much faster and consumes less memory in the newest release, therefore golangci-lint works noticeably faster and consumes less memory for large repos. Relates: #314
This commit is contained in:
parent
93b2d10537
commit
7705f82591
150 changed files with 17847 additions and 2006 deletions
189
test/enabled_linters_test.go
Normal file
189
test/enabled_linters_test.go
Normal file
|
@ -0,0 +1,189 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golangci/golangci-lint/pkg/lint/lintersdb"
|
||||
"github.com/golangci/golangci-lint/test/testshared"
|
||||
)
|
||||
|
||||
func inSlice(s []string, v string) bool {
|
||||
for _, sv := range s {
|
||||
if sv == v {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func getEnabledByDefaultFastLintersExcept(except ...string) []string {
|
||||
m := lintersdb.NewManager()
|
||||
ebdl := m.GetAllEnabledByDefaultLinters()
|
||||
ret := []string{}
|
||||
for _, lc := range ebdl {
|
||||
if lc.NeedsSSARepr {
|
||||
continue
|
||||
}
|
||||
|
||||
if !inSlice(except, lc.Name()) {
|
||||
ret = append(ret, lc.Name())
|
||||
}
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func getAllFastLintersWith(with ...string) []string {
|
||||
linters := lintersdb.NewManager().GetAllSupportedLinterConfigs()
|
||||
ret := append([]string{}, with...)
|
||||
for _, lc := range linters {
|
||||
if lc.NeedsSSARepr {
|
||||
continue
|
||||
}
|
||||
ret = append(ret, lc.Name())
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func getEnabledByDefaultLinters() []string {
|
||||
ebdl := lintersdb.NewManager().GetAllEnabledByDefaultLinters()
|
||||
ret := []string{}
|
||||
for _, lc := range ebdl {
|
||||
ret = append(ret, lc.Name())
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func getEnabledByDefaultFastLintersWith(with ...string) []string {
|
||||
ebdl := lintersdb.NewManager().GetAllEnabledByDefaultLinters()
|
||||
ret := append([]string{}, with...)
|
||||
for _, lc := range ebdl {
|
||||
if lc.NeedsSSARepr {
|
||||
continue
|
||||
}
|
||||
|
||||
ret = append(ret, lc.Name())
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func TestEnabledLinters(t *testing.T) {
|
||||
type tc struct {
|
||||
name string
|
||||
cfg string
|
||||
el []string
|
||||
args string
|
||||
noImplicitFast bool
|
||||
}
|
||||
|
||||
cases := []tc{
|
||||
{
|
||||
name: "disable govet in config",
|
||||
cfg: `
|
||||
linters:
|
||||
disable:
|
||||
- govet
|
||||
`,
|
||||
el: getEnabledByDefaultFastLintersExcept("govet"),
|
||||
},
|
||||
{
|
||||
name: "enable golint in config",
|
||||
cfg: `
|
||||
linters:
|
||||
enable:
|
||||
- golint
|
||||
`,
|
||||
el: getEnabledByDefaultFastLintersWith("golint"),
|
||||
},
|
||||
{
|
||||
name: "disable govet in cmd",
|
||||
args: "-Dgovet",
|
||||
el: getEnabledByDefaultFastLintersExcept("govet"),
|
||||
},
|
||||
{
|
||||
name: "enable gofmt in cmd and enable golint in config",
|
||||
args: "-Egofmt",
|
||||
cfg: `
|
||||
linters:
|
||||
enable:
|
||||
- golint
|
||||
`,
|
||||
el: getEnabledByDefaultFastLintersWith("golint", "gofmt"),
|
||||
},
|
||||
{
|
||||
name: "fast option in config",
|
||||
cfg: `
|
||||
linters:
|
||||
fast: true
|
||||
`,
|
||||
el: getEnabledByDefaultFastLintersWith(),
|
||||
noImplicitFast: true,
|
||||
},
|
||||
{
|
||||
name: "explicitly unset fast option in config",
|
||||
cfg: `
|
||||
linters:
|
||||
fast: false
|
||||
`,
|
||||
el: getEnabledByDefaultLinters(),
|
||||
noImplicitFast: true,
|
||||
},
|
||||
{
|
||||
name: "set fast option in command-line",
|
||||
args: "--fast",
|
||||
el: getEnabledByDefaultFastLintersWith(),
|
||||
noImplicitFast: true,
|
||||
},
|
||||
{
|
||||
name: "fast option in command-line has higher priority to enable",
|
||||
cfg: `
|
||||
linters:
|
||||
fast: false
|
||||
`,
|
||||
args: "--fast",
|
||||
el: getEnabledByDefaultFastLintersWith(),
|
||||
noImplicitFast: true,
|
||||
},
|
||||
{
|
||||
name: "fast option in command-line has higher priority to disable",
|
||||
cfg: `
|
||||
linters:
|
||||
fast: true
|
||||
`,
|
||||
args: "--fast=false",
|
||||
el: getEnabledByDefaultLinters(),
|
||||
noImplicitFast: true,
|
||||
},
|
||||
{
|
||||
name: "fast option combined with enable and enable-all",
|
||||
args: "--enable-all --fast --enable=staticcheck",
|
||||
el: getAllFastLintersWith("staticcheck"),
|
||||
noImplicitFast: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
c := c
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
runArgs := []string{"-v"}
|
||||
if !c.noImplicitFast {
|
||||
runArgs = append(runArgs, "--fast")
|
||||
}
|
||||
if c.args != "" {
|
||||
runArgs = append(runArgs, strings.Split(c.args, " ")...)
|
||||
}
|
||||
r := testshared.NewLintRunner(t).RunWithYamlConfig(c.cfg, runArgs...)
|
||||
sort.StringSlice(c.el).Sort()
|
||||
|
||||
expectedLine := fmt.Sprintf("Active %d linters: [%s]", len(c.el), strings.Join(c.el, " "))
|
||||
r.ExpectOutputContains(expectedLine)
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue