aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/tetafro
diff options
context:
space:
mode:
authordependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>2024-03-04 17:40:11 +0000
committerTaras Madan <tarasmadan@google.com>2024-03-04 18:34:55 +0000
commit5fc5366972c874b919f93165bb4ed4e2bcb7c350 (patch)
tree287c3361a0dee0c72af80d9a1a66714a06e98a62 /vendor/github.com/tetafro
parent1be5ce38a9059c356eb193a8c34d60d61c9fc31f (diff)
mod: bump github.com/golangci/golangci-lint from 1.55.2 to 1.56.2
Bumps [github.com/golangci/golangci-lint](https://github.com/golangci/golangci-lint) from 1.55.2 to 1.56.2. - [Release notes](https://github.com/golangci/golangci-lint/releases) - [Changelog](https://github.com/golangci/golangci-lint/blob/master/CHANGELOG.md) - [Commits](https://github.com/golangci/golangci-lint/compare/v1.55.2...v1.56.2) --- updated-dependencies: - dependency-name: github.com/golangci/golangci-lint dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
Diffstat (limited to 'vendor/github.com/tetafro')
-rw-r--r--vendor/github.com/tetafro/godot/.golangci.yml50
-rw-r--r--vendor/github.com/tetafro/godot/checks.go186
-rw-r--r--vendor/github.com/tetafro/godot/getters.go24
-rw-r--r--vendor/github.com/tetafro/godot/godot.go25
4 files changed, 145 insertions, 140 deletions
diff --git a/vendor/github.com/tetafro/godot/.golangci.yml b/vendor/github.com/tetafro/godot/.golangci.yml
index 920135d40..ea380eb83 100644
--- a/vendor/github.com/tetafro/godot/.golangci.yml
+++ b/vendor/github.com/tetafro/godot/.golangci.yml
@@ -8,45 +8,53 @@ skip-dirs:
linters:
disable-all: true
enable:
- - deadcode
- - errcheck
- - gosimple
- - govet
- - ineffassign
- - staticcheck
- - structcheck
- - typecheck
- - unused
- - varcheck
+ - asciicheck
- bodyclose
+ - cyclop
- dogsled
- - dupl
- - funlen
+ - durationcheck
+ - errcheck
+ - errname
+ - errorlint
+ - exhaustive
+ - exportloopref
+ - exportloopref
- gochecknoinits
+ - gocognit
- goconst
- gocritic
- gocyclo
- godot
+ - goerr113
- gofmt
- gofumpt
- goimports
- - golint
- - gomnd
- - gomodguard
- goprintffuncname
- gosec
+ - gosimple
+ - govet
+ - importas
+ - ineffassign
- lll
- - maligned
- misspell
- nakedret
- nestif
+ - noctx
+ - nolintlint
- prealloc
+ - revive
- rowserrcheck
- - scopelint
+ - sqlclosecheck
+ - sqlclosecheck
+ - staticcheck
- stylecheck
+ - typecheck
- unconvert
- unparam
+ - unused
+ - wastedassign
- whitespace
+ - wrapcheck
linters-settings:
godot:
@@ -54,13 +62,19 @@ linters-settings:
issues:
exclude-use-default: false
+ exclude:
+ - "do not define dynamic errors, use wrapped static errors instead"
exclude-rules:
- path: _test\.go
linters:
- dupl
- errcheck
- funlen
+ - gocognit
+ - cyclop
- gosec
- - path: cmd/godot/main\.go
+ - noctx
+ - path: main\.go
linters:
+ - cyclop
- gomnd
diff --git a/vendor/github.com/tetafro/godot/checks.go b/vendor/github.com/tetafro/godot/checks.go
index f5471cdf7..0e53c220a 100644
--- a/vendor/github.com/tetafro/godot/checks.go
+++ b/vendor/github.com/tetafro/godot/checks.go
@@ -21,7 +21,7 @@ var (
// Abbreviations to exclude from capital letters check.
abbreviations = []string{"i.e.", "i. e.", "e.g.", "e. g.", "etc."}
- // Special tags in comments like "// nolint:", or "// +k8s:".
+ // Special tags in comments like "//nolint:", or "//+k8s:".
tags = regexp.MustCompile(`^\+?[a-z0-9]+:`)
// Special hashtags in comments like "// #nosec".
@@ -31,18 +31,24 @@ var (
endURL = regexp.MustCompile(`[a-z]+://[^\s]+$`)
)
+// position is a position inside a comment (might be multiline comment).
+type position struct {
+ line int // starts at 1
+ column int // starts at 1, byte count
+}
+
// checkComments checks every comment accordings to the rules from
// `settings` argument.
func checkComments(comments []comment, settings Settings) []Issue {
- var issues []Issue // nolint: prealloc
+ var issues []Issue
for _, c := range comments {
if settings.Period {
- if iss := checkCommentForPeriod(c); iss != nil {
+ if iss := checkPeriod(c); iss != nil {
issues = append(issues, *iss)
}
}
if settings.Capital {
- if iss := checkCommentForCapital(c); len(iss) > 0 {
+ if iss := checkCapital(c); len(iss) > 0 {
issues = append(issues, iss...)
}
}
@@ -50,14 +56,34 @@ func checkComments(comments []comment, settings Settings) []Issue {
return issues
}
-// checkCommentForPeriod checks that the last sentense of the comment ends
+// checkPeriod checks that the last sentense of the comment ends
// in a period.
-func checkCommentForPeriod(c comment) *Issue {
- pos, ok := checkPeriod(c.text)
- if ok {
+func checkPeriod(c comment) *Issue {
+ // Check last non-empty line
+ var found bool
+ var line string
+ var pos position
+ lines := strings.Split(c.text, "\n")
+ for i := len(lines) - 1; i >= 0; i-- {
+ line = strings.TrimRightFunc(lines[i], unicode.IsSpace)
+ if line == "" {
+ continue
+ }
+ found = true
+ pos.line = i + 1
+ break
+ }
+ // All lines are empty
+ if !found {
+ return nil
+ }
+ // Correct line
+ if hasSuffix(line, lastChars) {
return nil
}
+ pos.column = len(line) + 1
+
// Shift position to its real value. `c.text` doesn't contain comment's
// special symbols: /* or //, and line indentations inside. It also
// contains */ in the end in case of block comment.
@@ -94,95 +120,15 @@ func checkCommentForPeriod(c comment) *Issue {
return &iss
}
-// checkCommentForCapital checks that each sentense of the comment starts with
-// a capital letter.
-// nolint: unparam
-func checkCommentForCapital(c comment) []Issue {
- pp := checkCapital(c.text, c.decl)
- if len(pp) == 0 {
- return nil
- }
-
- issues := make([]Issue, len(pp))
- for i, pos := range pp {
- // Shift position by the length of comment's special symbols: /* or //
- isBlock := strings.HasPrefix(c.lines[0], "/*")
- if (isBlock && pos.line == 1) || !isBlock {
- pos.column += 2
- }
-
- iss := Issue{
- Pos: token.Position{
- Filename: c.start.Filename,
- Offset: c.start.Offset,
- Line: pos.line + c.start.Line - 1,
- Column: pos.column + c.start.Column - 1,
- },
- Message: noCapitalMessage,
- }
-
- // Make a replacement. Use `pos.original` to get an original original from
- // attached lines. Use `iss.Pos.Column` because it's a position in
- // the original original.
- original := c.lines[pos.line-1]
- col := byteToRuneColumn(original, iss.Pos.Column) - 1
- rep := string(unicode.ToTitle([]rune(original)[col])) // capital letter
- if len(original) < iss.Pos.Column-1+len(rep) {
- // This should never happen. Avoid panics, skip this check.
- continue
- }
- iss.Replacement = original[:iss.Pos.Column-1] + rep +
- original[iss.Pos.Column-1+len(rep):]
-
- // Save replacement to raw lines to be able to combine it with
- // further replacements
- c.lines[pos.line-1] = iss.Replacement
-
- issues[i] = iss
- }
-
- return issues
-}
-
-// checkPeriod checks that the last sentense of the text ends in a period.
-// NOTE: Returned position is a position inside given text, not in the
-// original file.
-func checkPeriod(comment string) (pos position, ok bool) {
- // Check last non-empty line
- var found bool
- var line string
- lines := strings.Split(comment, "\n")
- for i := len(lines) - 1; i >= 0; i-- {
- line = strings.TrimRightFunc(lines[i], unicode.IsSpace)
- if line == "" {
- continue
- }
- found = true
- pos.line = i + 1
- break
- }
- // All lines are empty
- if !found {
- return position{}, true
- }
- // Correct line
- if hasSuffix(line, lastChars) {
- return position{}, true
- }
-
- pos.column = len(line) + 1
- return pos, false
-}
-
-// checkCapital checks that each sentense of the text starts with
+// checkCapital checks that each sentense of the comment starts with
// a capital letter.
-// NOTE: First letter is not checked in declaration comments, because they
-// can describe unexported functions, which start with small letter.
-func checkCapital(comment string, skipFirst bool) (pp []position) {
+//
+//nolint:cyclop,funlen
+func checkCapital(c comment) []Issue {
// Remove common abbreviations from the comment
for _, abbr := range abbreviations {
repl := strings.ReplaceAll(abbr, ".", "_")
- comment = strings.ReplaceAll(comment, abbr, repl)
+ c.text = strings.ReplaceAll(c.text, abbr, repl)
}
// List of states during the scan: `empty` - nothing special,
@@ -190,12 +136,14 @@ func checkCapital(comment string, skipFirst bool) (pp []position) {
// `endOfSentence` - found `endChar`, and then space or newline.
const empty, endChar, endOfSentence = 1, 2, 3
+ var pp []position
pos := position{line: 1}
state := endOfSentence
- if skipFirst {
+ if c.decl {
+ // Skip first
state = empty
}
- for _, r := range comment {
+ for _, r := range c.text {
s := string(r)
pos.column++
@@ -223,12 +171,54 @@ func checkCapital(comment string, skipFirst bool) (pp []position) {
if state == endOfSentence && unicode.IsLower(r) {
pp = append(pp, position{
line: pos.line,
- column: runeToByteColumn(comment, pos.column),
+ column: runeToByteColumn(c.text, pos.column),
})
}
state = empty
}
- return pp
+ if len(pp) == 0 {
+ return nil
+ }
+
+ issues := make([]Issue, len(pp))
+ for i, pos := range pp {
+ // Shift position by the length of comment's special symbols: /* or //
+ isBlock := strings.HasPrefix(c.lines[0], "/*")
+ if (isBlock && pos.line == 1) || !isBlock {
+ pos.column += 2
+ }
+
+ iss := Issue{
+ Pos: token.Position{
+ Filename: c.start.Filename,
+ Offset: c.start.Offset,
+ Line: pos.line + c.start.Line - 1,
+ Column: pos.column + c.start.Column - 1,
+ },
+ Message: noCapitalMessage,
+ }
+
+ // Make a replacement. Use `pos.original` to get an original original from
+ // attached lines. Use `iss.Pos.Column` because it's a position in
+ // the original original.
+ original := c.lines[pos.line-1]
+ col := byteToRuneColumn(original, iss.Pos.Column) - 1
+ rep := string(unicode.ToTitle([]rune(original)[col])) // capital letter
+ if len(original) < iss.Pos.Column-1+len(rep) {
+ // This should never happen. Avoid panics, skip this check.
+ continue
+ }
+ iss.Replacement = original[:iss.Pos.Column-1] + rep +
+ original[iss.Pos.Column-1+len(rep):]
+
+ // Save replacement to raw lines to be able to combine it with
+ // further replacements
+ c.lines[pos.line-1] = iss.Replacement
+
+ issues[i] = iss
+ }
+
+ return issues
}
// isSpecialBlock checks that given block of comment lines is special and
@@ -246,7 +236,7 @@ func isSpecialBlock(comment string) bool {
return false
}
-// isSpecialBlock checks that given comment line is special and
+// isSpecialLine checks that given comment line is special and
// shouldn't be checked as a regular sentence.
func isSpecialLine(comment string) bool {
// Skip cgo export tags: https://golang.org/cmd/cgo/#hdr-C_references_to_Go
diff --git a/vendor/github.com/tetafro/godot/getters.go b/vendor/github.com/tetafro/godot/getters.go
index 1a47c824f..7d3d22fb1 100644
--- a/vendor/github.com/tetafro/godot/getters.go
+++ b/vendor/github.com/tetafro/godot/getters.go
@@ -44,7 +44,7 @@ func newParsedFile(file *ast.File, fset *token.FileSet) (*parsedFile, error) {
// from "go/format" won't help here if the original file is not gofmt-ed.
pf.lines, err = readFile(file, fset)
if err != nil {
- return nil, fmt.Errorf("read file: %v", err)
+ return nil, fmt.Errorf("read file: %w", err)
}
// Dirty hack. For some cases Go generates temporary files during
@@ -58,9 +58,13 @@ func newParsedFile(file *ast.File, fset *token.FileSet) (*parsedFile, error) {
return nil, errUnsuitableInput
}
- // Check consistency to avoid checking slice indexes in each function
+ // Check consistency to avoid checking slice indexes in each function.
+ // Note that `PositionFor` is used with `adjusted=false` to skip `//line`
+ // directives that can set references to other files (e.g. templates)
+ // instead of the real ones, and break consistency here.
+ // Issue: https://github.com/tetafro/godot/issues/32
lastComment := pf.file.Comments[len(pf.file.Comments)-1]
- if p := pf.fset.Position(lastComment.End()); len(pf.lines) < p.Line {
+ if p := pf.fset.PositionFor(lastComment.End(), false); len(pf.lines) < p.Line {
return nil, fmt.Errorf("inconsistency between file and AST: %s", p.Filename)
}
@@ -82,7 +86,7 @@ func (pf *parsedFile) getComments(scope Scope, exclude []*regexp.Regexp) []comme
pf.getBlockComments(exclude),
pf.getTopLevelComments(exclude)...,
)
- default:
+ case DeclScope:
// Top level declaration comments and comments from the inside
// of top level blocks
comments = append(pf.getBlockComments(exclude), decl...)
@@ -118,7 +122,7 @@ func (pf *parsedFile) getBlockComments(exclude []*regexp.Regexp) []comment {
// Skip comments that are not top-level for this block
// (the block itself is top level, so comments inside this block
// would be on column 2)
- // nolint: gomnd
+ //nolint:gomnd
if pf.fset.Position(c.Pos()).Column != 2 {
continue
}
@@ -136,7 +140,7 @@ func (pf *parsedFile) getBlockComments(exclude []*regexp.Regexp) []comment {
// getTopLevelComments gets all top level comments.
func (pf *parsedFile) getTopLevelComments(exclude []*regexp.Regexp) []comment {
- var comments []comment // nolint: prealloc
+ var comments []comment //nolint:prealloc
for _, c := range pf.file.Comments {
if c == nil || len(c.List) == 0 {
continue
@@ -157,7 +161,7 @@ func (pf *parsedFile) getTopLevelComments(exclude []*regexp.Regexp) []comment {
// getDeclarationComments gets top level declaration comments.
func (pf *parsedFile) getDeclarationComments(exclude []*regexp.Regexp) []comment {
- var comments []comment // nolint: prealloc
+ var comments []comment //nolint:prealloc
for _, decl := range pf.file.Decls {
var cg *ast.CommentGroup
switch d := decl.(type) {
@@ -184,7 +188,7 @@ func (pf *parsedFile) getDeclarationComments(exclude []*regexp.Regexp) []comment
// getAllComments gets every single comment from the file.
func (pf *parsedFile) getAllComments(exclude []*regexp.Regexp) []comment {
- var comments []comment //nolint: prealloc
+ var comments []comment //nolint:prealloc
for _, c := range pf.file.Comments {
if c == nil || len(c.List) == 0 {
continue
@@ -205,6 +209,8 @@ func (pf *parsedFile) getAllComments(exclude []*regexp.Regexp) []comment {
// special lines (e.g., tags or indented code examples), they are replaced
// with `specialReplacer` to skip checks for them.
// The result can be multiline.
+//
+//nolint:cyclop
func getText(comment *ast.CommentGroup, exclude []*regexp.Regexp) (s string) {
if len(comment.List) == 1 &&
strings.HasPrefix(comment.List[0].Text, "/*") &&
@@ -246,7 +252,7 @@ func readFile(file *ast.File, fset *token.FileSet) ([]string, error) {
fname := fset.File(file.Package)
f, err := os.ReadFile(fname.Name())
if err != nil {
- return nil, err
+ return nil, err //nolint:wrapcheck
}
return strings.Split(string(f), "\n"), nil
}
diff --git a/vendor/github.com/tetafro/godot/godot.go b/vendor/github.com/tetafro/godot/godot.go
index df9271296..e825e9a6d 100644
--- a/vendor/github.com/tetafro/godot/godot.go
+++ b/vendor/github.com/tetafro/godot/godot.go
@@ -3,6 +3,7 @@
package godot
import (
+ "errors"
"fmt"
"go/ast"
"go/token"
@@ -24,12 +25,6 @@ type Issue struct {
Replacement string
}
-// position is a position inside a comment (might be multiline comment).
-type position struct {
- line int // starts at 1
- column int // starts at 1, byte count
-}
-
// comment is an internal representation of AST comment entity with additional
// data attached. The latter is used for creating a full replacement for
// the line with issues.
@@ -43,18 +38,18 @@ type comment struct {
// Run runs this linter on the provided code.
func Run(file *ast.File, fset *token.FileSet, settings Settings) ([]Issue, error) {
pf, err := newParsedFile(file, fset)
- if err == errEmptyInput || err == errUnsuitableInput {
+ if errors.Is(err, errEmptyInput) || errors.Is(err, errUnsuitableInput) {
return nil, nil
}
if err != nil {
- return nil, fmt.Errorf("parse input file: %v", err)
+ return nil, fmt.Errorf("parse input file: %w", err)
}
exclude := make([]*regexp.Regexp, len(settings.Exclude))
for i := 0; i < len(settings.Exclude); i++ {
exclude[i], err = regexp.Compile(settings.Exclude[i])
if err != nil {
- return nil, fmt.Errorf("invalid regexp: %v", err)
+ return nil, fmt.Errorf("invalid regexp: %w", err)
}
}
@@ -68,9 +63,9 @@ func Run(file *ast.File, fset *token.FileSet, settings Settings) ([]Issue, error
// Fix fixes all issues and returns new version of file content.
func Fix(path string, file *ast.File, fset *token.FileSet, settings Settings) ([]byte, error) {
// Read file
- content, err := os.ReadFile(path) // nolint: gosec
+ content, err := os.ReadFile(path) //nolint:gosec
if err != nil {
- return nil, fmt.Errorf("read file: %v", err)
+ return nil, fmt.Errorf("read file: %w", err)
}
if len(content) == 0 {
return nil, nil
@@ -78,7 +73,7 @@ func Fix(path string, file *ast.File, fset *token.FileSet, settings Settings) ([
issues, err := Run(file, fset, settings)
if err != nil {
- return nil, fmt.Errorf("run linter: %v", err)
+ return nil, fmt.Errorf("run linter: %w", err)
}
// slice -> map
@@ -105,17 +100,17 @@ func Fix(path string, file *ast.File, fset *token.FileSet, settings Settings) ([
func Replace(path string, file *ast.File, fset *token.FileSet, settings Settings) error {
info, err := os.Stat(path)
if err != nil {
- return fmt.Errorf("check file: %v", err)
+ return fmt.Errorf("check file: %w", err)
}
mode := info.Mode()
fixed, err := Fix(path, file, fset, settings)
if err != nil {
- return fmt.Errorf("fix issues: %v", err)
+ return fmt.Errorf("fix issues: %w", err)
}
if err := os.WriteFile(path, fixed, mode); err != nil {
- return fmt.Errorf("write file: %v", err)
+ return fmt.Errorf("write file: %w", err)
}
return nil
}