mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-13 13:55:41 +00:00
Merge pull request #118502 from pohly/golangci-lint-hints
golangci-lint: suppress one issue, demote others to "hints"
This commit is contained in:
commit
a5ebc9d519
11
cmd/gotemplate/OWNERS
Normal file
11
cmd/gotemplate/OWNERS
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# See the OWNERS docs at https://go.k8s.io/owners
|
||||||
|
|
||||||
|
reviewers:
|
||||||
|
- bentheelder
|
||||||
|
- dims
|
||||||
|
- pohly
|
||||||
|
approvers:
|
||||||
|
- dims
|
||||||
|
- pohly
|
||||||
|
labels:
|
||||||
|
- sig/testing
|
97
cmd/gotemplate/gotemplate.go
Normal file
97
cmd/gotemplate/gotemplate.go
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2023 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"text/template"
|
||||||
|
)
|
||||||
|
|
||||||
|
// gotemplate is a simple CLI for text/template. It reads from stdin and writes to stdout.
|
||||||
|
// Optional arguments are <key>=<value> pairs which can be used as {{.<key>}} to inject
|
||||||
|
// the <value> for that key.
|
||||||
|
//
|
||||||
|
// Besides the default functions (https://pkg.go.dev/text/template#hdr-Functions),
|
||||||
|
// gotemplate also implements:
|
||||||
|
// - include <filename>: returns the content of that file as string
|
||||||
|
// - indent <number of spaces> <string>: replace each newline with "newline + spaces", indent the newline at the end
|
||||||
|
// - trim <string>: strip leading and trailing whitespace
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
kvs := make(map[string]string)
|
||||||
|
|
||||||
|
for _, keyValue := range os.Args[1:] {
|
||||||
|
index := strings.Index(keyValue, "=")
|
||||||
|
if index <= 0 {
|
||||||
|
fmt.Fprintf(os.Stderr, "optional arguments must be of the form <key>=<value>, got instead: %q\n", keyValue)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
kvs[keyValue[0:index]] = keyValue[index+1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := generate(os.Stdin, os.Stdout, kvs); err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func generate(in io.Reader, out io.Writer, data interface{}) error {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if _, err := buf.ReadFrom(in); err != nil {
|
||||||
|
return fmt.Errorf("reading input: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
funcMap := template.FuncMap{
|
||||||
|
"include": include,
|
||||||
|
"indent": indent,
|
||||||
|
"trim": trim,
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpl, err := template.New("").Funcs(funcMap).Parse(buf.String())
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parsing input as text template: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tmpl.Execute(out, data); err != nil {
|
||||||
|
return fmt.Errorf("generating result: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func include(filename string) (string, error) {
|
||||||
|
content, err := os.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(content), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func indent(numSpaces int, content string) string {
|
||||||
|
if content == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
prefix := strings.Repeat(" ", numSpaces)
|
||||||
|
return strings.ReplaceAll(content, "\n", "\n"+prefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
func trim(content string) string {
|
||||||
|
return strings.TrimSpace(content)
|
||||||
|
}
|
108
cmd/gotemplate/gotemplate_test.go
Normal file
108
cmd/gotemplate/gotemplate_test.go
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2021 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGenerate(t *testing.T) {
|
||||||
|
for name, tt := range map[string]struct {
|
||||||
|
in string
|
||||||
|
data map[string]string
|
||||||
|
files map[string]string
|
||||||
|
expected string
|
||||||
|
expectedErr string
|
||||||
|
}{
|
||||||
|
"missing-file": {
|
||||||
|
in: `{{include "no-such-file.txt"}}`,
|
||||||
|
expectedErr: "open no-such-file.txt: no such file or directory",
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
in: `{{.Hello}} {{.World}}`,
|
||||||
|
data: map[string]string{"Hello": "world", "World": "hello"},
|
||||||
|
expected: "world hello",
|
||||||
|
},
|
||||||
|
"include": {
|
||||||
|
in: `{{include "test.txt" | indent 2}}`,
|
||||||
|
files: map[string]string{"test.txt": "hello\nworld"},
|
||||||
|
expected: "hello\n world",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
tmp := t.TempDir()
|
||||||
|
for fileName, fileContent := range tt.files {
|
||||||
|
err := os.WriteFile(path.Join(tmp, fileName), []byte(fileContent), 0666)
|
||||||
|
require.NoError(t, err, "create input file")
|
||||||
|
}
|
||||||
|
defer os.Chdir(cwd)
|
||||||
|
require.NoError(t, os.Chdir(tmp), "change into tmp directory")
|
||||||
|
in := strings.NewReader(tt.in)
|
||||||
|
var out bytes.Buffer
|
||||||
|
err := generate(in, &out, tt.data)
|
||||||
|
if tt.expectedErr == "" {
|
||||||
|
require.NoError(t, err, "expand template")
|
||||||
|
require.Equal(t, tt.expected, out.String())
|
||||||
|
} else {
|
||||||
|
require.Contains(t, err.Error(), tt.expectedErr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIndent(t *testing.T) {
|
||||||
|
for name, tt := range map[string]struct {
|
||||||
|
numSpaces int
|
||||||
|
content string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
"empty": {
|
||||||
|
numSpaces: 10,
|
||||||
|
content: "",
|
||||||
|
expected: "",
|
||||||
|
},
|
||||||
|
"trailing-newline": {
|
||||||
|
numSpaces: 2,
|
||||||
|
content: "hello\nworld\n",
|
||||||
|
expected: "hello\n world\n ",
|
||||||
|
},
|
||||||
|
"no-trailing-newline": {
|
||||||
|
numSpaces: 1,
|
||||||
|
content: "hello\nworld",
|
||||||
|
expected: "hello\n world",
|
||||||
|
},
|
||||||
|
"zero-indent": {
|
||||||
|
numSpaces: 0,
|
||||||
|
content: "hello\nworld",
|
||||||
|
expected: "hello\nworld",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
assert.Equal(t, tt.expected, indent(tt.numSpaces, tt.content))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
91
hack/golangci-hints.yaml
Normal file
91
hack/golangci-hints.yaml
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# golangci-lint is used in Kubernetes with different configurations that
|
||||||
|
# enable an increasing amount of checks:
|
||||||
|
# - golangci.yaml is the most permissive configuration. All existing code
|
||||||
|
# passed.
|
||||||
|
# - golangci-strict.yaml adds checks that all new code in pull requests
|
||||||
|
# must pass.
|
||||||
|
# - golangci-hints.yaml adds checks for code patterns where developer
|
||||||
|
# and reviewer may decide whether findings should get addressed before
|
||||||
|
# merging. Beware that the golangci-lint output includes also the
|
||||||
|
# issues that must be fixed and doesn't indicate how severe each issue
|
||||||
|
# is (https://gophers.slack.com/archives/CS0TBRKPC/p1685721815275349).
|
||||||
|
#
|
||||||
|
# All three flavors are generated from golangci.yaml.in with
|
||||||
|
# hack/update-golangci-lint-config.sh.
|
||||||
|
|
||||||
|
run:
|
||||||
|
timeout: 30m
|
||||||
|
skip-files:
|
||||||
|
- "^zz_generated.*"
|
||||||
|
|
||||||
|
output:
|
||||||
|
sort-results: true
|
||||||
|
|
||||||
|
issues:
|
||||||
|
max-issues-per-linter: 0
|
||||||
|
max-same-issues: 0
|
||||||
|
# Excluding configuration per-path, per-linter, per-text and per-source
|
||||||
|
exclude-rules:
|
||||||
|
# exclude ineffassign linter for generated files for conversion
|
||||||
|
- path: conversion\.go
|
||||||
|
linters:
|
||||||
|
- ineffassign
|
||||||
|
|
||||||
|
# SSA Extract calls are allowed in tests.
|
||||||
|
- linters:
|
||||||
|
- forbidigo
|
||||||
|
text: should not be used because managedFields was removed
|
||||||
|
path: _test.go$
|
||||||
|
|
||||||
|
# The Kubernetes naming convention for conversion functions uses underscores
|
||||||
|
# and intentionally deviates from normal Go conventions to make those function
|
||||||
|
# names more readable. Same for SetDefaults_*.
|
||||||
|
#
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507028627
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1514201592
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1003: should not use underscores in Go names; func (Convert_.*_To_.*|SetDefaults_)"
|
||||||
|
|
||||||
|
# This check currently has some false positives (https://github.com/nunnatsa/ginkgolinter/issues/91).
|
||||||
|
- linters:
|
||||||
|
- ginkgolinter
|
||||||
|
text: use a function call in (Eventually|Consistently)
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507012435
|
||||||
|
- linters:
|
||||||
|
- gocritic
|
||||||
|
text: "ifElseChain: rewrite if-else to switch statement"
|
||||||
|
|
||||||
|
linters:
|
||||||
|
disable-all: false
|
||||||
|
enable: # please keep this alphabetized
|
||||||
|
- forbidigo
|
||||||
|
- ginkgolinter
|
||||||
|
- gocritic
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
|
- logcheck
|
||||||
|
- staticcheck
|
||||||
|
- stylecheck
|
||||||
|
- unused
|
||||||
|
|
||||||
|
linters-settings: # please keep this alphabetized
|
||||||
|
custom:
|
||||||
|
logcheck:
|
||||||
|
# Installed there by hack/verify-golangci-lint.sh.
|
||||||
|
path: ../_output/local/bin/logcheck.so
|
||||||
|
description: structured logging checker
|
||||||
|
original-url: k8s.io/logtools/logcheck
|
||||||
|
forbidigo:
|
||||||
|
analyze-types: true
|
||||||
|
forbid:
|
||||||
|
- p: ^managedfields\.ExtractInto$
|
||||||
|
pkg: ^k8s\.io/apimachinery/pkg/util/managedfields$
|
||||||
|
msg: should not be used because managedFields was removed
|
||||||
|
- p: \.Extract
|
||||||
|
pkg: ^k8s\.io/client-go/applyconfigurations/
|
||||||
|
msg: should not be used because managedFields was removed
|
||||||
|
staticcheck:
|
||||||
|
checks:
|
||||||
|
- "all"
|
@ -1,13 +1,28 @@
|
|||||||
# This file configures checks that all new code for Kubernetes is meant to
|
# golangci-lint is used in Kubernetes with different configurations that
|
||||||
# pass, in contrast to .golangci.yaml which defines checks that also the
|
# enable an increasing amount of checks:
|
||||||
# existing code passes.
|
# - golangci.yaml is the most permissive configuration. All existing code
|
||||||
|
# passed.
|
||||||
|
# - golangci-strict.yaml adds checks that all new code in pull requests
|
||||||
|
# must pass.
|
||||||
|
# - golangci-hints.yaml adds checks for code patterns where developer
|
||||||
|
# and reviewer may decide whether findings should get addressed before
|
||||||
|
# merging. Beware that the golangci-lint output includes also the
|
||||||
|
# issues that must be fixed and doesn't indicate how severe each issue
|
||||||
|
# is (https://gophers.slack.com/archives/CS0TBRKPC/p1685721815275349).
|
||||||
|
#
|
||||||
|
# All three flavors are generated from golangci.yaml.in with
|
||||||
|
# hack/update-golangci-lint-config.sh.
|
||||||
|
|
||||||
run:
|
run:
|
||||||
timeout: 30m
|
timeout: 30m
|
||||||
skip-files:
|
skip-files:
|
||||||
- "^zz_generated.*"
|
- "^zz_generated.*"
|
||||||
|
|
||||||
|
output:
|
||||||
|
sort-results: true
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
|
max-issues-per-linter: 0
|
||||||
max-same-issues: 0
|
max-same-issues: 0
|
||||||
# Excluding configuration per-path, per-linter, per-text and per-source
|
# Excluding configuration per-path, per-linter, per-text and per-source
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
@ -15,25 +30,72 @@ issues:
|
|||||||
- path: conversion\.go
|
- path: conversion\.go
|
||||||
linters:
|
linters:
|
||||||
- ineffassign
|
- ineffassign
|
||||||
|
|
||||||
|
# SSA Extract calls are allowed in tests.
|
||||||
|
- linters:
|
||||||
|
- forbidigo
|
||||||
|
text: should not be used because managedFields was removed
|
||||||
|
path: _test.go$
|
||||||
|
|
||||||
# The Kubernetes naming convention for conversion functions uses underscores
|
# The Kubernetes naming convention for conversion functions uses underscores
|
||||||
# and intentionally deviates from normal Go conventions to make those function
|
# and intentionally deviates from normal Go conventions to make those function
|
||||||
# names more readable. Same for SetDefaults_*.
|
# names more readable. Same for SetDefaults_*.
|
||||||
|
#
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507028627
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1514201592
|
||||||
- linters:
|
- linters:
|
||||||
- stylecheck
|
- stylecheck
|
||||||
text: "ST1003: should not use underscores in Go names; func (Convert_.*_To_.*|SetDefaults_)"
|
text: "ST1003: should not use underscores in Go names; func (Convert_.*_To_.*|SetDefaults_)"
|
||||||
|
|
||||||
# This check currently has some false positives (https://github.com/nunnatsa/ginkgolinter/issues/91).
|
# This check currently has some false positives (https://github.com/nunnatsa/ginkgolinter/issues/91).
|
||||||
- linters:
|
- linters:
|
||||||
- ginkgolinter
|
- ginkgolinter
|
||||||
text: use a function call in (Eventually|Consistently)
|
text: use a function call in (Eventually|Consistently)
|
||||||
# SSA Extract calls are allowed in tests.
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507012435
|
||||||
- linters:
|
- linters:
|
||||||
- forbidigo
|
- gocritic
|
||||||
text: should not be used because managedFields was removed
|
text: "ifElseChain: rewrite if-else to switch statement"
|
||||||
path: _test.go$
|
|
||||||
|
# The following issues were deemed "might be worth fixing, needs to be
|
||||||
|
# decided on a case-by-case basis". This was initially decided by a
|
||||||
|
# majority of the developers who voted in
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288 and may evolve
|
||||||
|
# over time.
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507008918
|
||||||
|
- linters:
|
||||||
|
- gocritic
|
||||||
|
text: "assignOp:"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507016854
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1002: should omit comparison to bool constant"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507023980
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1016: should convert opts .* instead of using struct literal"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507026758
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1033: unnecessary guard around call to delete"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507030071
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1012: error var .* should have name of the form ErrFoo"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507031224
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1023: should omit type .* from declaration; it will be inferred from the right-hand side"
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
disable-all: false # in contrast to golangci.yaml, the default set of linters remains enabled
|
disable-all: false
|
||||||
enable: # please keep this alphabetized and in sync with golangci.yaml
|
enable: # please keep this alphabetized
|
||||||
- forbidigo
|
- forbidigo
|
||||||
- ginkgolinter
|
- ginkgolinter
|
||||||
- gocritic
|
- gocritic
|
||||||
@ -43,6 +105,9 @@ linters:
|
|||||||
- staticcheck
|
- staticcheck
|
||||||
- stylecheck
|
- stylecheck
|
||||||
- unused
|
- unused
|
||||||
|
disable:
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507008359
|
||||||
|
- errcheck
|
||||||
|
|
||||||
linters-settings: # please keep this alphabetized
|
linters-settings: # please keep this alphabetized
|
||||||
custom:
|
custom:
|
||||||
@ -60,8 +125,6 @@ linters-settings: # please keep this alphabetized
|
|||||||
- p: \.Extract
|
- p: \.Extract
|
||||||
pkg: ^k8s\.io/client-go/applyconfigurations/
|
pkg: ^k8s\.io/client-go/applyconfigurations/
|
||||||
msg: should not be used because managedFields was removed
|
msg: should not be used because managedFields was removed
|
||||||
gocritic:
|
|
||||||
staticcheck:
|
staticcheck:
|
||||||
checks:
|
checks:
|
||||||
- "all"
|
- "all"
|
||||||
stylecheck:
|
|
||||||
|
@ -1,9 +1,28 @@
|
|||||||
|
# golangci-lint is used in Kubernetes with different configurations that
|
||||||
|
# enable an increasing amount of checks:
|
||||||
|
# - golangci.yaml is the most permissive configuration. All existing code
|
||||||
|
# passed.
|
||||||
|
# - golangci-strict.yaml adds checks that all new code in pull requests
|
||||||
|
# must pass.
|
||||||
|
# - golangci-hints.yaml adds checks for code patterns where developer
|
||||||
|
# and reviewer may decide whether findings should get addressed before
|
||||||
|
# merging. Beware that the golangci-lint output includes also the
|
||||||
|
# issues that must be fixed and doesn't indicate how severe each issue
|
||||||
|
# is (https://gophers.slack.com/archives/CS0TBRKPC/p1685721815275349).
|
||||||
|
#
|
||||||
|
# All three flavors are generated from golangci.yaml.in with
|
||||||
|
# hack/update-golangci-lint-config.sh.
|
||||||
|
|
||||||
run:
|
run:
|
||||||
timeout: 30m
|
timeout: 30m
|
||||||
skip-files:
|
skip-files:
|
||||||
- "^zz_generated.*"
|
- "^zz_generated.*"
|
||||||
|
|
||||||
|
output:
|
||||||
|
sort-results: true
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
|
max-issues-per-linter: 0
|
||||||
max-same-issues: 0
|
max-same-issues: 0
|
||||||
# Excluding configuration per-path, per-linter, per-text and per-source
|
# Excluding configuration per-path, per-linter, per-text and per-source
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
@ -11,30 +30,78 @@ issues:
|
|||||||
- path: conversion\.go
|
- path: conversion\.go
|
||||||
linters:
|
linters:
|
||||||
- ineffassign
|
- ineffassign
|
||||||
|
|
||||||
|
# SSA Extract calls are allowed in tests.
|
||||||
|
- linters:
|
||||||
|
- forbidigo
|
||||||
|
text: should not be used because managedFields was removed
|
||||||
|
path: _test.go$
|
||||||
|
|
||||||
# TODO(oscr) Remove these excluded directories and fix findings. Due to large amount of findings in different components
|
# TODO(oscr) Remove these excluded directories and fix findings. Due to large amount of findings in different components
|
||||||
# with different owners it's hard to fix everything in a single pr. This will therefore be done in multiple prs.
|
# with different owners it's hard to fix everything in a single pr. This will therefore be done in multiple prs.
|
||||||
- path: (pkg/volume/*|test/*|azure/*|pkg/cmd/wait*|request/bearertoken/*|metrics/*|filters/*) # not in golangci-strict.yaml
|
- path: (pkg/volume/*|test/*|azure/*|pkg/cmd/wait*|request/bearertoken/*|metrics/*|filters/*)
|
||||||
linters: # not in golangci-strict.yaml
|
linters:
|
||||||
- gocritic # not in golangci-strict.yaml
|
- gocritic
|
||||||
|
|
||||||
# The Kubernetes naming convention for conversion functions uses underscores
|
# The Kubernetes naming convention for conversion functions uses underscores
|
||||||
# and intentionally deviates from normal Go conventions to make those function
|
# and intentionally deviates from normal Go conventions to make those function
|
||||||
# names more readable. Same for SetDefaults_*.
|
# names more readable. Same for SetDefaults_*.
|
||||||
|
#
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507028627
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1514201592
|
||||||
- linters:
|
- linters:
|
||||||
- stylecheck
|
- stylecheck
|
||||||
text: "ST1003: should not use underscores in Go names; func (Convert_.*_To_.*|SetDefaults_)"
|
text: "ST1003: should not use underscores in Go names; func (Convert_.*_To_.*|SetDefaults_)"
|
||||||
|
|
||||||
# This check currently has some false positives (https://github.com/nunnatsa/ginkgolinter/issues/91).
|
# This check currently has some false positives (https://github.com/nunnatsa/ginkgolinter/issues/91).
|
||||||
- linters:
|
- linters:
|
||||||
- ginkgolinter
|
- ginkgolinter
|
||||||
text: use a function call in (Eventually|Consistently)
|
text: use a function call in (Eventually|Consistently)
|
||||||
# SSA Extract calls are allowed in tests.
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507012435
|
||||||
- linters:
|
- linters:
|
||||||
- forbidigo
|
- gocritic
|
||||||
text: should not be used because managedFields was removed
|
text: "ifElseChain: rewrite if-else to switch statement"
|
||||||
path: _test.go$
|
|
||||||
|
# The following issues were deemed "might be worth fixing, needs to be
|
||||||
|
# decided on a case-by-case basis". This was initially decided by a
|
||||||
|
# majority of the developers who voted in
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288 and may evolve
|
||||||
|
# over time.
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507008918
|
||||||
|
- linters:
|
||||||
|
- gocritic
|
||||||
|
text: "assignOp:"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507016854
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1002: should omit comparison to bool constant"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507023980
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1016: should convert opts .* instead of using struct literal"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507026758
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1033: unnecessary guard around call to delete"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507030071
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1012: error var .* should have name of the form ErrFoo"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507031224
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1023: should omit type .* from declaration; it will be inferred from the right-hand side"
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
disable-all: true # not disabled in golangci-strict.yaml
|
disable-all: true
|
||||||
enable: # please keep this alphabetized and in sync with golangci-strict.yaml
|
enable: # please keep this alphabetized
|
||||||
- forbidigo
|
- forbidigo
|
||||||
- ginkgolinter
|
- ginkgolinter
|
||||||
- gocritic
|
- gocritic
|
||||||
@ -62,14 +129,14 @@ linters-settings: # please keep this alphabetized
|
|||||||
pkg: ^k8s\.io/client-go/applyconfigurations/
|
pkg: ^k8s\.io/client-go/applyconfigurations/
|
||||||
msg: should not be used because managedFields was removed
|
msg: should not be used because managedFields was removed
|
||||||
gocritic:
|
gocritic:
|
||||||
enabled-checks: # not limited in golangci-strict.yaml
|
enabled-checks:
|
||||||
- equalFold # not limited in golangci-strict.yaml
|
- equalFold
|
||||||
- boolExprSimplify # not limited in golangci-strict.yaml
|
- boolExprSimplify
|
||||||
staticcheck:
|
staticcheck:
|
||||||
checks:
|
checks:
|
||||||
- "all"
|
- "all"
|
||||||
- "-SA1019" # TODO(fix) Using a deprecated function, variable, constant or field - enabled in golangci-strict.yaml
|
- "-SA1019" # TODO(fix) Using a deprecated function, variable, constant or field
|
||||||
- "-SA2002" # TODO(fix) Called testing.T.FailNow or SkipNow in a goroutine, which isn’t allowed - enabled in golangci-strict.yaml
|
- "-SA2002" # TODO(fix) Called testing.T.FailNow or SkipNow in a goroutine, which isn’t allowed
|
||||||
stylecheck:
|
stylecheck:
|
||||||
checks: # golangci-strict.yaml uses the default checks.
|
checks:
|
||||||
- "ST1019" # Importing the same package multiple times - enabled in golangci-strict.yaml.
|
- "ST1019" # Importing the same package multiple times
|
||||||
|
159
hack/golangci.yaml.in
Normal file
159
hack/golangci.yaml.in
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
# golangci-lint is used in Kubernetes with different configurations that
|
||||||
|
# enable an increasing amount of checks:
|
||||||
|
# - golangci.yaml is the most permissive configuration. All existing code
|
||||||
|
# passed.
|
||||||
|
# - golangci-strict.yaml adds checks that all new code in pull requests
|
||||||
|
# must pass.
|
||||||
|
# - golangci-hints.yaml adds checks for code patterns where developer
|
||||||
|
# and reviewer may decide whether findings should get addressed before
|
||||||
|
# merging. Beware that the golangci-lint output includes also the
|
||||||
|
# issues that must be fixed and doesn't indicate how severe each issue
|
||||||
|
# is (https://gophers.slack.com/archives/CS0TBRKPC/p1685721815275349).
|
||||||
|
#
|
||||||
|
# All three flavors are generated from golangci.yaml.in with
|
||||||
|
# hack/update-golangci-lint-config.sh.
|
||||||
|
|
||||||
|
run:
|
||||||
|
timeout: 30m
|
||||||
|
skip-files:
|
||||||
|
- "^zz_generated.*"
|
||||||
|
|
||||||
|
output:
|
||||||
|
sort-results: true
|
||||||
|
|
||||||
|
issues:
|
||||||
|
max-issues-per-linter: 0
|
||||||
|
max-same-issues: 0
|
||||||
|
# Excluding configuration per-path, per-linter, per-text and per-source
|
||||||
|
exclude-rules:
|
||||||
|
# exclude ineffassign linter for generated files for conversion
|
||||||
|
- path: conversion\.go
|
||||||
|
linters:
|
||||||
|
- ineffassign
|
||||||
|
|
||||||
|
# SSA Extract calls are allowed in tests.
|
||||||
|
- linters:
|
||||||
|
- forbidigo
|
||||||
|
text: should not be used because managedFields was removed
|
||||||
|
path: _test.go$
|
||||||
|
|
||||||
|
{{- if .Base}}
|
||||||
|
|
||||||
|
# TODO(oscr) Remove these excluded directories and fix findings. Due to large amount of findings in different components
|
||||||
|
# with different owners it's hard to fix everything in a single pr. This will therefore be done in multiple prs.
|
||||||
|
- path: (pkg/volume/*|test/*|azure/*|pkg/cmd/wait*|request/bearertoken/*|metrics/*|filters/*)
|
||||||
|
linters:
|
||||||
|
- gocritic
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
# The Kubernetes naming convention for conversion functions uses underscores
|
||||||
|
# and intentionally deviates from normal Go conventions to make those function
|
||||||
|
# names more readable. Same for SetDefaults_*.
|
||||||
|
#
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507028627
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1514201592
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1003: should not use underscores in Go names; func (Convert_.*_To_.*|SetDefaults_)"
|
||||||
|
|
||||||
|
# This check currently has some false positives (https://github.com/nunnatsa/ginkgolinter/issues/91).
|
||||||
|
- linters:
|
||||||
|
- ginkgolinter
|
||||||
|
text: use a function call in (Eventually|Consistently)
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507012435
|
||||||
|
- linters:
|
||||||
|
- gocritic
|
||||||
|
text: "ifElseChain: rewrite if-else to switch statement"
|
||||||
|
|
||||||
|
{{- if not .Hints}}
|
||||||
|
|
||||||
|
# The following issues were deemed "might be worth fixing, needs to be
|
||||||
|
# decided on a case-by-case basis". This was initially decided by a
|
||||||
|
# majority of the developers who voted in
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288 and may evolve
|
||||||
|
# over time.
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507008918
|
||||||
|
- linters:
|
||||||
|
- gocritic
|
||||||
|
text: "assignOp:"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507016854
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1002: should omit comparison to bool constant"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507023980
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1016: should convert opts .* instead of using struct literal"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507026758
|
||||||
|
- linters:
|
||||||
|
- gosimple
|
||||||
|
text: "S1033: unnecessary guard around call to delete"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507030071
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1012: error var .* should have name of the form ErrFoo"
|
||||||
|
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507031224
|
||||||
|
- linters:
|
||||||
|
- stylecheck
|
||||||
|
text: "ST1023: should omit type .* from declaration; it will be inferred from the right-hand side"
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
linters:
|
||||||
|
disable-all: {{if .Base -}} true {{- else -}} false {{- end}}
|
||||||
|
enable: # please keep this alphabetized
|
||||||
|
- forbidigo
|
||||||
|
- ginkgolinter
|
||||||
|
- gocritic
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
|
- logcheck
|
||||||
|
- staticcheck
|
||||||
|
- stylecheck
|
||||||
|
- unused
|
||||||
|
{{- if .Strict}}
|
||||||
|
disable:
|
||||||
|
# https://github.com/kubernetes/kubernetes/issues/117288#issuecomment-1507008359
|
||||||
|
- errcheck
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
linters-settings: # please keep this alphabetized
|
||||||
|
custom:
|
||||||
|
logcheck:
|
||||||
|
# Installed there by hack/verify-golangci-lint.sh.
|
||||||
|
path: ../_output/local/bin/logcheck.so
|
||||||
|
description: structured logging checker
|
||||||
|
original-url: k8s.io/logtools/logcheck
|
||||||
|
forbidigo:
|
||||||
|
analyze-types: true
|
||||||
|
forbid:
|
||||||
|
- p: ^managedfields\.ExtractInto$
|
||||||
|
pkg: ^k8s\.io/apimachinery/pkg/util/managedfields$
|
||||||
|
msg: should not be used because managedFields was removed
|
||||||
|
- p: \.Extract
|
||||||
|
pkg: ^k8s\.io/client-go/applyconfigurations/
|
||||||
|
msg: should not be used because managedFields was removed
|
||||||
|
{{- if .Base }}
|
||||||
|
gocritic:
|
||||||
|
enabled-checks:
|
||||||
|
- equalFold
|
||||||
|
- boolExprSimplify
|
||||||
|
{{- end}}
|
||||||
|
staticcheck:
|
||||||
|
checks:
|
||||||
|
- "all"
|
||||||
|
{{- if .Base }}
|
||||||
|
- "-SA1019" # TODO(fix) Using a deprecated function, variable, constant or field
|
||||||
|
- "-SA2002" # TODO(fix) Called testing.T.FailNow or SkipNow in a goroutine, which isn’t allowed
|
||||||
|
{{- end}}
|
||||||
|
{{- if .Base }}
|
||||||
|
stylecheck:
|
||||||
|
checks:
|
||||||
|
- "ST1019" # Importing the same package multiple times
|
||||||
|
{{- end}}
|
68
hack/lib/verify-generated.sh
Executable file
68
hack/lib/verify-generated.sh
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright 2014 The Kubernetes Authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
# Short-circuit if verify-generated.sh has already been sourced.
|
||||||
|
[[ $(type -t kube::verify::generated::loaded) == function ]] && return 0
|
||||||
|
|
||||||
|
source "${KUBE_ROOT}/hack/lib/init.sh"
|
||||||
|
|
||||||
|
# This function verifies whether generated files are up-to-date. The first two
|
||||||
|
# parameters are messages that get printed to stderr when changes are found,
|
||||||
|
# the rest are the function or command and its parameters for generating files
|
||||||
|
# in the work tree.
|
||||||
|
#
|
||||||
|
# Example: kube::verify::generated "Mock files are out of date" "Please run 'hack/update-mocks.sh'" hack/update-mocks.sh
|
||||||
|
kube::verify::generated() {
|
||||||
|
( # a subshell prevents environment changes from leaking out of this function
|
||||||
|
local failure_header=$1
|
||||||
|
shift
|
||||||
|
local failure_tail=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
kube::util::ensure_clean_working_dir
|
||||||
|
|
||||||
|
# This sets up the environment, like GOCACHE, which keeps the worktree cleaner.
|
||||||
|
kube::golang::setup_env
|
||||||
|
|
||||||
|
_tmpdir="$(kube::realpath "$(mktemp -d -t "verify-generated-$(basename "$1").XXXXXX")")"
|
||||||
|
git worktree add -f -q "${_tmpdir}" HEAD
|
||||||
|
kube::util::trap_add "git worktree remove -f ${_tmpdir}" EXIT
|
||||||
|
cd "${_tmpdir}"
|
||||||
|
|
||||||
|
# Update generated files.
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Test for diffs
|
||||||
|
diffs=$(git status --porcelain | wc -l)
|
||||||
|
if [[ ${diffs} -gt 0 ]]; then
|
||||||
|
if [[ -n "${failure_header}" ]]; then
|
||||||
|
echo "${failure_header}" >&2
|
||||||
|
fi
|
||||||
|
git status >&2
|
||||||
|
git diff >&2
|
||||||
|
if [[ -n "${failure_tail}" ]]; then
|
||||||
|
echo "" >&2
|
||||||
|
echo "${failure_tail}" >&2
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Marker function to indicate verify-generated.sh has been fully sourced.
|
||||||
|
kube::verify::generated::loaded() {
|
||||||
|
return 0
|
||||||
|
}
|
6
hack/logcheck.yaml
Normal file
6
hack/logcheck.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Installed there by hack/verify-golangci-lint.sh.
|
||||||
|
path: ../_output/local/bin/logcheck.so
|
||||||
|
description: structured logging checker
|
||||||
|
original-url: k8s.io/logtools/logcheck
|
||||||
|
settings:
|
||||||
|
config: /nvme/gopath/src/k8s.io/kubernetes/hack/logcheck.conf
|
44
hack/update-golangci-lint-config.sh
Executable file
44
hack/update-golangci-lint-config.sh
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright 2023 The Kubernetes Authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
# This script checks that golangci-strict.yaml and golangci.yaml remain in
|
||||||
|
# sync. Lines that are intentionally different must have a comment which
|
||||||
|
# mentions golangci.yaml or golangci-lint.yaml.
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||||
|
source "${KUBE_ROOT}/hack/lib/init.sh"
|
||||||
|
|
||||||
|
# This sets up the environment, like GOCACHE, which keeps the worktree cleaner.
|
||||||
|
kube::golang::setup_env
|
||||||
|
|
||||||
|
# Remove all files, some of them might be obsolete.
|
||||||
|
rm -f hack/golangci*.yaml
|
||||||
|
|
||||||
|
generate () {
|
||||||
|
out="$1"
|
||||||
|
shift
|
||||||
|
echo "Generating $out from hack/golangci.yaml.in with ./cmd/gotemplate $*"
|
||||||
|
go run ./cmd/gotemplate <hack/golangci.yaml.in >"${out}" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Regenerate.
|
||||||
|
generate hack/golangci.yaml Base=1
|
||||||
|
generate hack/golangci-strict.yaml Strict=1
|
||||||
|
generate hack/golangci-hints.yaml Hints=1
|
@ -14,39 +14,16 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
# This script verifies whether code update is needed or not against the
|
# This script verifies whether a code update is needed.
|
||||||
# specific sub-projects. The sub-projects are listed below this script(the
|
# Usage: `hack/verify-codegen.sh <parameters for update-codegen.sh>`.
|
||||||
# line that starts with `CODEGEN_PKG`).
|
|
||||||
# Usage: `hack/verify-codegen.sh`.
|
|
||||||
|
|
||||||
set -o errexit
|
set -o errexit
|
||||||
set -o nounset
|
set -o nounset
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||||
source "${KUBE_ROOT}/hack/lib/init.sh"
|
source "${KUBE_ROOT}/hack/lib/verify-generated.sh"
|
||||||
|
|
||||||
kube::util::ensure_clean_working_dir
|
|
||||||
|
|
||||||
# This sets up the environment, like GOCACHE, which keeps the worktree cleaner.
|
|
||||||
kube::golang::setup_env
|
|
||||||
|
|
||||||
_tmpdir="$(kube::realpath "$(mktemp -d -t "$(basename "$0").XXXXXX")")"
|
|
||||||
git worktree add -f -q "${_tmpdir}" HEAD
|
|
||||||
kube::util::trap_add "git worktree remove -f ${_tmpdir}" EXIT
|
|
||||||
cd "${_tmpdir}"
|
|
||||||
|
|
||||||
# Update generated code
|
|
||||||
export UPDATE_API_KNOWN_VIOLATIONS=true
|
export UPDATE_API_KNOWN_VIOLATIONS=true
|
||||||
hack/update-codegen.sh "$@"
|
|
||||||
|
|
||||||
# Test for diffs
|
kube::verify::generated "Generated files need to be updated" "Please run 'hack/update-codegen.sh'" hack/update-codegen.sh "$@"
|
||||||
diffs=$(git status --porcelain | wc -l)
|
|
||||||
if [[ ${diffs} -gt 0 ]]; then
|
|
||||||
git status >&2
|
|
||||||
git diff >&2
|
|
||||||
echo "Generated files need to be updated" >&2
|
|
||||||
echo "Please run 'hack/update-codegen.sh'" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Generated files are up to date"
|
|
||||||
|
@ -14,30 +14,14 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
# This script checks that golangci-strict.yaml and golangci.yaml remain in
|
# This script checks that all generated golangci-lint configurations
|
||||||
# sync. Lines that are intentionally different must have a comment which
|
# are up-to-date.
|
||||||
# mentions golangci.yaml or golangci-lint.yaml.
|
|
||||||
|
|
||||||
set -o errexit
|
set -o errexit
|
||||||
set -o nounset
|
set -o nounset
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||||
|
source "${KUBE_ROOT}/hack/lib/verify-generated.sh"
|
||||||
|
|
||||||
if differences=$(diff --context --ignore-blank-lines \
|
kube::verify::generated "" "Please run 'hack/update-golangci-lint-config.sh'" hack/update-golangci-lint-config.sh
|
||||||
--ignore-matching-lines='^ *#' \
|
|
||||||
--ignore-matching-lines='#.*golangci\(-strict\)*.yaml' \
|
|
||||||
"${KUBE_ROOT}/hack/golangci.yaml" "${KUBE_ROOT}/hack/golangci-strict.yaml" ); then
|
|
||||||
echo "hack/golangci.yaml and hack/golangci-strict.yaml are synchronized."
|
|
||||||
else
|
|
||||||
cat >&2 <<EOF
|
|
||||||
Unexpected differences between hack/golangci.yaml and hack/golangci-strict.yaml:
|
|
||||||
|
|
||||||
${differences}
|
|
||||||
|
|
||||||
If these differences are intentional, then add comments at the end of each
|
|
||||||
different line in both files that mention golangci-strict.yaml or
|
|
||||||
golangci.yaml.
|
|
||||||
EOF
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
@ -26,6 +26,8 @@ Usage: $0 [-r <revision>|-a] [-s] [-c none|<config>] [-- <golangci-lint run flag
|
|||||||
-a: automatically select the common base of origin/master and HEAD
|
-a: automatically select the common base of origin/master and HEAD
|
||||||
as revision
|
as revision
|
||||||
-s: select a strict configuration for new code
|
-s: select a strict configuration for new code
|
||||||
|
-n: in addition to strict checking, also enable hints (aka nits) that may are may not
|
||||||
|
be useful
|
||||||
-g <github action file>: also write results with --out-format=github-actions
|
-g <github action file>: also write results with --out-format=github-actions
|
||||||
to a separate file
|
to a separate file
|
||||||
-c <config|"none">: use the specified configuration or none instead of the default hack/golangci.yaml
|
-c <config|"none">: use the specified configuration or none instead of the default hack/golangci.yaml
|
||||||
@ -65,8 +67,9 @@ golangci=(env LOGCHECK_CONFIG="${KUBE_ROOT}/hack/logcheck.conf" "${GOBIN}/golang
|
|||||||
golangci_config="${KUBE_ROOT}/hack/golangci.yaml"
|
golangci_config="${KUBE_ROOT}/hack/golangci.yaml"
|
||||||
base=
|
base=
|
||||||
strict=
|
strict=
|
||||||
|
hints=
|
||||||
githubactions=
|
githubactions=
|
||||||
while getopts "ar:sg:c:" o; do
|
while getopts "ar:sng:c:" o; do
|
||||||
case "${o}" in
|
case "${o}" in
|
||||||
a)
|
a)
|
||||||
base="$(git merge-base origin/master HEAD)"
|
base="$(git merge-base origin/master HEAD)"
|
||||||
@ -83,6 +86,10 @@ while getopts "ar:sg:c:" o; do
|
|||||||
golangci_config="${KUBE_ROOT}/hack/golangci-strict.yaml"
|
golangci_config="${KUBE_ROOT}/hack/golangci-strict.yaml"
|
||||||
strict=1
|
strict=1
|
||||||
;;
|
;;
|
||||||
|
n)
|
||||||
|
golangci_config="${KUBE_ROOT}/hack/golangci-hints.yaml"
|
||||||
|
hints=1
|
||||||
|
;;
|
||||||
g)
|
g)
|
||||||
githubactions="${OPTARG}"
|
githubactions="${OPTARG}"
|
||||||
;;
|
;;
|
||||||
@ -192,9 +199,17 @@ else
|
|||||||
echo 'If the above warnings do not make sense, you can exempt this warning with a comment'
|
echo 'If the above warnings do not make sense, you can exempt this warning with a comment'
|
||||||
echo ' (if your reviewer is okay with it).'
|
echo ' (if your reviewer is okay with it).'
|
||||||
if [ "$strict" ]; then
|
if [ "$strict" ]; then
|
||||||
echo 'The more strict golangci-strict.yaml was used. If you feel that this warns about issues'
|
echo 'The more strict golangci-strict.yaml was used.'
|
||||||
echo 'that should be ignored by default, then please discuss with your reviewer and propose'
|
elif [ "$hints" ]; then
|
||||||
echo 'a change for hack/golangci-strict.yaml as part of your PR.'
|
echo 'The golangci-hints.yaml was used. Some of the reported issues may have to be fixed'
|
||||||
|
echo 'while others can be ignored, depending on the circumstances and/or personal'
|
||||||
|
echo 'preferences. To determine which issues have to be fixed, check the report that'
|
||||||
|
echo 'uses golangci-strict.yaml.'
|
||||||
|
fi
|
||||||
|
if [ "$strict" ] || [ "$hints" ]; then
|
||||||
|
echo 'If you feel that this warns about issues that should be ignored by default,'
|
||||||
|
echo 'then please discuss with your reviewer and propose'
|
||||||
|
echo 'a change for hack/golangci.yaml.in as part of your PR.'
|
||||||
fi
|
fi
|
||||||
echo 'In general please prefer to fix the error, we have already disabled specific lints'
|
echo 'In general please prefer to fix the error, we have already disabled specific lints'
|
||||||
echo ' that the project chooses to ignore.'
|
echo ' that the project chooses to ignore.'
|
||||||
|
@ -19,30 +19,6 @@ set -o nounset
|
|||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||||
source "${KUBE_ROOT}/hack/lib/init.sh"
|
source "${KUBE_ROOT}/hack/lib/verify-generated.sh"
|
||||||
|
|
||||||
kube::util::ensure_clean_working_dir
|
kube::verify::generated "" "Run ./hack/update-internal-modules.sh" ./hack/update-internal-modules.sh
|
||||||
# This sets up the environment, like GOCACHE, which keeps the worktree cleaner.
|
|
||||||
kube::golang::setup_env
|
|
||||||
|
|
||||||
_tmpdir="$(kube::realpath "$(mktemp -d -t verify-internal-modules.XXXXXX)")"
|
|
||||||
kube::util::trap_add "rm -rf ${_tmpdir:?}" EXIT
|
|
||||||
|
|
||||||
_tmp_gopath="${_tmpdir}/go"
|
|
||||||
_tmp_kuberoot="${_tmp_gopath}/src/k8s.io/kubernetes"
|
|
||||||
git worktree add -f "${_tmp_kuberoot}" HEAD
|
|
||||||
kube::util::trap_add "git worktree remove -f ${_tmp_kuberoot}" EXIT
|
|
||||||
|
|
||||||
pushd "${_tmp_kuberoot}" >/dev/null
|
|
||||||
./hack/update-internal-modules.sh
|
|
||||||
popd
|
|
||||||
|
|
||||||
git -C "${_tmp_kuberoot}" add -N .
|
|
||||||
diff=$(git -C "${_tmp_kuberoot}" diff HEAD || true)
|
|
||||||
|
|
||||||
if [[ -n "${diff}" ]]; then
|
|
||||||
echo "${diff}" >&2
|
|
||||||
echo >&2
|
|
||||||
echo "Run ./hack/update-internal-modules.sh" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
@ -25,28 +25,6 @@ set -o nounset
|
|||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||||
source "${KUBE_ROOT}/hack/lib/init.sh"
|
source "${KUBE_ROOT}/hack/lib/verify-generated.sh"
|
||||||
|
|
||||||
# Explicitly opt into go modules, even though we're inside a GOPATH directory
|
kube::verify::generated "Mock files are out of date" "Please run 'hack/update-mocks.sh'" hack/update-mocks.sh
|
||||||
export GO111MODULE=on
|
|
||||||
|
|
||||||
kube::util::ensure_clean_working_dir
|
|
||||||
# This sets up the environment, like GOCACHE, which keeps the worktree cleaner.
|
|
||||||
kube::golang::setup_env
|
|
||||||
|
|
||||||
_tmpdir="$(kube::realpath "$(mktemp -d -t "$(basename "$0").XXXXXX")")"
|
|
||||||
git worktree add -f -q "${_tmpdir}" HEAD
|
|
||||||
kube::util::trap_add "git worktree remove -f ${_tmpdir}" EXIT
|
|
||||||
cd "${_tmpdir}"
|
|
||||||
|
|
||||||
# Update the mocks in ${_tmpdir}
|
|
||||||
hack/update-mocks.sh
|
|
||||||
|
|
||||||
# Test for diffs
|
|
||||||
diffs=$(git status --porcelain | wc -l)
|
|
||||||
if [[ ${diffs} -gt 0 ]]; then
|
|
||||||
echo "Mock files are out of date" >&2
|
|
||||||
git diff
|
|
||||||
echo "Please run 'hack/update-mocks.sh'" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
@ -25,25 +25,6 @@ set -o nounset
|
|||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||||
source "${KUBE_ROOT}/hack/lib/init.sh"
|
source "${KUBE_ROOT}/hack/lib/verify-generated.sh"
|
||||||
|
|
||||||
kube::util::ensure_clean_working_dir
|
kube::verify::generated "YAML files need to be formatted" "Please run 'hack/update-yamlfmt.sh'" hack/update-yamlfmt.sh
|
||||||
# This sets up the environment, like GOCACHE, which keeps the worktree cleaner.
|
|
||||||
kube::golang::setup_env
|
|
||||||
|
|
||||||
_tmpdir="$(kube::realpath "$(mktemp -d -t "$(basename "$0").XXXXXX")")"
|
|
||||||
git worktree add -f -q "${_tmpdir}" HEAD
|
|
||||||
kube::util::trap_add "git worktree remove -f ${_tmpdir}" EXIT
|
|
||||||
cd "${_tmpdir}"
|
|
||||||
|
|
||||||
# Format YAML files
|
|
||||||
hack/update-yamlfmt.sh
|
|
||||||
|
|
||||||
# Test for diffs
|
|
||||||
diffs=$(git status --porcelain | wc -l)
|
|
||||||
if [[ ${diffs} -gt 0 ]]; then
|
|
||||||
echo "YAML files need to be formatted" >&2
|
|
||||||
git diff
|
|
||||||
echo "Please run 'hack/update-yamlfmt.sh'" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
Loading…
Reference in New Issue
Block a user