dev: cleanup config package (#1929)
* split config section into files. * extract anonymous types. * sort linters alphabetically.
This commit is contained in:
parent
12e3251a61
commit
db80e16aba
@ -1,688 +1,9 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"regexp"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
OutFormatJSON = "json"
|
|
||||||
OutFormatLineNumber = "line-number"
|
|
||||||
OutFormatColoredLineNumber = "colored-line-number"
|
|
||||||
OutFormatTab = "tab"
|
|
||||||
OutFormatCheckstyle = "checkstyle"
|
|
||||||
OutFormatCodeClimate = "code-climate"
|
|
||||||
OutFormatJunitXML = "junit-xml"
|
|
||||||
OutFormatGithubActions = "github-actions"
|
|
||||||
)
|
|
||||||
|
|
||||||
var OutFormats = []string{
|
|
||||||
OutFormatColoredLineNumber,
|
|
||||||
OutFormatLineNumber,
|
|
||||||
OutFormatJSON,
|
|
||||||
OutFormatTab,
|
|
||||||
OutFormatCheckstyle,
|
|
||||||
OutFormatCodeClimate,
|
|
||||||
OutFormatJunitXML,
|
|
||||||
OutFormatGithubActions,
|
|
||||||
}
|
|
||||||
|
|
||||||
type ExcludePattern struct {
|
|
||||||
ID string
|
|
||||||
Pattern string
|
|
||||||
Linter string
|
|
||||||
Why string
|
|
||||||
}
|
|
||||||
|
|
||||||
var DefaultExcludePatterns = []ExcludePattern{
|
|
||||||
{
|
|
||||||
ID: "EXC0001",
|
|
||||||
Pattern: "Error return value of .((os\\.)?std(out|err)\\..*|.*Close" +
|
|
||||||
"|.*Flush|os\\.Remove(All)?|.*print(f|ln)?|os\\.(Un)?Setenv). is not checked",
|
|
||||||
Linter: "errcheck",
|
|
||||||
Why: "Almost all programs ignore errors on these functions and in most cases it's ok",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0002",
|
|
||||||
Pattern: "(comment on exported (method|function|type|const)|" +
|
|
||||||
"should have( a package)? comment|comment should be of the form)",
|
|
||||||
Linter: "golint",
|
|
||||||
Why: "Annoying issue about not having a comment. The rare codebase has such comments",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0003",
|
|
||||||
Pattern: "func name will be used as test\\.Test.* by other packages, and that stutters; consider calling this",
|
|
||||||
Linter: "golint",
|
|
||||||
Why: "False positive when tests are defined in package 'test'",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0004",
|
|
||||||
Pattern: "(possible misuse of unsafe.Pointer|should have signature)",
|
|
||||||
Linter: "govet",
|
|
||||||
Why: "Common false positives",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0005",
|
|
||||||
Pattern: "ineffective break statement. Did you mean to break out of the outer loop",
|
|
||||||
Linter: "staticcheck",
|
|
||||||
Why: "Developers tend to write in C-style with an explicit 'break' in a 'switch', so it's ok to ignore",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0006",
|
|
||||||
Pattern: "Use of unsafe calls should be audited",
|
|
||||||
Linter: "gosec",
|
|
||||||
Why: "Too many false-positives on 'unsafe' usage",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0007",
|
|
||||||
Pattern: "Subprocess launch(ed with variable|ing should be audited)",
|
|
||||||
Linter: "gosec",
|
|
||||||
Why: "Too many false-positives for parametrized shell calls",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0008",
|
|
||||||
Pattern: "(G104|G307)",
|
|
||||||
Linter: "gosec",
|
|
||||||
Why: "Duplicated errcheck checks",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0009",
|
|
||||||
Pattern: "(Expect directory permissions to be 0750 or less|Expect file permissions to be 0600 or less)",
|
|
||||||
Linter: "gosec",
|
|
||||||
Why: "Too many issues in popular repos",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0010",
|
|
||||||
Pattern: "Potential file inclusion via variable",
|
|
||||||
Linter: "gosec",
|
|
||||||
Why: "False positive is triggered by 'src, err := ioutil.ReadFile(filename)'",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: "EXC0011",
|
|
||||||
Pattern: "(comment on exported (method|function|type|const)|" +
|
|
||||||
"should have( a package)? comment|comment should be of the form)",
|
|
||||||
Linter: "stylecheck",
|
|
||||||
Why: "Annoying issue about not having a comment. The rare codebase has such comments",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetDefaultExcludePatternsStrings() []string {
|
|
||||||
ret := make([]string, len(DefaultExcludePatterns))
|
|
||||||
for i, p := range DefaultExcludePatterns {
|
|
||||||
ret[i] = p.Pattern
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetExcludePatterns(include []string) []ExcludePattern {
|
|
||||||
includeMap := make(map[string]bool, len(include))
|
|
||||||
for _, inc := range include {
|
|
||||||
includeMap[inc] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret []ExcludePattern
|
|
||||||
for _, p := range DefaultExcludePatterns {
|
|
||||||
if !includeMap[p.ID] {
|
|
||||||
ret = append(ret, p)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
type Run struct {
|
|
||||||
IsVerbose bool `mapstructure:"verbose"`
|
|
||||||
Silent bool
|
|
||||||
CPUProfilePath string
|
|
||||||
MemProfilePath string
|
|
||||||
TracePath string
|
|
||||||
Concurrency int
|
|
||||||
PrintResourcesUsage bool `mapstructure:"print-resources-usage"`
|
|
||||||
|
|
||||||
Config string
|
|
||||||
NoConfig bool
|
|
||||||
|
|
||||||
Args []string
|
|
||||||
|
|
||||||
BuildTags []string `mapstructure:"build-tags"`
|
|
||||||
ModulesDownloadMode string `mapstructure:"modules-download-mode"`
|
|
||||||
|
|
||||||
ExitCodeIfIssuesFound int `mapstructure:"issues-exit-code"`
|
|
||||||
AnalyzeTests bool `mapstructure:"tests"`
|
|
||||||
|
|
||||||
// Deprecated: Deadline exists for historical compatibility
|
|
||||||
// and should not be used. To set run timeout use Timeout instead.
|
|
||||||
Deadline time.Duration
|
|
||||||
Timeout time.Duration
|
|
||||||
|
|
||||||
PrintVersion bool
|
|
||||||
SkipFiles []string `mapstructure:"skip-files"`
|
|
||||||
SkipDirs []string `mapstructure:"skip-dirs"`
|
|
||||||
UseDefaultSkipDirs bool `mapstructure:"skip-dirs-use-default"`
|
|
||||||
|
|
||||||
AllowParallelRunners bool `mapstructure:"allow-parallel-runners"`
|
|
||||||
AllowSerialRunners bool `mapstructure:"allow-serial-runners"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type LintersSettings struct {
|
|
||||||
Gci struct {
|
|
||||||
LocalPrefixes string `mapstructure:"local-prefixes"`
|
|
||||||
}
|
|
||||||
Govet GovetSettings
|
|
||||||
Golint struct {
|
|
||||||
MinConfidence float64 `mapstructure:"min-confidence"`
|
|
||||||
}
|
|
||||||
Gofmt struct {
|
|
||||||
Simplify bool
|
|
||||||
}
|
|
||||||
Goimports struct {
|
|
||||||
LocalPrefixes string `mapstructure:"local-prefixes"`
|
|
||||||
}
|
|
||||||
Gocyclo struct {
|
|
||||||
MinComplexity int `mapstructure:"min-complexity"`
|
|
||||||
}
|
|
||||||
Varcheck struct {
|
|
||||||
CheckExportedFields bool `mapstructure:"exported-fields"`
|
|
||||||
}
|
|
||||||
Structcheck struct {
|
|
||||||
CheckExportedFields bool `mapstructure:"exported-fields"`
|
|
||||||
}
|
|
||||||
Maligned struct {
|
|
||||||
SuggestNewOrder bool `mapstructure:"suggest-new"`
|
|
||||||
}
|
|
||||||
Dupl struct {
|
|
||||||
Threshold int
|
|
||||||
}
|
|
||||||
Goconst struct {
|
|
||||||
MatchWithConstants bool `mapstructure:"match-constant"`
|
|
||||||
MinStringLen int `mapstructure:"min-len"`
|
|
||||||
MinOccurrencesCount int `mapstructure:"min-occurrences"`
|
|
||||||
ParseNumbers bool `mapstructure:"numbers"`
|
|
||||||
NumberMin int `mapstructure:"min"`
|
|
||||||
NumberMax int `mapstructure:"max"`
|
|
||||||
IgnoreCalls bool `mapstructure:"ignore-calls"`
|
|
||||||
}
|
|
||||||
Gomnd struct {
|
|
||||||
Settings map[string]map[string]interface{}
|
|
||||||
}
|
|
||||||
Depguard struct {
|
|
||||||
ListType string `mapstructure:"list-type"`
|
|
||||||
Packages []string
|
|
||||||
IncludeGoRoot bool `mapstructure:"include-go-root"`
|
|
||||||
PackagesWithErrorMessage map[string]string `mapstructure:"packages-with-error-message"`
|
|
||||||
}
|
|
||||||
Misspell struct {
|
|
||||||
Locale string
|
|
||||||
IgnoreWords []string `mapstructure:"ignore-words"`
|
|
||||||
}
|
|
||||||
Unused struct {
|
|
||||||
CheckExported bool `mapstructure:"check-exported"`
|
|
||||||
}
|
|
||||||
Funlen struct {
|
|
||||||
Lines int
|
|
||||||
Statements int
|
|
||||||
}
|
|
||||||
Whitespace struct {
|
|
||||||
MultiIf bool `mapstructure:"multi-if"`
|
|
||||||
MultiFunc bool `mapstructure:"multi-func"`
|
|
||||||
}
|
|
||||||
RowsErrCheck struct {
|
|
||||||
Packages []string
|
|
||||||
}
|
|
||||||
Gomodguard struct {
|
|
||||||
Allowed struct {
|
|
||||||
Modules []string `mapstructure:"modules"`
|
|
||||||
Domains []string `mapstructure:"domains"`
|
|
||||||
} `mapstructure:"allowed"`
|
|
||||||
Blocked struct {
|
|
||||||
Modules []map[string]struct {
|
|
||||||
Recommendations []string `mapstructure:"recommendations"`
|
|
||||||
Reason string `mapstructure:"reason"`
|
|
||||||
} `mapstructure:"modules"`
|
|
||||||
Versions []map[string]struct {
|
|
||||||
Version string `mapstructure:"version"`
|
|
||||||
Reason string `mapstructure:"reason"`
|
|
||||||
} `mapstructure:"versions"`
|
|
||||||
LocalReplaceDirectives bool `mapstructure:"local_replace_directives"`
|
|
||||||
} `mapstructure:"blocked"`
|
|
||||||
}
|
|
||||||
|
|
||||||
WSL WSLSettings
|
|
||||||
Lll LllSettings
|
|
||||||
Unparam UnparamSettings
|
|
||||||
Nakedret NakedretSettings
|
|
||||||
Prealloc PreallocSettings
|
|
||||||
Errcheck ErrcheckSettings
|
|
||||||
Gocritic GocriticSettings
|
|
||||||
Godox GodoxSettings
|
|
||||||
Dogsled DogsledSettings
|
|
||||||
Gocognit GocognitSettings
|
|
||||||
Godot GodotSettings
|
|
||||||
Goheader GoHeaderSettings
|
|
||||||
Testpackage TestpackageSettings
|
|
||||||
Nestif NestifSettings
|
|
||||||
NoLintLint NoLintLintSettings
|
|
||||||
Exhaustive ExhaustiveSettings
|
|
||||||
ExhaustiveStruct ExhaustiveStructSettings
|
|
||||||
Gofumpt GofumptSettings
|
|
||||||
ErrorLint ErrorLintSettings
|
|
||||||
Makezero MakezeroSettings
|
|
||||||
Revive ReviveSettings
|
|
||||||
Thelper ThelperSettings
|
|
||||||
Forbidigo ForbidigoSettings
|
|
||||||
Ifshort IfshortSettings
|
|
||||||
Predeclared PredeclaredSettings
|
|
||||||
Cyclop Cyclop
|
|
||||||
ImportAs ImportAsSettings
|
|
||||||
GoModDirectives GoModDirectivesSettings
|
|
||||||
Promlinter PromlinterSettings
|
|
||||||
Tagliatelle TagliatelleSettings
|
|
||||||
|
|
||||||
Custom map[string]CustomLinterSettings
|
|
||||||
}
|
|
||||||
|
|
||||||
type GoHeaderSettings struct {
|
|
||||||
Values map[string]map[string]string `mapstructure:"values"`
|
|
||||||
Template string `mapstructure:"template"`
|
|
||||||
TemplatePath string `mapstructure:"template-path"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GovetSettings struct {
|
|
||||||
CheckShadowing bool `mapstructure:"check-shadowing"`
|
|
||||||
Settings map[string]map[string]interface{}
|
|
||||||
|
|
||||||
Enable []string
|
|
||||||
Disable []string
|
|
||||||
EnableAll bool `mapstructure:"enable-all"`
|
|
||||||
DisableAll bool `mapstructure:"disable-all"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cfg GovetSettings) Validate() error {
|
|
||||||
if cfg.EnableAll && cfg.DisableAll {
|
|
||||||
return errors.New("enable-all and disable-all can't be combined")
|
|
||||||
}
|
|
||||||
if cfg.EnableAll && len(cfg.Enable) != 0 {
|
|
||||||
return errors.New("enable-all and enable can't be combined")
|
|
||||||
}
|
|
||||||
if cfg.DisableAll && len(cfg.Disable) != 0 {
|
|
||||||
return errors.New("disable-all and disable can't be combined")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type ErrcheckSettings struct {
|
|
||||||
CheckTypeAssertions bool `mapstructure:"check-type-assertions"`
|
|
||||||
CheckAssignToBlank bool `mapstructure:"check-blank"`
|
|
||||||
Ignore string `mapstructure:"ignore"`
|
|
||||||
Exclude string `mapstructure:"exclude"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type LllSettings struct {
|
|
||||||
LineLength int `mapstructure:"line-length"`
|
|
||||||
TabWidth int `mapstructure:"tab-width"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type UnparamSettings struct {
|
|
||||||
CheckExported bool `mapstructure:"check-exported"`
|
|
||||||
Algo string
|
|
||||||
}
|
|
||||||
|
|
||||||
type NakedretSettings struct {
|
|
||||||
MaxFuncLines int `mapstructure:"max-func-lines"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type PreallocSettings struct {
|
|
||||||
Simple bool
|
|
||||||
RangeLoops bool `mapstructure:"range-loops"`
|
|
||||||
ForLoops bool `mapstructure:"for-loops"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GodoxSettings struct {
|
|
||||||
Keywords []string
|
|
||||||
}
|
|
||||||
|
|
||||||
type DogsledSettings struct {
|
|
||||||
MaxBlankIdentifiers int `mapstructure:"max-blank-identifiers"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GocognitSettings struct {
|
|
||||||
MinComplexity int `mapstructure:"min-complexity"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type WSLSettings struct {
|
|
||||||
StrictAppend bool `mapstructure:"strict-append"`
|
|
||||||
AllowAssignAndCallCuddle bool `mapstructure:"allow-assign-and-call"`
|
|
||||||
AllowAssignAndAnythingCuddle bool `mapstructure:"allow-assign-and-anything"`
|
|
||||||
AllowMultiLineAssignCuddle bool `mapstructure:"allow-multiline-assign"`
|
|
||||||
AllowCuddleDeclaration bool `mapstructure:"allow-cuddle-declarations"`
|
|
||||||
AllowTrailingComment bool `mapstructure:"allow-trailing-comment"`
|
|
||||||
AllowSeparatedLeadingComment bool `mapstructure:"allow-separated-leading-comment"`
|
|
||||||
ForceCuddleErrCheckAndAssign bool `mapstructure:"force-err-cuddling"`
|
|
||||||
ForceExclusiveShortDeclarations bool `mapstructure:"force-short-decl-cuddling"`
|
|
||||||
ForceCaseTrailingWhitespaceLimit int `mapstructure:"force-case-trailing-whitespace"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GodotSettings struct {
|
|
||||||
Scope string `mapstructure:"scope"`
|
|
||||||
Exclude []string `mapstructure:"exclude"`
|
|
||||||
Capital bool `mapstructure:"capital"`
|
|
||||||
|
|
||||||
// Deprecated: use `Scope` instead
|
|
||||||
CheckAll bool `mapstructure:"check-all"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type NoLintLintSettings struct {
|
|
||||||
RequireExplanation bool `mapstructure:"require-explanation"`
|
|
||||||
AllowLeadingSpace bool `mapstructure:"allow-leading-space"`
|
|
||||||
RequireSpecific bool `mapstructure:"require-specific"`
|
|
||||||
AllowNoExplanation []string `mapstructure:"allow-no-explanation"`
|
|
||||||
AllowUnused bool `mapstructure:"allow-unused"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type TestpackageSettings struct {
|
|
||||||
SkipRegexp string `mapstructure:"skip-regexp"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type NestifSettings struct {
|
|
||||||
MinComplexity int `mapstructure:"min-complexity"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ExhaustiveSettings struct {
|
|
||||||
CheckGenerated bool `mapstructure:"check-generated"`
|
|
||||||
DefaultSignifiesExhaustive bool `mapstructure:"default-signifies-exhaustive"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ExhaustiveStructSettings struct {
|
|
||||||
StructPatterns []string `mapstructure:"struct-patterns"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GofumptSettings struct {
|
|
||||||
ExtraRules bool `mapstructure:"extra-rules"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ErrorLintSettings struct {
|
|
||||||
Errorf bool `mapstructure:"errorf"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type MakezeroSettings struct {
|
|
||||||
Always bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type ReviveSettings struct {
|
|
||||||
IgnoreGeneratedHeader bool `mapstructure:"ignore-generated-header"`
|
|
||||||
Confidence float64
|
|
||||||
Severity string
|
|
||||||
Rules []struct {
|
|
||||||
Name string
|
|
||||||
Arguments []interface{}
|
|
||||||
Severity string
|
|
||||||
}
|
|
||||||
ErrorCode int `mapstructure:"error-code"`
|
|
||||||
WarningCode int `mapstructure:"warning-code"`
|
|
||||||
Directives []struct {
|
|
||||||
Name string
|
|
||||||
Severity string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type ThelperSettings struct {
|
|
||||||
Test struct {
|
|
||||||
First bool `mapstructure:"first"`
|
|
||||||
Name bool `mapstructure:"name"`
|
|
||||||
Begin bool `mapstructure:"begin"`
|
|
||||||
} `mapstructure:"test"`
|
|
||||||
Benchmark struct {
|
|
||||||
First bool `mapstructure:"first"`
|
|
||||||
Name bool `mapstructure:"name"`
|
|
||||||
Begin bool `mapstructure:"begin"`
|
|
||||||
} `mapstructure:"benchmark"`
|
|
||||||
TB struct {
|
|
||||||
First bool `mapstructure:"first"`
|
|
||||||
Name bool `mapstructure:"name"`
|
|
||||||
Begin bool `mapstructure:"begin"`
|
|
||||||
} `mapstructure:"tb"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type IfshortSettings struct {
|
|
||||||
MaxDeclLines int `mapstructure:"max-decl-lines"`
|
|
||||||
MaxDeclChars int `mapstructure:"max-decl-chars"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ForbidigoSettings struct {
|
|
||||||
Forbid []string `mapstructure:"forbid"`
|
|
||||||
ExcludeGodocExamples bool `mapstructure:"exclude-godoc-examples"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type PredeclaredSettings struct {
|
|
||||||
Ignore string `mapstructure:"ignore"`
|
|
||||||
Qualified bool `mapstructure:"q"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type PromlinterSettings struct {
|
|
||||||
Strict bool `mapstructure:"strict"`
|
|
||||||
DisabledLinters []string `mapstructure:"disabled-linters"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Cyclop struct {
|
|
||||||
MaxComplexity int `mapstructure:"max-complexity"`
|
|
||||||
PackageAverage float64 `mapstructure:"package-average"`
|
|
||||||
SkipTests bool `mapstructure:"skip-tests"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ImportAsSettings map[string]string
|
|
||||||
|
|
||||||
type GoModDirectivesSettings struct {
|
|
||||||
ReplaceAllowList []string `mapstructure:"replace-allow-list"`
|
|
||||||
ReplaceLocal bool `mapstructure:"replace-local"`
|
|
||||||
ExcludeForbidden bool `mapstructure:"exclude-forbidden"`
|
|
||||||
RetractAllowNoExplanation bool `mapstructure:"retract-allow-no-explanation"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type TagliatelleSettings struct {
|
|
||||||
Case struct {
|
|
||||||
Rules map[string]string
|
|
||||||
UseFieldName bool `mapstructure:"use-field-name"`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultLintersSettings = LintersSettings{
|
|
||||||
Lll: LllSettings{
|
|
||||||
LineLength: 120,
|
|
||||||
TabWidth: 1,
|
|
||||||
},
|
|
||||||
Unparam: UnparamSettings{
|
|
||||||
Algo: "cha",
|
|
||||||
},
|
|
||||||
Nakedret: NakedretSettings{
|
|
||||||
MaxFuncLines: 30,
|
|
||||||
},
|
|
||||||
Prealloc: PreallocSettings{
|
|
||||||
Simple: true,
|
|
||||||
RangeLoops: true,
|
|
||||||
ForLoops: false,
|
|
||||||
},
|
|
||||||
Gocritic: GocriticSettings{
|
|
||||||
SettingsPerCheck: map[string]GocriticCheckSettings{},
|
|
||||||
},
|
|
||||||
Godox: GodoxSettings{
|
|
||||||
Keywords: []string{},
|
|
||||||
},
|
|
||||||
Dogsled: DogsledSettings{
|
|
||||||
MaxBlankIdentifiers: 2,
|
|
||||||
},
|
|
||||||
Gocognit: GocognitSettings{
|
|
||||||
MinComplexity: 30,
|
|
||||||
},
|
|
||||||
WSL: WSLSettings{
|
|
||||||
StrictAppend: true,
|
|
||||||
AllowAssignAndCallCuddle: true,
|
|
||||||
AllowAssignAndAnythingCuddle: false,
|
|
||||||
AllowMultiLineAssignCuddle: true,
|
|
||||||
AllowCuddleDeclaration: false,
|
|
||||||
AllowTrailingComment: false,
|
|
||||||
AllowSeparatedLeadingComment: false,
|
|
||||||
ForceCuddleErrCheckAndAssign: false,
|
|
||||||
ForceExclusiveShortDeclarations: false,
|
|
||||||
ForceCaseTrailingWhitespaceLimit: 0,
|
|
||||||
},
|
|
||||||
NoLintLint: NoLintLintSettings{
|
|
||||||
RequireExplanation: false,
|
|
||||||
AllowLeadingSpace: true,
|
|
||||||
RequireSpecific: false,
|
|
||||||
AllowUnused: false,
|
|
||||||
},
|
|
||||||
Testpackage: TestpackageSettings{
|
|
||||||
SkipRegexp: `(export|internal)_test\.go`,
|
|
||||||
},
|
|
||||||
Nestif: NestifSettings{
|
|
||||||
MinComplexity: 5,
|
|
||||||
},
|
|
||||||
Exhaustive: ExhaustiveSettings{
|
|
||||||
CheckGenerated: false,
|
|
||||||
DefaultSignifiesExhaustive: false,
|
|
||||||
},
|
|
||||||
Gofumpt: GofumptSettings{
|
|
||||||
ExtraRules: false,
|
|
||||||
},
|
|
||||||
ErrorLint: ErrorLintSettings{
|
|
||||||
Errorf: true,
|
|
||||||
},
|
|
||||||
Ifshort: IfshortSettings{
|
|
||||||
MaxDeclLines: 1,
|
|
||||||
MaxDeclChars: 30,
|
|
||||||
},
|
|
||||||
Predeclared: PredeclaredSettings{
|
|
||||||
Ignore: "",
|
|
||||||
Qualified: false,
|
|
||||||
},
|
|
||||||
Forbidigo: ForbidigoSettings{
|
|
||||||
ExcludeGodocExamples: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
type CustomLinterSettings struct {
|
|
||||||
Path string
|
|
||||||
Description string
|
|
||||||
OriginalURL string `mapstructure:"original-url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Linters struct {
|
|
||||||
Enable []string
|
|
||||||
Disable []string
|
|
||||||
EnableAll bool `mapstructure:"enable-all"`
|
|
||||||
DisableAll bool `mapstructure:"disable-all"`
|
|
||||||
Fast bool
|
|
||||||
|
|
||||||
Presets []string
|
|
||||||
}
|
|
||||||
|
|
||||||
type BaseRule struct {
|
|
||||||
Linters []string
|
|
||||||
Path string
|
|
||||||
Text string
|
|
||||||
Source string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b BaseRule) Validate(minConditionsCount int) error {
|
|
||||||
if err := validateOptionalRegex(b.Path); err != nil {
|
|
||||||
return fmt.Errorf("invalid path regex: %v", err)
|
|
||||||
}
|
|
||||||
if err := validateOptionalRegex(b.Text); err != nil {
|
|
||||||
return fmt.Errorf("invalid text regex: %v", err)
|
|
||||||
}
|
|
||||||
if err := validateOptionalRegex(b.Source); err != nil {
|
|
||||||
return fmt.Errorf("invalid source regex: %v", err)
|
|
||||||
}
|
|
||||||
nonBlank := 0
|
|
||||||
if len(b.Linters) > 0 {
|
|
||||||
nonBlank++
|
|
||||||
}
|
|
||||||
if b.Path != "" {
|
|
||||||
nonBlank++
|
|
||||||
}
|
|
||||||
if b.Text != "" {
|
|
||||||
nonBlank++
|
|
||||||
}
|
|
||||||
if b.Source != "" {
|
|
||||||
nonBlank++
|
|
||||||
}
|
|
||||||
if nonBlank < minConditionsCount {
|
|
||||||
return fmt.Errorf("at least %d of (text, source, path, linters) should be set", minConditionsCount)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const excludeRuleMinConditionsCount = 2
|
|
||||||
|
|
||||||
type ExcludeRule struct {
|
|
||||||
BaseRule `mapstructure:",squash"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateOptionalRegex(value string) error {
|
|
||||||
if value == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
_, err := regexp.Compile(value)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e ExcludeRule) Validate() error {
|
|
||||||
return e.BaseRule.Validate(excludeRuleMinConditionsCount)
|
|
||||||
}
|
|
||||||
|
|
||||||
const severityRuleMinConditionsCount = 1
|
|
||||||
|
|
||||||
type SeverityRule struct {
|
|
||||||
BaseRule `mapstructure:",squash"`
|
|
||||||
Severity string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SeverityRule) Validate() error {
|
|
||||||
return s.BaseRule.Validate(severityRuleMinConditionsCount)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Issues struct {
|
|
||||||
IncludeDefaultExcludes []string `mapstructure:"include"`
|
|
||||||
ExcludeCaseSensitive bool `mapstructure:"exclude-case-sensitive"`
|
|
||||||
ExcludePatterns []string `mapstructure:"exclude"`
|
|
||||||
ExcludeRules []ExcludeRule `mapstructure:"exclude-rules"`
|
|
||||||
UseDefaultExcludes bool `mapstructure:"exclude-use-default"`
|
|
||||||
|
|
||||||
MaxIssuesPerLinter int `mapstructure:"max-issues-per-linter"`
|
|
||||||
MaxSameIssues int `mapstructure:"max-same-issues"`
|
|
||||||
|
|
||||||
DiffFromRevision string `mapstructure:"new-from-rev"`
|
|
||||||
DiffPatchFilePath string `mapstructure:"new-from-patch"`
|
|
||||||
Diff bool `mapstructure:"new"`
|
|
||||||
|
|
||||||
NeedFix bool `mapstructure:"fix"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Severity struct {
|
|
||||||
Default string `mapstructure:"default-severity"`
|
|
||||||
CaseSensitive bool `mapstructure:"case-sensitive"`
|
|
||||||
Rules []SeverityRule `mapstructure:"rules"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Version struct {
|
|
||||||
Format string `mapstructure:"format"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Run Run
|
Run Run
|
||||||
|
|
||||||
Output struct {
|
Output Output
|
||||||
Format string
|
|
||||||
Color string
|
|
||||||
PrintIssuedLine bool `mapstructure:"print-issued-lines"`
|
|
||||||
PrintLinterName bool `mapstructure:"print-linter-name"`
|
|
||||||
UniqByLine bool `mapstructure:"uniq-by-line"`
|
|
||||||
SortResults bool `mapstructure:"sort-results"`
|
|
||||||
PrintWelcomeMessage bool `mapstructure:"print-welcome"`
|
|
||||||
PathPrefix string `mapstructure:"path-prefix"`
|
|
||||||
}
|
|
||||||
|
|
||||||
LintersSettings LintersSettings `mapstructure:"linters-settings"`
|
LintersSettings LintersSettings `mapstructure:"linters-settings"`
|
||||||
Linters Linters
|
Linters Linters
|
||||||
@ -699,3 +20,7 @@ func NewDefault() *Config {
|
|||||||
LintersSettings: defaultLintersSettings,
|
LintersSettings: defaultLintersSettings,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Version struct {
|
||||||
|
Format string `mapstructure:"format"`
|
||||||
|
}
|
||||||
|
180
pkg/config/issues.go
Normal file
180
pkg/config/issues.go
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
const excludeRuleMinConditionsCount = 2
|
||||||
|
|
||||||
|
var DefaultExcludePatterns = []ExcludePattern{
|
||||||
|
{
|
||||||
|
ID: "EXC0001",
|
||||||
|
Pattern: "Error return value of .((os\\.)?std(out|err)\\..*|.*Close" +
|
||||||
|
"|.*Flush|os\\.Remove(All)?|.*print(f|ln)?|os\\.(Un)?Setenv). is not checked",
|
||||||
|
Linter: "errcheck",
|
||||||
|
Why: "Almost all programs ignore errors on these functions and in most cases it's ok",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0002",
|
||||||
|
Pattern: "(comment on exported (method|function|type|const)|" +
|
||||||
|
"should have( a package)? comment|comment should be of the form)",
|
||||||
|
Linter: "golint",
|
||||||
|
Why: "Annoying issue about not having a comment. The rare codebase has such comments",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0003",
|
||||||
|
Pattern: "func name will be used as test\\.Test.* by other packages, and that stutters; consider calling this",
|
||||||
|
Linter: "golint",
|
||||||
|
Why: "False positive when tests are defined in package 'test'",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0004",
|
||||||
|
Pattern: "(possible misuse of unsafe.Pointer|should have signature)",
|
||||||
|
Linter: "govet",
|
||||||
|
Why: "Common false positives",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0005",
|
||||||
|
Pattern: "ineffective break statement. Did you mean to break out of the outer loop",
|
||||||
|
Linter: "staticcheck",
|
||||||
|
Why: "Developers tend to write in C-style with an explicit 'break' in a 'switch', so it's ok to ignore",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0006",
|
||||||
|
Pattern: "Use of unsafe calls should be audited",
|
||||||
|
Linter: "gosec",
|
||||||
|
Why: "Too many false-positives on 'unsafe' usage",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0007",
|
||||||
|
Pattern: "Subprocess launch(ed with variable|ing should be audited)",
|
||||||
|
Linter: "gosec",
|
||||||
|
Why: "Too many false-positives for parametrized shell calls",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0008",
|
||||||
|
Pattern: "(G104|G307)",
|
||||||
|
Linter: "gosec",
|
||||||
|
Why: "Duplicated errcheck checks",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0009",
|
||||||
|
Pattern: "(Expect directory permissions to be 0750 or less|Expect file permissions to be 0600 or less)",
|
||||||
|
Linter: "gosec",
|
||||||
|
Why: "Too many issues in popular repos",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0010",
|
||||||
|
Pattern: "Potential file inclusion via variable",
|
||||||
|
Linter: "gosec",
|
||||||
|
Why: "False positive is triggered by 'src, err := ioutil.ReadFile(filename)'",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "EXC0011",
|
||||||
|
Pattern: "(comment on exported (method|function|type|const)|" +
|
||||||
|
"should have( a package)? comment|comment should be of the form)",
|
||||||
|
Linter: "stylecheck",
|
||||||
|
Why: "Annoying issue about not having a comment. The rare codebase has such comments",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
type Issues struct {
|
||||||
|
IncludeDefaultExcludes []string `mapstructure:"include"`
|
||||||
|
ExcludeCaseSensitive bool `mapstructure:"exclude-case-sensitive"`
|
||||||
|
ExcludePatterns []string `mapstructure:"exclude"`
|
||||||
|
ExcludeRules []ExcludeRule `mapstructure:"exclude-rules"`
|
||||||
|
UseDefaultExcludes bool `mapstructure:"exclude-use-default"`
|
||||||
|
|
||||||
|
MaxIssuesPerLinter int `mapstructure:"max-issues-per-linter"`
|
||||||
|
MaxSameIssues int `mapstructure:"max-same-issues"`
|
||||||
|
|
||||||
|
DiffFromRevision string `mapstructure:"new-from-rev"`
|
||||||
|
DiffPatchFilePath string `mapstructure:"new-from-patch"`
|
||||||
|
Diff bool `mapstructure:"new"`
|
||||||
|
|
||||||
|
NeedFix bool `mapstructure:"fix"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExcludeRule struct {
|
||||||
|
BaseRule `mapstructure:",squash"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ExcludeRule) Validate() error {
|
||||||
|
return e.BaseRule.Validate(excludeRuleMinConditionsCount)
|
||||||
|
}
|
||||||
|
|
||||||
|
type BaseRule struct {
|
||||||
|
Linters []string
|
||||||
|
Path string
|
||||||
|
Text string
|
||||||
|
Source string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BaseRule) Validate(minConditionsCount int) error {
|
||||||
|
if err := validateOptionalRegex(b.Path); err != nil {
|
||||||
|
return fmt.Errorf("invalid path regex: %v", err)
|
||||||
|
}
|
||||||
|
if err := validateOptionalRegex(b.Text); err != nil {
|
||||||
|
return fmt.Errorf("invalid text regex: %v", err)
|
||||||
|
}
|
||||||
|
if err := validateOptionalRegex(b.Source); err != nil {
|
||||||
|
return fmt.Errorf("invalid source regex: %v", err)
|
||||||
|
}
|
||||||
|
nonBlank := 0
|
||||||
|
if len(b.Linters) > 0 {
|
||||||
|
nonBlank++
|
||||||
|
}
|
||||||
|
if b.Path != "" {
|
||||||
|
nonBlank++
|
||||||
|
}
|
||||||
|
if b.Text != "" {
|
||||||
|
nonBlank++
|
||||||
|
}
|
||||||
|
if b.Source != "" {
|
||||||
|
nonBlank++
|
||||||
|
}
|
||||||
|
if nonBlank < minConditionsCount {
|
||||||
|
return fmt.Errorf("at least %d of (text, source, path, linters) should be set", minConditionsCount)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateOptionalRegex(value string) error {
|
||||||
|
if value == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
_, err := regexp.Compile(value)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExcludePattern struct {
|
||||||
|
ID string
|
||||||
|
Pattern string
|
||||||
|
Linter string
|
||||||
|
Why string
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetDefaultExcludePatternsStrings() []string {
|
||||||
|
ret := make([]string, len(DefaultExcludePatterns))
|
||||||
|
for i, p := range DefaultExcludePatterns {
|
||||||
|
ret[i] = p.Pattern
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetExcludePatterns(include []string) []ExcludePattern {
|
||||||
|
includeMap := make(map[string]bool, len(include))
|
||||||
|
for _, inc := range include {
|
||||||
|
includeMap[inc] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
var ret []ExcludePattern
|
||||||
|
for _, p := range DefaultExcludePatterns {
|
||||||
|
if !includeMap[p.ID] {
|
||||||
|
ret = append(ret, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
11
pkg/config/linters.go
Normal file
11
pkg/config/linters.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type Linters struct {
|
||||||
|
Enable []string
|
||||||
|
Disable []string
|
||||||
|
EnableAll bool `mapstructure:"enable-all"`
|
||||||
|
DisableAll bool `mapstructure:"disable-all"`
|
||||||
|
Fast bool
|
||||||
|
|
||||||
|
Presets []string
|
||||||
|
}
|
440
pkg/config/linters_settings.go
Normal file
440
pkg/config/linters_settings.go
Normal file
@ -0,0 +1,440 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import "github.com/pkg/errors"
|
||||||
|
|
||||||
|
var defaultLintersSettings = LintersSettings{
|
||||||
|
Lll: LllSettings{
|
||||||
|
LineLength: 120,
|
||||||
|
TabWidth: 1,
|
||||||
|
},
|
||||||
|
Unparam: UnparamSettings{
|
||||||
|
Algo: "cha",
|
||||||
|
},
|
||||||
|
Nakedret: NakedretSettings{
|
||||||
|
MaxFuncLines: 30,
|
||||||
|
},
|
||||||
|
Prealloc: PreallocSettings{
|
||||||
|
Simple: true,
|
||||||
|
RangeLoops: true,
|
||||||
|
ForLoops: false,
|
||||||
|
},
|
||||||
|
Gocritic: GocriticSettings{
|
||||||
|
SettingsPerCheck: map[string]GocriticCheckSettings{},
|
||||||
|
},
|
||||||
|
Godox: GodoxSettings{
|
||||||
|
Keywords: []string{},
|
||||||
|
},
|
||||||
|
Dogsled: DogsledSettings{
|
||||||
|
MaxBlankIdentifiers: 2,
|
||||||
|
},
|
||||||
|
Gocognit: GocognitSettings{
|
||||||
|
MinComplexity: 30,
|
||||||
|
},
|
||||||
|
WSL: WSLSettings{
|
||||||
|
StrictAppend: true,
|
||||||
|
AllowAssignAndCallCuddle: true,
|
||||||
|
AllowAssignAndAnythingCuddle: false,
|
||||||
|
AllowMultiLineAssignCuddle: true,
|
||||||
|
AllowCuddleDeclaration: false,
|
||||||
|
AllowTrailingComment: false,
|
||||||
|
AllowSeparatedLeadingComment: false,
|
||||||
|
ForceCuddleErrCheckAndAssign: false,
|
||||||
|
ForceExclusiveShortDeclarations: false,
|
||||||
|
ForceCaseTrailingWhitespaceLimit: 0,
|
||||||
|
},
|
||||||
|
NoLintLint: NoLintLintSettings{
|
||||||
|
RequireExplanation: false,
|
||||||
|
AllowLeadingSpace: true,
|
||||||
|
RequireSpecific: false,
|
||||||
|
AllowUnused: false,
|
||||||
|
},
|
||||||
|
Testpackage: TestpackageSettings{
|
||||||
|
SkipRegexp: `(export|internal)_test\.go`,
|
||||||
|
},
|
||||||
|
Nestif: NestifSettings{
|
||||||
|
MinComplexity: 5,
|
||||||
|
},
|
||||||
|
Exhaustive: ExhaustiveSettings{
|
||||||
|
CheckGenerated: false,
|
||||||
|
DefaultSignifiesExhaustive: false,
|
||||||
|
},
|
||||||
|
Gofumpt: GofumptSettings{
|
||||||
|
ExtraRules: false,
|
||||||
|
},
|
||||||
|
ErrorLint: ErrorLintSettings{
|
||||||
|
Errorf: true,
|
||||||
|
},
|
||||||
|
Ifshort: IfshortSettings{
|
||||||
|
MaxDeclLines: 1,
|
||||||
|
MaxDeclChars: 30,
|
||||||
|
},
|
||||||
|
Predeclared: PredeclaredSettings{
|
||||||
|
Ignore: "",
|
||||||
|
Qualified: false,
|
||||||
|
},
|
||||||
|
Forbidigo: ForbidigoSettings{
|
||||||
|
ExcludeGodocExamples: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
type LintersSettings struct {
|
||||||
|
Cyclop Cyclop
|
||||||
|
Depguard DepGuardSettings
|
||||||
|
Dogsled DogsledSettings
|
||||||
|
Dupl DuplSettings
|
||||||
|
Errcheck ErrcheckSettings
|
||||||
|
ErrorLint ErrorLintSettings
|
||||||
|
Exhaustive ExhaustiveSettings
|
||||||
|
ExhaustiveStruct ExhaustiveStructSettings
|
||||||
|
Forbidigo ForbidigoSettings
|
||||||
|
Funlen FunlenSettings
|
||||||
|
Gci GciSettings
|
||||||
|
Gocognit GocognitSettings
|
||||||
|
Goconst GoConstSettings
|
||||||
|
Gocritic GocriticSettings
|
||||||
|
Gocyclo GoCycloSettings
|
||||||
|
Godot GodotSettings
|
||||||
|
Godox GodoxSettings
|
||||||
|
Gofmt GoFmtSettings
|
||||||
|
Gofumpt GofumptSettings
|
||||||
|
Goheader GoHeaderSettings
|
||||||
|
Goimports GoImportsSettings
|
||||||
|
Golint GoLintSettings
|
||||||
|
Gomnd GoMndSettings
|
||||||
|
GoModDirectives GoModDirectivesSettings
|
||||||
|
Gomodguard GoModGuardSettings
|
||||||
|
Govet GovetSettings
|
||||||
|
Ifshort IfshortSettings
|
||||||
|
ImportAs ImportAsSettings
|
||||||
|
Lll LllSettings
|
||||||
|
Makezero MakezeroSettings
|
||||||
|
Maligned MalignedSettings
|
||||||
|
Misspell MisspellSettings
|
||||||
|
Nakedret NakedretSettings
|
||||||
|
Nestif NestifSettings
|
||||||
|
NoLintLint NoLintLintSettings
|
||||||
|
Prealloc PreallocSettings
|
||||||
|
Predeclared PredeclaredSettings
|
||||||
|
Promlinter PromlinterSettings
|
||||||
|
Revive ReviveSettings
|
||||||
|
RowsErrCheck RowsErrCheckSettings
|
||||||
|
Structcheck StructCheckSettings
|
||||||
|
Tagliatelle TagliatelleSettings
|
||||||
|
Testpackage TestpackageSettings
|
||||||
|
Thelper ThelperSettings
|
||||||
|
Unparam UnparamSettings
|
||||||
|
Unused UnusedSettings
|
||||||
|
Varcheck VarCheckSettings
|
||||||
|
Whitespace WhitespaceSettings
|
||||||
|
WSL WSLSettings
|
||||||
|
|
||||||
|
Custom map[string]CustomLinterSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
type Cyclop struct {
|
||||||
|
MaxComplexity int `mapstructure:"max-complexity"`
|
||||||
|
PackageAverage float64 `mapstructure:"package-average"`
|
||||||
|
SkipTests bool `mapstructure:"skip-tests"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DepGuardSettings struct {
|
||||||
|
ListType string `mapstructure:"list-type"`
|
||||||
|
Packages []string
|
||||||
|
IncludeGoRoot bool `mapstructure:"include-go-root"`
|
||||||
|
PackagesWithErrorMessage map[string]string `mapstructure:"packages-with-error-message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DogsledSettings struct {
|
||||||
|
MaxBlankIdentifiers int `mapstructure:"max-blank-identifiers"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DuplSettings struct {
|
||||||
|
Threshold int
|
||||||
|
}
|
||||||
|
|
||||||
|
type ErrcheckSettings struct {
|
||||||
|
CheckTypeAssertions bool `mapstructure:"check-type-assertions"`
|
||||||
|
CheckAssignToBlank bool `mapstructure:"check-blank"`
|
||||||
|
Ignore string `mapstructure:"ignore"`
|
||||||
|
Exclude string `mapstructure:"exclude"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ErrorLintSettings struct {
|
||||||
|
Errorf bool `mapstructure:"errorf"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExhaustiveSettings struct {
|
||||||
|
CheckGenerated bool `mapstructure:"check-generated"`
|
||||||
|
DefaultSignifiesExhaustive bool `mapstructure:"default-signifies-exhaustive"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExhaustiveStructSettings struct {
|
||||||
|
StructPatterns []string `mapstructure:"struct-patterns"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ForbidigoSettings struct {
|
||||||
|
Forbid []string `mapstructure:"forbid"`
|
||||||
|
ExcludeGodocExamples bool `mapstructure:"exclude-godoc-examples"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FunlenSettings struct {
|
||||||
|
Lines int
|
||||||
|
Statements int
|
||||||
|
}
|
||||||
|
|
||||||
|
type GciSettings struct {
|
||||||
|
LocalPrefixes string `mapstructure:"local-prefixes"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GocognitSettings struct {
|
||||||
|
MinComplexity int `mapstructure:"min-complexity"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoConstSettings struct {
|
||||||
|
MatchWithConstants bool `mapstructure:"match-constant"`
|
||||||
|
MinStringLen int `mapstructure:"min-len"`
|
||||||
|
MinOccurrencesCount int `mapstructure:"min-occurrences"`
|
||||||
|
ParseNumbers bool `mapstructure:"numbers"`
|
||||||
|
NumberMin int `mapstructure:"min"`
|
||||||
|
NumberMax int `mapstructure:"max"`
|
||||||
|
IgnoreCalls bool `mapstructure:"ignore-calls"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoCycloSettings struct {
|
||||||
|
MinComplexity int `mapstructure:"min-complexity"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GodotSettings struct {
|
||||||
|
Scope string `mapstructure:"scope"`
|
||||||
|
Exclude []string `mapstructure:"exclude"`
|
||||||
|
Capital bool `mapstructure:"capital"`
|
||||||
|
|
||||||
|
// Deprecated: use `Scope` instead
|
||||||
|
CheckAll bool `mapstructure:"check-all"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GodoxSettings struct {
|
||||||
|
Keywords []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoFmtSettings struct {
|
||||||
|
Simplify bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type GofumptSettings struct {
|
||||||
|
ExtraRules bool `mapstructure:"extra-rules"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoHeaderSettings struct {
|
||||||
|
Values map[string]map[string]string `mapstructure:"values"`
|
||||||
|
Template string `mapstructure:"template"`
|
||||||
|
TemplatePath string `mapstructure:"template-path"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoImportsSettings struct {
|
||||||
|
LocalPrefixes string `mapstructure:"local-prefixes"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoLintSettings struct {
|
||||||
|
MinConfidence float64 `mapstructure:"min-confidence"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoMndSettings struct {
|
||||||
|
Settings map[string]map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoModDirectivesSettings struct {
|
||||||
|
ReplaceAllowList []string `mapstructure:"replace-allow-list"`
|
||||||
|
ReplaceLocal bool `mapstructure:"replace-local"`
|
||||||
|
ExcludeForbidden bool `mapstructure:"exclude-forbidden"`
|
||||||
|
RetractAllowNoExplanation bool `mapstructure:"retract-allow-no-explanation"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoModGuardSettings struct {
|
||||||
|
Allowed struct {
|
||||||
|
Modules []string `mapstructure:"modules"`
|
||||||
|
Domains []string `mapstructure:"domains"`
|
||||||
|
} `mapstructure:"allowed"`
|
||||||
|
Blocked struct {
|
||||||
|
Modules []map[string]struct {
|
||||||
|
Recommendations []string `mapstructure:"recommendations"`
|
||||||
|
Reason string `mapstructure:"reason"`
|
||||||
|
} `mapstructure:"modules"`
|
||||||
|
Versions []map[string]struct {
|
||||||
|
Version string `mapstructure:"version"`
|
||||||
|
Reason string `mapstructure:"reason"`
|
||||||
|
} `mapstructure:"versions"`
|
||||||
|
LocalReplaceDirectives bool `mapstructure:"local_replace_directives"`
|
||||||
|
} `mapstructure:"blocked"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GovetSettings struct {
|
||||||
|
CheckShadowing bool `mapstructure:"check-shadowing"`
|
||||||
|
Settings map[string]map[string]interface{}
|
||||||
|
|
||||||
|
Enable []string
|
||||||
|
Disable []string
|
||||||
|
EnableAll bool `mapstructure:"enable-all"`
|
||||||
|
DisableAll bool `mapstructure:"disable-all"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg GovetSettings) Validate() error {
|
||||||
|
if cfg.EnableAll && cfg.DisableAll {
|
||||||
|
return errors.New("enable-all and disable-all can't be combined")
|
||||||
|
}
|
||||||
|
if cfg.EnableAll && len(cfg.Enable) != 0 {
|
||||||
|
return errors.New("enable-all and enable can't be combined")
|
||||||
|
}
|
||||||
|
if cfg.DisableAll && len(cfg.Disable) != 0 {
|
||||||
|
return errors.New("disable-all and disable can't be combined")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type IfshortSettings struct {
|
||||||
|
MaxDeclLines int `mapstructure:"max-decl-lines"`
|
||||||
|
MaxDeclChars int `mapstructure:"max-decl-chars"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImportAsSettings map[string]string
|
||||||
|
|
||||||
|
type LllSettings struct {
|
||||||
|
LineLength int `mapstructure:"line-length"`
|
||||||
|
TabWidth int `mapstructure:"tab-width"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MakezeroSettings struct {
|
||||||
|
Always bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type MalignedSettings struct {
|
||||||
|
SuggestNewOrder bool `mapstructure:"suggest-new"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MisspellSettings struct {
|
||||||
|
Locale string
|
||||||
|
IgnoreWords []string `mapstructure:"ignore-words"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NakedretSettings struct {
|
||||||
|
MaxFuncLines int `mapstructure:"max-func-lines"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NestifSettings struct {
|
||||||
|
MinComplexity int `mapstructure:"min-complexity"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NoLintLintSettings struct {
|
||||||
|
RequireExplanation bool `mapstructure:"require-explanation"`
|
||||||
|
AllowLeadingSpace bool `mapstructure:"allow-leading-space"`
|
||||||
|
RequireSpecific bool `mapstructure:"require-specific"`
|
||||||
|
AllowNoExplanation []string `mapstructure:"allow-no-explanation"`
|
||||||
|
AllowUnused bool `mapstructure:"allow-unused"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PreallocSettings struct {
|
||||||
|
Simple bool
|
||||||
|
RangeLoops bool `mapstructure:"range-loops"`
|
||||||
|
ForLoops bool `mapstructure:"for-loops"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PredeclaredSettings struct {
|
||||||
|
Ignore string `mapstructure:"ignore"`
|
||||||
|
Qualified bool `mapstructure:"q"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PromlinterSettings struct {
|
||||||
|
Strict bool `mapstructure:"strict"`
|
||||||
|
DisabledLinters []string `mapstructure:"disabled-linters"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReviveSettings struct {
|
||||||
|
IgnoreGeneratedHeader bool `mapstructure:"ignore-generated-header"`
|
||||||
|
Confidence float64
|
||||||
|
Severity string
|
||||||
|
Rules []struct {
|
||||||
|
Name string
|
||||||
|
Arguments []interface{}
|
||||||
|
Severity string
|
||||||
|
}
|
||||||
|
ErrorCode int `mapstructure:"error-code"`
|
||||||
|
WarningCode int `mapstructure:"warning-code"`
|
||||||
|
Directives []struct {
|
||||||
|
Name string
|
||||||
|
Severity string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type RowsErrCheckSettings struct {
|
||||||
|
Packages []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type StructCheckSettings struct {
|
||||||
|
CheckExportedFields bool `mapstructure:"exported-fields"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TagliatelleSettings struct {
|
||||||
|
Case struct {
|
||||||
|
Rules map[string]string
|
||||||
|
UseFieldName bool `mapstructure:"use-field-name"`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestpackageSettings struct {
|
||||||
|
SkipRegexp string `mapstructure:"skip-regexp"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ThelperSettings struct {
|
||||||
|
Test struct {
|
||||||
|
First bool `mapstructure:"first"`
|
||||||
|
Name bool `mapstructure:"name"`
|
||||||
|
Begin bool `mapstructure:"begin"`
|
||||||
|
} `mapstructure:"test"`
|
||||||
|
Benchmark struct {
|
||||||
|
First bool `mapstructure:"first"`
|
||||||
|
Name bool `mapstructure:"name"`
|
||||||
|
Begin bool `mapstructure:"begin"`
|
||||||
|
} `mapstructure:"benchmark"`
|
||||||
|
TB struct {
|
||||||
|
First bool `mapstructure:"first"`
|
||||||
|
Name bool `mapstructure:"name"`
|
||||||
|
Begin bool `mapstructure:"begin"`
|
||||||
|
} `mapstructure:"tb"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnparamSettings struct {
|
||||||
|
CheckExported bool `mapstructure:"check-exported"`
|
||||||
|
Algo string
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnusedSettings struct {
|
||||||
|
CheckExported bool `mapstructure:"check-exported"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type VarCheckSettings struct {
|
||||||
|
CheckExportedFields bool `mapstructure:"exported-fields"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WhitespaceSettings struct {
|
||||||
|
MultiIf bool `mapstructure:"multi-if"`
|
||||||
|
MultiFunc bool `mapstructure:"multi-func"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WSLSettings struct {
|
||||||
|
StrictAppend bool `mapstructure:"strict-append"`
|
||||||
|
AllowAssignAndCallCuddle bool `mapstructure:"allow-assign-and-call"`
|
||||||
|
AllowAssignAndAnythingCuddle bool `mapstructure:"allow-assign-and-anything"`
|
||||||
|
AllowMultiLineAssignCuddle bool `mapstructure:"allow-multiline-assign"`
|
||||||
|
AllowCuddleDeclaration bool `mapstructure:"allow-cuddle-declarations"`
|
||||||
|
AllowTrailingComment bool `mapstructure:"allow-trailing-comment"`
|
||||||
|
AllowSeparatedLeadingComment bool `mapstructure:"allow-separated-leading-comment"`
|
||||||
|
ForceCuddleErrCheckAndAssign bool `mapstructure:"force-err-cuddling"`
|
||||||
|
ForceExclusiveShortDeclarations bool `mapstructure:"force-short-decl-cuddling"`
|
||||||
|
ForceCaseTrailingWhitespaceLimit int `mapstructure:"force-case-trailing-whitespace"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CustomLinterSettings struct {
|
||||||
|
Path string
|
||||||
|
Description string
|
||||||
|
OriginalURL string `mapstructure:"original-url"`
|
||||||
|
}
|
34
pkg/config/output.go
Normal file
34
pkg/config/output.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
const (
|
||||||
|
OutFormatJSON = "json"
|
||||||
|
OutFormatLineNumber = "line-number"
|
||||||
|
OutFormatColoredLineNumber = "colored-line-number"
|
||||||
|
OutFormatTab = "tab"
|
||||||
|
OutFormatCheckstyle = "checkstyle"
|
||||||
|
OutFormatCodeClimate = "code-climate"
|
||||||
|
OutFormatJunitXML = "junit-xml"
|
||||||
|
OutFormatGithubActions = "github-actions"
|
||||||
|
)
|
||||||
|
|
||||||
|
var OutFormats = []string{
|
||||||
|
OutFormatColoredLineNumber,
|
||||||
|
OutFormatLineNumber,
|
||||||
|
OutFormatJSON,
|
||||||
|
OutFormatTab,
|
||||||
|
OutFormatCheckstyle,
|
||||||
|
OutFormatCodeClimate,
|
||||||
|
OutFormatJunitXML,
|
||||||
|
OutFormatGithubActions,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Output struct {
|
||||||
|
Format string
|
||||||
|
Color string
|
||||||
|
PrintIssuedLine bool `mapstructure:"print-issued-lines"`
|
||||||
|
PrintLinterName bool `mapstructure:"print-linter-name"`
|
||||||
|
UniqByLine bool `mapstructure:"uniq-by-line"`
|
||||||
|
SortResults bool `mapstructure:"sort-results"`
|
||||||
|
PrintWelcomeMessage bool `mapstructure:"print-welcome"`
|
||||||
|
PathPrefix string `mapstructure:"path-prefix"`
|
||||||
|
}
|
37
pkg/config/run.go
Normal file
37
pkg/config/run.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type Run struct {
|
||||||
|
IsVerbose bool `mapstructure:"verbose"`
|
||||||
|
Silent bool
|
||||||
|
CPUProfilePath string
|
||||||
|
MemProfilePath string
|
||||||
|
TracePath string
|
||||||
|
Concurrency int
|
||||||
|
PrintResourcesUsage bool `mapstructure:"print-resources-usage"`
|
||||||
|
|
||||||
|
Config string
|
||||||
|
NoConfig bool
|
||||||
|
|
||||||
|
Args []string
|
||||||
|
|
||||||
|
BuildTags []string `mapstructure:"build-tags"`
|
||||||
|
ModulesDownloadMode string `mapstructure:"modules-download-mode"`
|
||||||
|
|
||||||
|
ExitCodeIfIssuesFound int `mapstructure:"issues-exit-code"`
|
||||||
|
AnalyzeTests bool `mapstructure:"tests"`
|
||||||
|
|
||||||
|
// Deprecated: Deadline exists for historical compatibility
|
||||||
|
// and should not be used. To set run timeout use Timeout instead.
|
||||||
|
Deadline time.Duration
|
||||||
|
Timeout time.Duration
|
||||||
|
|
||||||
|
PrintVersion bool
|
||||||
|
SkipFiles []string `mapstructure:"skip-files"`
|
||||||
|
SkipDirs []string `mapstructure:"skip-dirs"`
|
||||||
|
UseDefaultSkipDirs bool `mapstructure:"skip-dirs-use-default"`
|
||||||
|
|
||||||
|
AllowParallelRunners bool `mapstructure:"allow-parallel-runners"`
|
||||||
|
AllowSerialRunners bool `mapstructure:"allow-serial-runners"`
|
||||||
|
}
|
18
pkg/config/severity.go
Normal file
18
pkg/config/severity.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
const severityRuleMinConditionsCount = 1
|
||||||
|
|
||||||
|
type Severity struct {
|
||||||
|
Default string `mapstructure:"default-severity"`
|
||||||
|
CaseSensitive bool `mapstructure:"case-sensitive"`
|
||||||
|
Rules []SeverityRule `mapstructure:"rules"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SeverityRule struct {
|
||||||
|
BaseRule `mapstructure:",squash"`
|
||||||
|
Severity string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SeverityRule) Validate() error {
|
||||||
|
return s.BaseRule.Validate(severityRuleMinConditionsCount)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user