aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/golangci
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2023-12-05 15:10:03 +0100
committerTaras Madan <tarasmadan@google.com>2023-12-06 11:31:44 +0000
commit2ab72b4feef2c97f22f90cfbf9e45a6cfcd08bda (patch)
treea6d19b94b6399fcc00a6cfa430885cd349dd1533 /vendor/github.com/golangci
parente08e8f492d31d672cc245944c185f8aadf2ee695 (diff)
vendor: updates
Diffstat (limited to 'vendor/github.com/golangci')
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/doc.go8
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/gofmt.go58
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/golangci.go16
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/internal.go7
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/internal/diff/diff.go290
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/internal/execabs/execabs.go70
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/readme.md2
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/simplify.go22
-rw-r--r--vendor/github.com/golangci/gofmt/goimports/goimports.go2
-rw-r--r--vendor/github.com/golangci/gofmt/goimports/golangci.go4
-rw-r--r--vendor/github.com/golangci/gofmt/goimports/readme.md1
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/root.go4
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/config/issues.go2
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/config/linters_settings.go64
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/dupword.go1
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/ginkgolinter.go15
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecksumtype.go80
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go6
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/inamedparam.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/perfsprint.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/protogetter.go59
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/revive.go8
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/sloglint.go27
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/testifylint.go36
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go56
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go49
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go2
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/github.go8
-rw-r--r--vendor/github.com/golangci/revgrep/.golangci.yml19
-rw-r--r--vendor/github.com/golangci/revgrep/revgrep.go121
30 files changed, 794 insertions, 281 deletions
diff --git a/vendor/github.com/golangci/gofmt/gofmt/doc.go b/vendor/github.com/golangci/gofmt/gofmt/doc.go
index da0c8581d..d0a458021 100644
--- a/vendor/github.com/golangci/gofmt/gofmt/doc.go
+++ b/vendor/github.com/golangci/gofmt/gofmt/doc.go
@@ -13,9 +13,11 @@ that directory, recursively. (Files starting with a period are ignored.)
By default, gofmt prints the reformatted sources to standard output.
Usage:
+
gofmt [flags] [path ...]
The flags are:
+
-d
Do not print reformatted sources to standard output.
If a file's formatting is different than gofmt's, print diffs
@@ -37,10 +39,10 @@ The flags are:
the original file is restored from an automatic backup.
Debugging support:
+
-cpuprofile filename
Write cpu profile to the specified file.
-
The rewrite rule specified with the -r flag must be a string of the form:
pattern -> replacement
@@ -57,7 +59,7 @@ such a fragment, gofmt preserves leading indentation as well as leading
and trailing spaces, so that individual sections of a Go program can be
formatted by piping them through gofmt.
-Examples
+# Examples
To check files for unnecessary parentheses:
@@ -71,7 +73,7 @@ To convert the package tree from explicit slice upper bounds to implicit ones:
gofmt -r 'α[β:len(α)] -> α[β:]' -w $GOROOT/src
-The simplify command
+# The simplify command
When invoked with -s gofmt will make the following source transformations where possible.
diff --git a/vendor/github.com/golangci/gofmt/gofmt/gofmt.go b/vendor/github.com/golangci/gofmt/gofmt/gofmt.go
index e7612afae..be046f34c 100644
--- a/vendor/github.com/golangci/gofmt/gofmt/gofmt.go
+++ b/vendor/github.com/golangci/gofmt/gofmt/gofmt.go
@@ -76,6 +76,11 @@ func initParserMode() {
if *allErrors {
parserMode |= parser.AllErrors
}
+ // It's only -r that makes use of go/ast's object resolution,
+ // so avoid the unnecessary work if the flag isn't used.
+ if *rewriteRule == "" {
+ parserMode |= parser.SkipObjectResolution
+ }
}
func isGoFile(f fs.DirEntry) bool {
@@ -286,12 +291,9 @@ func processFile(filename string, info fs.FileInfo, in io.Reader, r *reporter) e
}
}
if *doDiff {
- data, err := diffWithReplaceTempFile(src, res, filename)
- if err != nil {
- return fmt.Errorf("computing diff: %s", err)
- }
- fmt.Fprintf(r, "diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
- r.Write(data)
+ newName := filepath.ToSlash(filename)
+ oldName := newName + ".orig"
+ r.Write(diff.Diff(oldName, src, newName, res))
}
}
@@ -350,7 +352,12 @@ func readFile(filename string, info fs.FileInfo, in io.Reader) ([]byte, error) {
// stop to avoid corrupting it.)
src := make([]byte, size+1)
n, err := io.ReadFull(in, src)
- if err != nil && err != io.ErrUnexpectedEOF {
+ switch err {
+ case nil, io.EOF, io.ErrUnexpectedEOF:
+ // io.ReadFull returns io.EOF (for an empty file) or io.ErrUnexpectedEOF
+ // (for a non-empty file) if the file was changed unexpectedly. Continue
+ // with comparing file sizes in those cases.
+ default:
return nil, err
}
if n < size {
@@ -463,43 +470,6 @@ func fileWeight(path string, info fs.FileInfo) int64 {
return info.Size()
}
-func diffWithReplaceTempFile(b1, b2 []byte, filename string) ([]byte, error) {
- data, err := diff.Diff("gofmt", b1, b2)
- if len(data) > 0 {
- return replaceTempFilename(data, filename)
- }
- return data, err
-}
-
-// replaceTempFilename replaces temporary filenames in diff with actual one.
-//
-// --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500
-// +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500
-// ...
-// ->
-// --- path/to/file.go.orig 2017-02-03 19:13:00.280468375 -0500
-// +++ path/to/file.go 2017-02-03 19:13:00.280468375 -0500
-// ...
-func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
- bs := bytes.SplitN(diff, []byte{'\n'}, 3)
- if len(bs) < 3 {
- return nil, fmt.Errorf("got unexpected diff for %s", filename)
- }
- // Preserve timestamps.
- var t0, t1 []byte
- if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
- t0 = bs[0][i:]
- }
- if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
- t1 = bs[1][i:]
- }
- // Always print filepath with slash separator.
- f := filepath.ToSlash(filename)
- bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
- bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
- return bytes.Join(bs, []byte{'\n'}), nil
-}
-
const chmodSupported = runtime.GOOS != "windows"
// backupFile writes data to a new file named filename<number> with permissions perm,
diff --git a/vendor/github.com/golangci/gofmt/gofmt/golangci.go b/vendor/github.com/golangci/gofmt/gofmt/golangci.go
index c9c3fe2ae..a69611e1d 100644
--- a/vendor/github.com/golangci/gofmt/gofmt/golangci.go
+++ b/vendor/github.com/golangci/gofmt/gofmt/golangci.go
@@ -8,8 +8,14 @@ import (
"go/printer"
"go/token"
"os"
+ "path/filepath"
+ "sync"
+
+ "github.com/golangci/gofmt/gofmt/internal/diff"
)
+var parserModeMu sync.RWMutex
+
type RewriteRule struct {
Pattern string
Replacement string
@@ -31,7 +37,9 @@ func RunRewrite(filename string, needSimplify bool, rewriteRules []RewriteRule)
fset := token.NewFileSet()
+ parserModeMu.Lock()
initParserMode()
+ parserModeMu.Unlock()
file, sourceAdj, indentAdj, err := parse(fset, filename, src, false)
if err != nil {
@@ -59,12 +67,10 @@ func RunRewrite(filename string, needSimplify bool, rewriteRules []RewriteRule)
}
// formatting has changed
- data, err := diffWithReplaceTempFile(src, res, filename)
- if err != nil {
- return nil, fmt.Errorf("error computing diff: %s", err)
- }
+ newName := filepath.ToSlash(filename)
+ oldName := newName + ".orig"
- return data, nil
+ return diff.Diff(oldName, src, newName, res), nil
}
func rewriteFileContent(fset *token.FileSet, file *ast.File, rewriteRules []RewriteRule) (*ast.File, error) {
diff --git a/vendor/github.com/golangci/gofmt/gofmt/internal.go b/vendor/github.com/golangci/gofmt/gofmt/internal.go
index 1abbdd698..31a825bf8 100644
--- a/vendor/github.com/golangci/gofmt/gofmt/internal.go
+++ b/vendor/github.com/golangci/gofmt/gofmt/internal.go
@@ -26,6 +26,13 @@ func parse(fset *token.FileSet, filename string, src []byte, fragmentOk bool) (
indentAdj int,
err error,
) {
+
+ // START - Change related to usgae inside golangci-lint
+ parserModeMu.Lock()
+ parserMode := parserMode
+ parserModeMu.Unlock()
+ // END - Change related to usgae inside golangci-lint
+
// Try as whole source file.
file, err = parser.ParseFile(fset, filename, src, parserMode)
// If there's no error, return. If the error is that the source file didn't begin with a
diff --git a/vendor/github.com/golangci/gofmt/gofmt/internal/diff/diff.go b/vendor/github.com/golangci/gofmt/gofmt/internal/diff/diff.go
index cbd0529ec..47b285671 100644
--- a/vendor/github.com/golangci/gofmt/gofmt/internal/diff/diff.go
+++ b/vendor/github.com/golangci/gofmt/gofmt/internal/diff/diff.go
@@ -1,79 +1,261 @@
-// Copyright 2019 The Go Authors. All rights reserved.
+// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// Package diff implements a Diff function that compare two inputs
-// using the 'diff' tool.
package diff
import (
"bytes"
- "io/ioutil"
- "os"
- "runtime"
-
- exec "github.com/golangci/gofmt/gofmt/internal/execabs"
+ "fmt"
+ "sort"
+ "strings"
)
-// Returns diff of two arrays of bytes in diff tool format.
-func Diff(prefix string, b1, b2 []byte) ([]byte, error) {
- f1, err := writeTempFile(prefix, b1)
- if err != nil {
- return nil, err
+// A pair is a pair of values tracked for both the x and y side of a diff.
+// It is typically a pair of line indexes.
+type pair struct{ x, y int }
+
+// Diff returns an anchored diff of the two texts old and new
+// in the “unified diff” format. If old and new are identical,
+// Diff returns a nil slice (no output).
+//
+// Unix diff implementations typically look for a diff with
+// the smallest number of lines inserted and removed,
+// which can in the worst case take time quadratic in the
+// number of lines in the texts. As a result, many implementations
+// either can be made to run for a long time or cut off the search
+// after a predetermined amount of work.
+//
+// In contrast, this implementation looks for a diff with the
+// smallest number of “unique” lines inserted and removed,
+// where unique means a line that appears just once in both old and new.
+// We call this an “anchored diff” because the unique lines anchor
+// the chosen matching regions. An anchored diff is usually clearer
+// than a standard diff, because the algorithm does not try to
+// reuse unrelated blank lines or closing braces.
+// The algorithm also guarantees to run in O(n log n) time
+// instead of the standard O(n²) time.
+//
+// Some systems call this approach a “patience diff,” named for
+// the “patience sorting” algorithm, itself named for a solitaire card game.
+// We avoid that name for two reasons. First, the name has been used
+// for a few different variants of the algorithm, so it is imprecise.
+// Second, the name is frequently interpreted as meaning that you have
+// to wait longer (to be patient) for the diff, meaning that it is a slower algorithm,
+// when in fact the algorithm is faster than the standard one.
+func Diff(oldName string, old []byte, newName string, new []byte) []byte {
+ if bytes.Equal(old, new) {
+ return nil
}
- defer os.Remove(f1)
+ x := lines(old)
+ y := lines(new)
+
+ // Print diff header.
+ var out bytes.Buffer
+ fmt.Fprintf(&out, "diff %s %s\n", oldName, newName)
+ fmt.Fprintf(&out, "--- %s\n", oldName)
+ fmt.Fprintf(&out, "+++ %s\n", newName)
+
+ // Loop over matches to consider,
+ // expanding each match to include surrounding lines,
+ // and then printing diff chunks.
+ // To avoid setup/teardown cases outside the loop,
+ // tgs returns a leading {0,0} and trailing {len(x), len(y)} pair
+ // in the sequence of matches.
+ var (
+ done pair // printed up to x[:done.x] and y[:done.y]
+ chunk pair // start lines of current chunk
+ count pair // number of lines from each side in current chunk
+ ctext []string // lines for current chunk
+ )
+ for _, m := range tgs(x, y) {
+ if m.x < done.x {
+ // Already handled scanning forward from earlier match.
+ continue
+ }
- f2, err := writeTempFile(prefix, b2)
- if err != nil {
- return nil, err
+ // Expand matching lines as far possible,
+ // establishing that x[start.x:end.x] == y[start.y:end.y].
+ // Note that on the first (or last) iteration we may (or definitey do)
+ // have an empty match: start.x==end.x and start.y==end.y.
+ start := m
+ for start.x > done.x && start.y > done.y && x[start.x-1] == y[start.y-1] {
+ start.x--
+ start.y--
+ }
+ end := m
+ for end.x < len(x) && end.y < len(y) && x[end.x] == y[end.y] {
+ end.x++
+ end.y++
+ }
+
+ // Emit the mismatched lines before start into this chunk.
+ // (No effect on first sentinel iteration, when start = {0,0}.)
+ for _, s := range x[done.x:start.x] {
+ ctext = append(ctext, "-"+s)
+ count.x++
+ }
+ for _, s := range y[done.y:start.y] {
+ ctext = append(ctext, "+"+s)
+ count.y++
+ }
+
+ // If we're not at EOF and have too few common lines,
+ // the chunk includes all the common lines and continues.
+ const C = 3 // number of context lines
+ if (end.x < len(x) || end.y < len(y)) &&
+ (end.x-start.x < C || (len(ctext) > 0 && end.x-start.x < 2*C)) {
+ for _, s := range x[start.x:end.x] {
+ ctext = append(ctext, " "+s)
+ count.x++
+ count.y++
+ }
+ done = end
+ continue
+ }
+
+ // End chunk with common lines for context.
+ if len(ctext) > 0 {
+ n := end.x - start.x
+ if n > C {
+ n = C
+ }
+ for _, s := range x[start.x : start.x+n] {
+ ctext = append(ctext, " "+s)
+ count.x++
+ count.y++
+ }
+ done = pair{start.x + n, start.y + n}
+
+ // Format and emit chunk.
+ // Convert line numbers to 1-indexed.
+ // Special case: empty file shows up as 0,0 not 1,0.
+ if count.x > 0 {
+ chunk.x++
+ }
+ if count.y > 0 {
+ chunk.y++
+ }
+ fmt.Fprintf(&out, "@@ -%d,%d +%d,%d @@\n", chunk.x, count.x, chunk.y, count.y)
+ for _, s := range ctext {
+ out.WriteString(s)
+ }
+ count.x = 0
+ count.y = 0
+ ctext = ctext[:0]
+ }
+
+ // If we reached EOF, we're done.
+ if end.x >= len(x) && end.y >= len(y) {
+ break
+ }
+
+ // Otherwise start a new chunk.
+ chunk = pair{end.x - C, end.y - C}
+ for _, s := range x[chunk.x:end.x] {
+ ctext = append(ctext, " "+s)
+ count.x++
+ count.y++
+ }
+ done = end
}
- defer os.Remove(f2)
- cmd := "diff"
- if runtime.GOOS == "plan9" {
- cmd = "/bin/ape/diff"
+ return out.Bytes()
+}
+
+// lines returns the lines in the file x, including newlines.
+// If the file does not end in a newline, one is supplied
+// along with a warning about the missing newline.
+func lines(x []byte) []string {
+ l := strings.SplitAfter(string(x), "\n")
+ if l[len(l)-1] == "" {
+ l = l[:len(l)-1]
+ } else {
+ // Treat last line as having a message about the missing newline attached,
+ // using the same text as BSD/GNU diff (including the leading backslash).
+ l[len(l)-1] += "\n\\ No newline at end of file\n"
}
+ return l
+}
- data, err := exec.Command(cmd, "-u", f1, f2).CombinedOutput()
- if len(data) > 0 {
- // diff exits with a non-zero status when the files don't match.
- // Ignore that failure as long as we get output.
- err = nil
+// tgs returns the pairs of indexes of the longest common subsequence
+// of unique lines in x and y, where a unique line is one that appears
+// once in x and once in y.
+//
+// The longest common subsequence algorithm is as described in
+// Thomas G. Szymanski, “A Special Case of the Maximal Common
+// Subsequence Problem,” Princeton TR #170 (January 1975),
+// available at https://research.swtch.com/tgs170.pdf.
+func tgs(x, y []string) []pair {
+ // Count the number of times each string appears in a and b.
+ // We only care about 0, 1, many, counted as 0, -1, -2
+ // for the x side and 0, -4, -8 for the y side.
+ // Using negative numbers now lets us distinguish positive line numbers later.
+ m := make(map[string]int)
+ for _, s := range x {
+ if c := m[s]; c > -2 {
+ m[s] = c - 1
+ }
+ }
+ for _, s := range y {
+ if c := m[s]; c > -8 {
+ m[s] = c - 4
+ }
}
- // If we are on Windows and the diff is Cygwin diff,
- // machines can get into a state where every Cygwin
- // command works fine but prints a useless message like:
+ // Now unique strings can be identified by m[s] = -1+-4.
//
- // Cygwin WARNING:
- // Couldn't compute FAST_CWD pointer. This typically occurs if you're using
- // an older Cygwin version on a newer Windows. Please update to the latest
- // available Cygwin version from https://cygwin.com/. If the problem persists,
- // please see https://cygwin.com/problems.html
- //
- // Skip over that message and just return the actual diff.
- if len(data) > 0 && !bytes.HasPrefix(data, []byte("--- ")) {
- i := bytes.Index(data, []byte("\n--- "))
- if i >= 0 && i < 80*10 && bytes.Contains(data[:i], []byte("://cygwin.com/")) {
- data = data[i+1:]
+ // Gather the indexes of those strings in x and y, building:
+ // xi[i] = increasing indexes of unique strings in x.
+ // yi[i] = increasing indexes of unique strings in y.
+ // inv[i] = index j such that x[xi[i]] = y[yi[j]].
+ var xi, yi, inv []int
+ for i, s := range y {
+ if m[s] == -1+-4 {
+ m[s] = len(yi)
+ yi = append(yi, i)
+ }
+ }
+ for i, s := range x {
+ if j, ok := m[s]; ok && j >= 0 {
+ xi = append(xi, i)
+ inv = append(inv, j)
}
}
- return data, err
-}
-
-func writeTempFile(prefix string, data []byte) (string, error) {
- file, err := ioutil.TempFile("", prefix)
- if err != nil {
- return "", err
+ // Apply Algorithm A from Szymanski's paper.
+ // In those terms, A = J = inv and B = [0, n).
+ // We add sentinel pairs {0,0}, and {len(x),len(y)}
+ // to the returned sequence, to help the processing loop.
+ J := inv
+ n := len(xi)
+ T := make([]int, n)
+ L := make([]int, n)
+ for i := range T {
+ T[i] = n + 1
+ }
+ for i := 0; i < n; i++ {
+ k := sort.Search(n, func(k int) bool {
+ return T[k] >= J[i]
+ })
+ T[k] = J[i]
+ L[i] = k + 1
}
- _, err = file.Write(data)
- if err1 := file.Close(); err == nil {
- err = err1
+ k := 0
+ for _, v := range L {
+ if k < v {
+ k = v
+ }
}
- if err != nil {
- os.Remove(file.Name())
- return "", err
+ seq := make([]pair, 2+k)
+ seq[1+k] = pair{len(x), len(y)} // sentinel at end
+ lastj := n
+ for i := n - 1; i >= 0; i-- {
+ if L[i] == k && J[i] < lastj {
+ seq[k] = pair{xi[i], yi[J[i]]}
+ k--
+ }
}
- return file.Name(), nil
+ seq[0] = pair{0, 0} // sentinel at start
+ return seq
}
diff --git a/vendor/github.com/golangci/gofmt/gofmt/internal/execabs/execabs.go b/vendor/github.com/golangci/gofmt/gofmt/internal/execabs/execabs.go
deleted file mode 100644
index 9a05d971d..000000000
--- a/vendor/github.com/golangci/gofmt/gofmt/internal/execabs/execabs.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package execabs is a drop-in replacement for os/exec
-// that requires PATH lookups to find absolute paths.
-// That is, execabs.Command("cmd") runs the same PATH lookup
-// as exec.Command("cmd"), but if the result is a path
-// which is relative, the Run and Start methods will report
-// an error instead of running the executable.
-package execabs
-
-import (
- "context"
- "fmt"
- "os/exec"
- "path/filepath"
- "reflect"
- "unsafe"
-)
-
-var ErrNotFound = exec.ErrNotFound
-
-type (
- Cmd = exec.Cmd
- Error = exec.Error
- ExitError = exec.ExitError
-)
-
-func relError(file, path string) error {
- return fmt.Errorf("%s resolves to executable relative to current directory (.%c%s)", file, filepath.Separator, path)
-}
-
-func LookPath(file string) (string, error) {
- path, err := exec.LookPath(file)
- if err != nil {
- return "", err
- }
- if filepath.Base(file) == file && !filepath.IsAbs(path) {
- return "", relError(file, path)
- }
- return path, nil
-}
-
-func fixCmd(name string, cmd *exec.Cmd) {
- if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) {
- // exec.Command was called with a bare binary name and
- // exec.LookPath returned a path which is not absolute.
- // Set cmd.lookPathErr and clear cmd.Path so that it
- // cannot be run.
- lookPathErr := (*error)(unsafe.Pointer(reflect.ValueOf(cmd).Elem().FieldByName("lookPathErr").Addr().Pointer()))
- if *lookPathErr == nil {
- *lookPathErr = relError(name, cmd.Path)
- }
- cmd.Path = ""
- }
-}
-
-func CommandContext(ctx context.Context, name string, arg ...string) *exec.Cmd {
- cmd := exec.CommandContext(ctx, name, arg...)
- fixCmd(name, cmd)
- return cmd
-
-}
-
-func Command(name string, arg ...string) *exec.Cmd {
- cmd := exec.Command(name, arg...)
- fixCmd(name, cmd)
- return cmd
-}
diff --git a/vendor/github.com/golangci/gofmt/gofmt/readme.md b/vendor/github.com/golangci/gofmt/gofmt/readme.md
index 36a716d81..c2faaab82 100644
--- a/vendor/github.com/golangci/gofmt/gofmt/readme.md
+++ b/vendor/github.com/golangci/gofmt/gofmt/readme.md
@@ -1,3 +1,5 @@
# Hard Fork of gofmt
2022-08-31: Sync with go1.18.5
+2023-10-04: Sync with go1.19.13
+2023-10-04: Sync with go1.20.8
diff --git a/vendor/github.com/golangci/gofmt/gofmt/simplify.go b/vendor/github.com/golangci/gofmt/gofmt/simplify.go
index 2c75495a6..3b34d562b 100644
--- a/vendor/github.com/golangci/gofmt/gofmt/simplify.go
+++ b/vendor/github.com/golangci/gofmt/gofmt/simplify.go
@@ -53,22 +53,26 @@ func (s simplifier) Visit(node ast.Node) ast.Visitor {
// can be simplified to: s[a:]
// if s is "simple enough" (for now we only accept identifiers)
//
- // Note: This may not be correct because len may have been redeclared in another
- // file belonging to the same package. However, this is extremely unlikely
- // and so far (April 2016, after years of supporting this rewrite feature)
+ // Note: This may not be correct because len may have been redeclared in
+ // the same package. However, this is extremely unlikely and so far
+ // (April 2022, after years of supporting this rewrite feature)
// has never come up, so let's keep it working as is (see also #15153).
+ //
+ // Also note that this code used to use go/ast's object tracking,
+ // which was removed in exchange for go/parser.Mode.SkipObjectResolution.
+ // False positives are extremely unlikely as described above,
+ // and go/ast's object tracking is incomplete in any case.
if n.Max != nil {
// - 3-index slices always require the 2nd and 3rd index
break
}
- if s, _ := n.X.(*ast.Ident); s != nil && s.Obj != nil {
- // the array/slice object is a single, resolved identifier
+ if s, _ := n.X.(*ast.Ident); s != nil {
+ // the array/slice object is a single identifier
if call, _ := n.High.(*ast.CallExpr); call != nil && len(call.Args) == 1 && !call.Ellipsis.IsValid() {
// the high expression is a function call with a single argument
- if fun, _ := call.Fun.(*ast.Ident); fun != nil && fun.Name == "len" && fun.Obj == nil {
- // the function called is "len" and it is not locally defined; and
- // because we don't have dot imports, it must be the predefined len()
- if arg, _ := call.Args[0].(*ast.Ident); arg != nil && arg.Obj == s.Obj {
+ if fun, _ := call.Fun.(*ast.Ident); fun != nil && fun.Name == "len" {
+ // the function called is "len"
+ if arg, _ := call.Args[0].(*ast.Ident); arg != nil && arg.Name == s.Name {
// the len argument is the array/slice object
n.High = nil
}
diff --git a/vendor/github.com/golangci/gofmt/goimports/goimports.go b/vendor/github.com/golangci/gofmt/goimports/goimports.go
index 1fa3328f8..20d92e119 100644
--- a/vendor/github.com/golangci/gofmt/goimports/goimports.go
+++ b/vendor/github.com/golangci/gofmt/goimports/goimports.go
@@ -14,7 +14,7 @@ import (
"runtime"
)
-// Extracted from golang.org/x/tools@v0.1.12/cmd/goimports/goimports.go
+// Extracted from golang.org/x/tools@v0.13.0/cmd/goimports/goimports.go
func writeTempFile(dir, prefix string, data []byte) (string, error) {
file, err := ioutil.TempFile(dir, prefix)
diff --git a/vendor/github.com/golangci/gofmt/goimports/golangci.go b/vendor/github.com/golangci/gofmt/goimports/golangci.go
index 7edc37937..6ff286ae0 100644
--- a/vendor/github.com/golangci/gofmt/goimports/golangci.go
+++ b/vendor/github.com/golangci/gofmt/goimports/golangci.go
@@ -3,7 +3,7 @@ package goimports
import (
"bytes"
"fmt"
- "io/ioutil"
+ "os"
"golang.org/x/tools/imports"
)
@@ -11,7 +11,7 @@ import (
// Run runs goimports.
// The local prefixes (comma separated) must be defined through the global variable imports.LocalPrefix.
func Run(filename string) ([]byte, error) {
- src, err := ioutil.ReadFile(filename)
+ src, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
diff --git a/vendor/github.com/golangci/gofmt/goimports/readme.md b/vendor/github.com/golangci/gofmt/goimports/readme.md
index 6c793eb7d..e57ed550b 100644
--- a/vendor/github.com/golangci/gofmt/goimports/readme.md
+++ b/vendor/github.com/golangci/gofmt/goimports/readme.md
@@ -1,3 +1,4 @@
# Hard Fork of goimports
2022-08-31: Sync with golang.org/x/tools v0.1.12
+2023-10-04: Sync with golang.org/x/tools v0.13.0
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go
index 5fe4c784d..efe62ced2 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go
@@ -149,10 +149,10 @@ func (e *Executor) needVersionOption() bool {
}
func initRootFlagSet(fs *pflag.FlagSet, cfg *config.Config, needVersionOption bool) {
- fs.BoolVarP(&cfg.Run.IsVerbose, "verbose", "v", false, wh("verbose output"))
+ fs.BoolVarP(&cfg.Run.IsVerbose, "verbose", "v", false, wh("Verbose output"))
var silent bool
- fs.BoolVarP(&silent, "silent", "s", false, wh("disables congrats outputs"))
+ fs.BoolVarP(&silent, "silent", "s", false, wh("Disables congrats outputs"))
if err := fs.MarkHidden("silent"); err != nil {
panic(err)
}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/config/issues.go b/vendor/github.com/golangci/golangci-lint/pkg/config/issues.go
index 417b28bdb..5968d83d5 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/config/issues.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/issues.go
@@ -54,7 +54,7 @@ var DefaultExcludePatterns = []ExcludePattern{
},
{
ID: "EXC0008",
- Pattern: "(G104|G307)",
+ Pattern: "(G104)",
Linter: "gosec",
Why: "Duplicated errcheck checks",
},
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/config/linters_settings.go b/vendor/github.com/golangci/golangci-lint/pkg/config/linters_settings.go
index 805d0ff47..0fee9f81e 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/config/linters_settings.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/linters_settings.go
@@ -113,6 +113,12 @@ var defaultLintersSettings = LintersSettings{
Ignore: "",
Qualified: false,
},
+ SlogLint: SlogLintSettings{
+ KVOnly: false,
+ AttrOnly: false,
+ NoRawKeys: false,
+ ArgsOnSepLines: false,
+ },
TagAlign: TagAlignSettings{
Align: true,
Sort: true,
@@ -126,6 +132,15 @@ var defaultLintersSettings = LintersSettings{
Unparam: UnparamSettings{
Algo: "cha",
},
+ Unused: UnusedSettings{
+ FieldWritesAreUses: true,
+ PostStatementsAreReads: false,
+ ExportedIsUsed: true,
+ ExportedFieldsAreUsed: true,
+ ParametersAreUsed: true,
+ LocalVariablesAreUsed: true,
+ GeneratedIsUsed: true,
+ },
UseStdlibVars: UseStdlibVarsSettings{
HTTPMethod: true,
HTTPStatusCode: true,
@@ -213,15 +228,18 @@ type LintersSettings struct {
Reassign ReassignSettings
Revive ReviveSettings
RowsErrCheck RowsErrCheckSettings
+ SlogLint SlogLintSettings
Staticcheck StaticCheckSettings
Structcheck StructCheckSettings
Stylecheck StaticCheckSettings
TagAlign TagAlignSettings
Tagliatelle TagliatelleSettings
+ Testifylint TestifylintSettings
Tenv TenvSettings
Testpackage TestpackageSettings
Thelper ThelperSettings
Unparam UnparamSettings
+ Unused UnusedSettings
UseStdlibVars UseStdlibVarsSettings
Varcheck VarCheckSettings
Varnamelen VarnamelenSettings
@@ -292,6 +310,7 @@ type DuplSettings struct {
type DupWordSettings struct {
Keywords []string `mapstructure:"keywords"`
+ Ignore []string `mapstructure:"ignore"`
}
type ErrcheckSettings struct {
@@ -393,13 +412,14 @@ type GciSettings struct {
}
type GinkgoLinterSettings struct {
- SuppressLenAssertion bool `mapstructure:"suppress-len-assertion"`
- SuppressNilAssertion bool `mapstructure:"suppress-nil-assertion"`
- SuppressErrAssertion bool `mapstructure:"suppress-err-assertion"`
- SuppressCompareAssertion bool `mapstructure:"suppress-compare-assertion"`
- SuppressAsyncAssertion bool `mapstructure:"suppress-async-assertion"`
- ForbidFocusContainer bool `mapstructure:"forbid-focus-container"`
- AllowHaveLenZero bool `mapstructure:"allow-havelen-zero"`
+ SuppressLenAssertion bool `mapstructure:"suppress-len-assertion"`
+ SuppressNilAssertion bool `mapstructure:"suppress-nil-assertion"`
+ SuppressErrAssertion bool `mapstructure:"suppress-err-assertion"`
+ SuppressCompareAssertion bool `mapstructure:"suppress-compare-assertion"`
+ SuppressAsyncAssertion bool `mapstructure:"suppress-async-assertion"`
+ SuppressTypeCompareWarning bool `mapstructure:"suppress-type-compare-assertion"`
+ ForbidFocusContainer bool `mapstructure:"forbid-focus-container"`
+ AllowHaveLenZero bool `mapstructure:"allow-havelen-zero"`
}
type GocognitSettings struct {
@@ -704,6 +724,13 @@ type RowsErrCheckSettings struct {
Packages []string
}
+type SlogLintSettings struct {
+ KVOnly bool `mapstructure:"kv-only"`
+ AttrOnly bool `mapstructure:"attr-only"`
+ NoRawKeys bool `mapstructure:"no-raw-keys"`
+ ArgsOnSepLines bool `mapstructure:"args-on-sep-lines"`
+}
+
type StaticCheckSettings struct {
// Deprecated: use the global `run.go` instead.
GoVersion string `mapstructure:"go"`
@@ -736,6 +763,19 @@ type TagliatelleSettings struct {
}
}
+type TestifylintSettings struct {
+ EnableAll bool `mapstructure:"enable-all"`
+ EnabledCheckers []string `mapstructure:"enable"`
+
+ ExpectedActual struct {
+ ExpVarPattern string `mapstructure:"pattern"`
+ } `mapstructure:"expected-actual"`
+
+ SuiteExtraAssertCall struct {
+ Mode string `mapstructure:"mode"`
+ } `mapstructure:"suite-extra-assert-call"`
+}
+
type TestpackageSettings struct {
SkipRegexp string `mapstructure:"skip-regexp"`
AllowPackages []string `mapstructure:"allow-packages"`
@@ -778,6 +818,16 @@ type UnparamSettings struct {
Algo string
}
+type UnusedSettings struct {
+ FieldWritesAreUses bool `mapstructure:"field-writes-are-uses"`
+ PostStatementsAreReads bool `mapstructure:"post-statements-are-reads"`
+ ExportedIsUsed bool `mapstructure:"exported-is-used"`
+ ExportedFieldsAreUsed bool `mapstructure:"exported-fields-are-used"`
+ ParametersAreUsed bool `mapstructure:"parameters-are-used"`
+ LocalVariablesAreUsed bool `mapstructure:"local-variables-are-used"`
+ GeneratedIsUsed bool `mapstructure:"generated-is-used"`
+}
+
type VarCheckSettings struct {
CheckExportedFields bool `mapstructure:"exported-fields"`
}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupword.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupword.go
index f5a99bc0d..6f079ffc8 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupword.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupword.go
@@ -17,6 +17,7 @@ func NewDupWord(setting *config.DupWordSettings) *goanalysis.Linter {
if setting != nil {
cfgMap[a.Name] = map[string]any{
"keyword": strings.Join(setting.Keywords, ","),
+ "ignore": strings.Join(setting.Ignore, ","),
}
}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/ginkgolinter.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/ginkgolinter.go
index 7b8102b63..8919de15b 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/golinters/ginkgolinter.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/ginkgolinter.go
@@ -14,13 +14,14 @@ func NewGinkgoLinter(cfg *config.GinkgoLinterSettings) *goanalysis.Linter {
cfgMap := make(map[string]map[string]any)
if cfg != nil {
cfgMap[a.Name] = map[string]any{
- "suppress-len-assertion": cfg.SuppressLenAssertion,
- "suppress-nil-assertion": cfg.SuppressNilAssertion,
- "suppress-err-assertion": cfg.SuppressErrAssertion,
- "suppress-compare-assertion": cfg.SuppressCompareAssertion,
- "suppress-async-assertion": cfg.SuppressAsyncAssertion,
- "forbid-focus-container": cfg.ForbidFocusContainer,
- "allow-havelen-0": cfg.AllowHaveLenZero,
+ "suppress-len-assertion": cfg.SuppressLenAssertion,
+ "suppress-nil-assertion": cfg.SuppressNilAssertion,
+ "suppress-err-assertion": cfg.SuppressErrAssertion,
+ "suppress-compare-assertion": cfg.SuppressCompareAssertion,
+ "suppress-async-assertion": cfg.SuppressAsyncAssertion,
+ "suppress-type-compare-assertion": cfg.SuppressTypeCompareWarning,
+ "forbid-focus-container": cfg.ForbidFocusContainer,
+ "allow-havelen-0": cfg.AllowHaveLenZero,
}
}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecksumtype.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecksumtype.go
new file mode 100644
index 000000000..fcc0cad58
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecksumtype.go
@@ -0,0 +1,80 @@
+package golinters
+
+import (
+ "strings"
+ "sync"
+
+ gochecksumtype "github.com/alecthomas/go-check-sumtype"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const goCheckSumTypeName = "gochecksumtype"
+
+func NewGoCheckSumType() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: goCheckSumTypeName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ Run: func(pass *analysis.Pass) (any, error) {
+ issues, err := runGoCheckSumType(pass)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, issues...)
+ mu.Unlock()
+
+ return nil, nil
+ },
+ }
+
+ return goanalysis.NewLinter(
+ goCheckSumTypeName,
+ `Run exhaustiveness checks on Go "sum types"`,
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithIssuesReporter(func(ctx *linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
+
+func runGoCheckSumType(pass *analysis.Pass) ([]goanalysis.Issue, error) {
+ var resIssues []goanalysis.Issue
+
+ pkg := &packages.Package{
+ Fset: pass.Fset,
+ Syntax: pass.Files,
+ Types: pass.Pkg,
+ TypesInfo: pass.TypesInfo,
+ }
+
+ var unknownError error
+ errors := gochecksumtype.Run([]*packages.Package{pkg})
+ for _, err := range errors {
+ err, ok := err.(gochecksumtype.Error)
+ if !ok {
+ unknownError = err
+ continue
+ }
+
+ resIssues = append(resIssues, goanalysis.NewIssue(&result.Issue{
+ FromLinter: goCheckSumTypeName,
+ Text: strings.TrimPrefix(err.Error(), err.Pos().String()+": "),
+ Pos: err.Pos(),
+ }, pass))
+ }
+
+ return resIssues, unknownError
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go
index 5a1309cd0..4e16fb142 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go
@@ -2,6 +2,7 @@ package golinters
import (
"golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/appends"
"golang.org/x/tools/go/analysis/passes/asmdecl"
"golang.org/x/tools/go/analysis/passes/assign"
"golang.org/x/tools/go/analysis/passes/atomic"
@@ -53,6 +54,7 @@ import (
var (
allAnalyzers = []*analysis.Analyzer{
+ appends.Analyzer,
asmdecl.Analyzer,
assign.Analyzer,
atomic.Analyzer,
@@ -95,8 +97,9 @@ var (
unusedwrite.Analyzer,
}
- // https://github.com/golang/go/blob/c19c4c566c63818dfd059b352e52c4710eecf14d/src/cmd/vet/main.go#L47-L78
+ // https://github.com/golang/go/blob/b56645a87b28840a180d64077877cb46570b4176/src/cmd/vet/main.go#L49-L81
defaultAnalyzers = []*analysis.Analyzer{
+ appends.Analyzer,
asmdecl.Analyzer,
assign.Analyzer,
atomic.Analyzer,
@@ -105,6 +108,7 @@ var (
cgocall.Analyzer,
composite.Analyzer,
copylock.Analyzer,
+ defers.Analyzer,
directive.Analyzer,
errorsas.Analyzer,
framepointer.Analyzer,
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/inamedparam.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/inamedparam.go
new file mode 100644
index 000000000..290630755
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/inamedparam.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+ "github.com/macabu/inamedparam"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewINamedParam() *goanalysis.Linter {
+ a := inamedparam.Analyzer
+
+ return goanalysis.NewLinter(
+ a.Name,
+ a.Doc,
+ []*analysis.Analyzer{a},
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/perfsprint.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/perfsprint.go
new file mode 100644
index 000000000..fb248a85d
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/perfsprint.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+ "github.com/catenacyber/perfsprint/analyzer"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewPerfSprint() *goanalysis.Linter {
+ a := analyzer.Analyzer
+
+ return goanalysis.NewLinter(
+ a.Name,
+ a.Doc,
+ []*analysis.Analyzer{a},
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/protogetter.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/protogetter.go
new file mode 100644
index 000000000..23325ad55
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/protogetter.go
@@ -0,0 +1,59 @@
+package golinters
+
+import (
+ "sync"
+
+ "github.com/ghostiam/protogetter"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewProtoGetter() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ a := protogetter.NewAnalyzer()
+ a.Run = func(pass *analysis.Pass) (any, error) {
+ pgIssues := protogetter.Run(pass, protogetter.GolangciLintMode)
+
+ issues := make([]goanalysis.Issue, len(pgIssues))
+ for i, issue := range pgIssues {
+ report := &result.Issue{
+ FromLinter: a.Name,
+ Pos: issue.Pos,
+ Text: issue.Message,
+ Replacement: &result.Replacement{
+ Inline: &result.InlineFix{
+ StartCol: issue.InlineFix.StartCol,
+ Length: issue.InlineFix.Length,
+ NewString: issue.InlineFix.NewString,
+ },
+ },
+ }
+
+ issues[i] = goanalysis.NewIssue(report, pass)
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, issues...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+
+ return goanalysis.NewLinter(
+ a.Name,
+ a.Doc,
+ []*analysis.Analyzer{a},
+ nil,
+ ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/revive.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/revive.go
index b57566e7a..28231957c 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/golinters/revive.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/revive.go
@@ -247,7 +247,7 @@ func safeTomlSlice(r []any) []any {
}
// This element is not exported by revive, so we need copy the code.
-// Extracted from https://github.com/mgechev/revive/blob/v1.3.0/config/config.go#L15
+// Extracted from https://github.com/mgechev/revive/blob/v1.3.4/config/config.go#L15
var defaultRules = []lint.Rule{
&rule.VarDeclarationsRule{},
&rule.PackageCommentsRule{},
@@ -267,7 +267,6 @@ var defaultRules = []lint.Rule{
&rule.TimeNamingRule{},
&rule.ContextKeysType{},
&rule.ContextAsArgumentRule{},
- &rule.IfReturnRule{},
&rule.EmptyBlockRule{},
&rule.SuperfluousElseRule{},
&rule.UnusedParamRule{},
@@ -317,12 +316,17 @@ var allRules = append([]lint.Rule{
&rule.FunctionLength{},
&rule.NestedStructs{},
&rule.UselessBreak{},
+ &rule.UncheckedTypeAssertionRule{},
&rule.TimeEqualRule{},
&rule.BannedCharsRule{},
&rule.OptimizeOperandsOrderRule{},
&rule.UseAnyRule{},
&rule.DataRaceRule{},
&rule.CommentSpacingsRule{},
+ &rule.IfReturnRule{},
+ &rule.RedundantImportAlias{},
+ &rule.ImportAliasNamingRule{},
+ &rule.EnforceMapStyleRule{},
}, defaultRules...)
const defaultConfidence = 0.8
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/sloglint.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/sloglint.go
new file mode 100644
index 000000000..b506d187f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/sloglint.go
@@ -0,0 +1,27 @@
+package golinters
+
+import (
+ "go-simpler.org/sloglint"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewSlogLint(settings *config.SlogLintSettings) *goanalysis.Linter {
+ var opts *sloglint.Options
+ if settings != nil {
+ opts = &sloglint.Options{
+ KVOnly: settings.KVOnly,
+ AttrOnly: settings.AttrOnly,
+ NoRawKeys: settings.NoRawKeys,
+ ArgsOnSepLines: settings.ArgsOnSepLines,
+ }
+ }
+
+ a := sloglint.New(opts)
+
+ return goanalysis.
+ NewLinter(a.Name, a.Doc, []*analysis.Analyzer{a}, nil).
+ WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/testifylint.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/testifylint.go
new file mode 100644
index 000000000..83bae2868
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/testifylint.go
@@ -0,0 +1,36 @@
+package golinters
+
+import (
+ "github.com/Antonboom/testifylint/analyzer"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewTestifylint(settings *config.TestifylintSettings) *goanalysis.Linter {
+ a := analyzer.New()
+
+ cfg := make(map[string]map[string]any)
+ if settings != nil {
+ cfg[a.Name] = map[string]any{
+ "enable-all": settings.EnableAll,
+ }
+ if len(settings.EnabledCheckers) > 0 {
+ cfg[a.Name]["enable"] = settings.EnabledCheckers
+ }
+ if p := settings.ExpectedActual.ExpVarPattern; p != "" {
+ cfg[a.Name]["expected-actual.pattern"] = p
+ }
+ if m := settings.SuiteExtraAssertCall.Mode; m != "" {
+ cfg[a.Name]["suite-extra-assert-call.mode"] = m
+ }
+ }
+
+ return goanalysis.NewLinter(
+ a.Name,
+ a.Doc,
+ []*analysis.Analyzer{a},
+ cfg,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go
index aa9374d34..89ae7e98a 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go
@@ -5,6 +5,9 @@ import (
"sync"
"golang.org/x/tools/go/analysis"
+ "honnef.co/go/tools/analysis/facts/directives"
+ "honnef.co/go/tools/analysis/facts/generated"
+ "honnef.co/go/tools/analysis/lint"
"honnef.co/go/tools/unused"
"github.com/golangci/golangci-lint/pkg/config"
@@ -15,11 +18,7 @@ import (
const unusedName = "unused"
-type UnusedSettings struct {
- GoVersion string
-}
-
-func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
+func NewUnused(settings *config.UnusedSettings, scSettings *config.StaticCheckSettings) *goanalysis.Linter {
var mu sync.Mutex
var resIssues []goanalysis.Issue
@@ -28,11 +27,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
Doc: unused.Analyzer.Analyzer.Doc,
Requires: unused.Analyzer.Analyzer.Requires,
Run: func(pass *analysis.Pass) (any, error) {
- issues, err := runUnused(pass)
- if err != nil {
- return nil, err
- }
-
+ issues := runUnused(pass, settings)
if len(issues) == 0 {
return nil, nil
}
@@ -45,7 +40,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
},
}
- setAnalyzerGoVersion(analyzer, getGoVersion(settings))
+ setAnalyzerGoVersion(analyzer, getGoVersion(scSettings))
return goanalysis.NewLinter(
unusedName,
@@ -57,21 +52,18 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
}).WithLoadMode(goanalysis.LoadModeTypesInfo)
}
-func runUnused(pass *analysis.Pass) ([]goanalysis.Issue, error) {
- res, err := unused.Analyzer.Analyzer.Run(pass)
- if err != nil {
- return nil, err
- }
+func runUnused(pass *analysis.Pass, cfg *config.UnusedSettings) []goanalysis.Issue {
+ res := getUnusedResults(pass, cfg)
used := make(map[string]bool)
- for _, obj := range res.(unused.Result).Used {
+ for _, obj := range res.Used {
used[fmt.Sprintf("%s %d %s", obj.Position.Filename, obj.Position.Line, obj.Name)] = true
}
var issues []goanalysis.Issue
// Inspired by https://github.com/dominikh/go-tools/blob/d694aadcb1f50c2d8ac0a1dd06217ebb9f654764/lintcmd/lint.go#L177-L197
- for _, object := range res.(unused.Result).Unused {
+ for _, object := range res.Unused {
if object.Kind == "type param" {
continue
}
@@ -90,5 +82,31 @@ func runUnused(pass *analysis.Pass) ([]goanalysis.Issue, error) {
issues = append(issues, issue)
}
- return issues, nil
+ return issues
+}
+
+func getUnusedResults(pass *analysis.Pass, settings *config.UnusedSettings) unused.Result {
+ opts := unused.Options{
+ FieldWritesAreUses: settings.FieldWritesAreUses,
+ PostStatementsAreReads: settings.PostStatementsAreReads,
+ ExportedIsUsed: settings.ExportedIsUsed,
+ ExportedFieldsAreUsed: settings.ExportedFieldsAreUsed,
+ ParametersAreUsed: settings.ParametersAreUsed,
+ LocalVariablesAreUsed: settings.LocalVariablesAreUsed,
+ GeneratedIsUsed: settings.GeneratedIsUsed,
+ }
+
+ // ref: https://github.com/dominikh/go-tools/blob/4ec1f474ca6c0feb8e10a8fcca4ab95f5b5b9881/internal/cmd/unused/unused.go#L68
+ nodes := unused.Graph(pass.Fset,
+ pass.Files,
+ pass.Pkg,
+ pass.TypesInfo,
+ pass.ResultOf[directives.Analyzer].([]lint.Directive),
+ pass.ResultOf[generated.Analyzer].(map[string]generated.Generator),
+ opts,
+ )
+
+ sg := unused.SerializedGraph{}
+ sg.Merge(nodes)
+ return sg.Results()
}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go
index 4de3a1116..fd329ce57 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go
@@ -127,16 +127,18 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
reassignCfg *config.ReassignSettings
reviveCfg *config.ReviveSettings
rowserrcheckCfg *config.RowsErrCheckSettings
+ sloglintCfg *config.SlogLintSettings
staticcheckCfg *config.StaticCheckSettings
structcheckCfg *config.StructCheckSettings
stylecheckCfg *config.StaticCheckSettings
tagalignCfg *config.TagAlignSettings
tagliatelleCfg *config.TagliatelleSettings
tenvCfg *config.TenvSettings
+ testifylintCfg *config.TestifylintSettings
testpackageCfg *config.TestpackageSettings
thelperCfg *config.ThelperSettings
unparamCfg *config.UnparamSettings
- unusedCfg *config.StaticCheckSettings
+ unusedCfg *config.UnusedSettings
usestdlibvars *config.UseStdlibVarsSettings
varcheckCfg *config.VarCheckSettings
varnamelenCfg *config.VarnamelenSettings
@@ -207,16 +209,18 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
reassignCfg = &m.cfg.LintersSettings.Reassign
reviveCfg = &m.cfg.LintersSettings.Revive
rowserrcheckCfg = &m.cfg.LintersSettings.RowsErrCheck
+ sloglintCfg = &m.cfg.LintersSettings.SlogLint
staticcheckCfg = &m.cfg.LintersSettings.Staticcheck
structcheckCfg = &m.cfg.LintersSettings.Structcheck
stylecheckCfg = &m.cfg.LintersSettings.Stylecheck
tagalignCfg = &m.cfg.LintersSettings.TagAlign
tagliatelleCfg = &m.cfg.LintersSettings.Tagliatelle
tenvCfg = &m.cfg.LintersSettings.Tenv
+ testifylintCfg = &m.cfg.LintersSettings.Testifylint
testpackageCfg = &m.cfg.LintersSettings.Testpackage
thelperCfg = &m.cfg.LintersSettings.Thelper
unparamCfg = &m.cfg.LintersSettings.Unparam
- unusedCfg = new(config.StaticCheckSettings)
+ unusedCfg = &m.cfg.LintersSettings.Unused
usestdlibvars = &m.cfg.LintersSettings.UseStdlibVars
varcheckCfg = &m.cfg.LintersSettings.Varcheck
varnamelenCfg = &m.cfg.LintersSettings.Varnamelen
@@ -245,9 +249,6 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
if stylecheckCfg != nil && stylecheckCfg.GoVersion != "" {
stylecheckCfg.GoVersion = trimGoVersion(m.cfg.Run.Go)
}
- if unusedCfg != nil && unusedCfg.GoVersion == "" {
- unusedCfg.GoVersion = trimGoVersion(m.cfg.Run.Go)
- }
}
const megacheckName = "megacheck"
@@ -439,6 +440,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithSince("v1.12.0").
WithPresets(linter.PresetStyle),
+ linter.NewConfig(golinters.NewGoCheckSumType()).
+ WithSince("v1.55.0").
+ WithPresets(linter.PresetBugs).
+ WithLoadForGoAnalysis().
+ WithURL("https://github.com/alecthomas/go-check-sumtype"),
+
linter.NewConfig(golinters.NewGocognit(gocognitCfg)).
WithSince("v1.20.0").
WithPresets(linter.PresetComplexity).
@@ -573,6 +580,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithLoadForGoAnalysis().
WithURL("https://github.com/julz/importas"),
+ linter.NewConfig(golinters.NewINamedParam()).
+ WithSince("v1.55.0").
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/macabu/inamedparam"),
+
linter.NewConfig(golinters.NewIneffassign()).
WithEnabledByDefault().
WithSince("v1.0.0").
@@ -700,6 +712,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithPresets(linter.PresetStyle, linter.PresetTest).
WithURL("https://github.com/kunwardeep/paralleltest"),
+ linter.NewConfig(golinters.NewPerfSprint()).
+ WithSince("v1.55.0").
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetPerformance).
+ WithURL("https://github.com/catenacyber/perfsprint"),
+
linter.NewConfig(golinters.NewPreAlloc(preallocCfg)).
WithSince("v1.19.0").
WithPresets(linter.PresetPerformance).
@@ -715,6 +733,13 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithPresets(linter.PresetStyle).
WithURL("https://github.com/yeya24/promlinter"),
+ linter.NewConfig(golinters.NewProtoGetter()).
+ WithSince("v1.55.0").
+ WithPresets(linter.PresetBugs).
+ WithLoadForGoAnalysis().
+ WithAutoFix().
+ WithURL("https://github.com/ghostiam/protogetter"),
+
linter.NewConfig(golinters.NewReassign(reassignCfg)).
WithSince("1.49.0").
WithPresets(linter.PresetBugs).
@@ -733,6 +758,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithPresets(linter.PresetBugs, linter.PresetSQL).
WithURL("https://github.com/jingyugao/rowserrcheck"),
+ linter.NewConfig(golinters.NewSlogLint(sloglintCfg)).
+ WithSince("v1.55.0").
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetStyle, linter.PresetFormatting).
+ WithURL("https://github.com/go-simpler/sloglint"),
+
linter.NewConfig(golinters.NewScopelint()).
WithSince("v1.12.0").
WithPresets(linter.PresetBugs).
@@ -788,6 +819,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithPresets(linter.PresetTest).
WithURL("https://github.com/maratori/testableexamples"),
+ linter.NewConfig(golinters.NewTestifylint(testifylintCfg)).
+ WithSince("v1.55.0").
+ WithPresets(linter.PresetTest, linter.PresetBugs).
+ WithLoadForGoAnalysis().
+ WithURL("https://github.com/Antonboom/testifylint"),
+
linter.NewConfig(golinters.NewTestpackage(testpackageCfg)).
WithSince("v1.25.0").
WithPresets(linter.PresetStyle, linter.PresetTest).
@@ -825,7 +862,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithLoadForGoAnalysis().
WithURL("https://github.com/mvdan/unparam"),
- linter.NewConfig(golinters.NewUnused(unusedCfg)).
+ linter.NewConfig(golinters.NewUnused(unusedCfg, staticcheckCfg)).
WithEnabledByDefault().
WithSince("v1.20.0").
WithLoadForGoAnalysis().
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go
index 80c9fed7a..94479bc7b 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go
@@ -59,7 +59,7 @@ const (
DebugKeyGoCritic = "gocritic" // Debugs `go-critic` linter.
DebugKeyMegacheck = "megacheck" // Debugs `staticcheck` related linters.
DebugKeyNolint = "nolint" // Debugs a filter excluding issues by `//nolint` comments.
- DebugKeyRevive = "revive" // Debugs `revice` linter.
+ DebugKeyRevive = "revive" // Debugs `revive` linter.
)
func getEnabledDebugs() map[string]bool {
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/github.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/github.go
index 7f148097a..c1da9df9c 100644
--- a/vendor/github.com/golangci/golangci-lint/pkg/printers/github.go
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/github.go
@@ -3,6 +3,7 @@ package printers
import (
"fmt"
"io"
+ "path/filepath"
"github.com/golangci/golangci-lint/pkg/result"
)
@@ -26,7 +27,12 @@ func formatIssueAsGithub(issue *result.Issue) string {
severity = issue.Severity
}
- ret := fmt.Sprintf("::%s file=%s,line=%d", severity, issue.FilePath(), issue.Line())
+ // Convert backslashes to forward slashes.
+ // This is needed when running on windows.
+ // Otherwise, GitHub won't be able to show the annotations pointing to the file path with backslashes.
+ file := filepath.ToSlash(issue.FilePath())
+
+ ret := fmt.Sprintf("::%s file=%s,line=%d", severity, file, issue.Line())
if issue.Pos.Column != 0 {
ret += fmt.Sprintf(",col=%d", issue.Pos.Column)
}
diff --git a/vendor/github.com/golangci/revgrep/.golangci.yml b/vendor/github.com/golangci/revgrep/.golangci.yml
index b8ed6204f..02ed5ec84 100644
--- a/vendor/github.com/golangci/revgrep/.golangci.yml
+++ b/vendor/github.com/golangci/revgrep/.golangci.yml
@@ -28,12 +28,20 @@ linters-settings:
linters:
enable-all: true
disable:
- - maligned # Deprecated
- - scopelint # Deprecated
- - golint # Deprecated
- - interfacer # Deprecated
- - exhaustivestruct # Deprecated
+ - deadcode # deprecated
+ - exhaustivestruct # deprecated
+ - golint # deprecated
+ - ifshort # deprecated
+ - interfacer # deprecated
+ - maligned # deprecated
+ - nosnakecase # deprecated
+ - scopelint # deprecated
+ - structcheck # deprecated
+ - varcheck # deprecated
- cyclop # duplicate of gocyclo
+ - sqlclosecheck # not relevant (SQL)
+ - rowserrcheck # not relevant (SQL)
+ - execinquery # not relevant (SQL)
- dupl
- lll
- nestif
@@ -54,6 +62,7 @@ linters:
- nosnakecase
- nonamedreturns
- nilerr
+ - depguard
issues:
exclude-use-default: false
diff --git a/vendor/github.com/golangci/revgrep/revgrep.go b/vendor/github.com/golangci/revgrep/revgrep.go
index 4b990fa04..7796b1c01 100644
--- a/vendor/github.com/golangci/revgrep/revgrep.go
+++ b/vendor/github.com/golangci/revgrep/revgrep.go
@@ -1,3 +1,4 @@
+// Package revgrep filter static analysis tools to only lines changed based on a commit reference.
package revgrep
import (
@@ -17,31 +18,26 @@ import (
// Checker provides APIs to filter static analysis tools to specific commits,
// such as showing only issues since last commit.
type Checker struct {
- // Patch file (unified) to read to detect lines being changed, if nil revgrep
- // will attempt to detect the VCS and generate an appropriate patch. Auto
- // detection will search for uncommitted changes first, if none found, will
- // generate a patch from last committed change. File paths within patches
- // must be relative to current working directory.
+ // Patch file (unified) to read to detect lines being changed,
+ // if nil revgrep will attempt to detect the VCS and generate an appropriate patch.
+ // Auto-detection will search for uncommitted changes first,
+ // if none found, will generate a patch from last committed change.
+ // File paths within patches must be relative to current working directory.
Patch io.Reader
- // NewFiles is a list of file names (with absolute paths) where the entire
- // contents of the file is new.
+ // NewFiles is a list of file names (with absolute paths) where the entire contents of the file is new.
NewFiles []string
// Debug sets the debug writer for additional output.
Debug io.Writer
- // RevisionFrom check revision starting at, leave blank for auto detection
- // ignored if patch is set.
+ // RevisionFrom check revision starting at, leave blank for auto-detection ignored if patch is set.
RevisionFrom string
- // WholeFiles indicates that the user wishes to see all issues that comes up
- // anywhere in any file that has been changed in this revision or patch.
+ // WholeFiles indicates that the user wishes to see all issues that comes up anywhere in any file that has been changed in this revision or patch.
WholeFiles bool
- // RevisionTo checks revision finishing at, leave blank for auto detection
- // ignored if patch is set.
+ // RevisionTo checks revision finishing at, leave blank for auto-detection ignored if patch is set.
RevisionTo string
// Regexp to match path, line number, optional column number, and message.
Regexp string
- // AbsPath is used to make an absolute path of an issue's filename to be
- // relative in order to match patch file. If not set, current working
- // directory is used.
+ // AbsPath is used to make an absolute path of an issue's filename to be relative in order to match patch file.
+ // If not set, current working directory is used.
AbsPath string
// Calculated changes for next calls to IsNewIssue
@@ -56,9 +52,7 @@ type Issue struct {
LineNo int
// ColNo is the column number or 0 if none could be parsed.
ColNo int
- // HunkPos is position from file's first @@, for new files this will be the
- // line number.
- //
+ // HunkPos is position from file's first @@, for new files this will be the line number.
// See also: https://developer.github.com/v3/pulls/comments/#create-a-comment
HunkPos int
// Issue text as it appeared from the tool.
@@ -135,16 +129,14 @@ func (c *Checker) IsNewIssue(i InputIssue) (hunkPos int, isNew bool) {
return 0, false
}
-// Check scans reader and writes any lines to writer that have been added in
-// Checker.Patch.
+// Check scans reader and writes any lines to writer that have been added in Checker.Patch.
//
// Returns the issues written to writer when no error occurs.
//
-// If no VCS could be found or other VCS errors occur, all issues are written
-// to writer and an error is returned.
+// If no VCS could be found or other VCS errors occur,
+// all issues are written to writer and an error is returned.
//
-// File paths in reader must be relative to current working directory or
-// absolute.
+// File paths in reader must be relative to current working directory or absolute.
func (c *Checker) Check(reader io.Reader, writer io.Writer) (issues []Issue, err error) {
returnErr := c.Prepare()
writeAll := returnErr != nil
@@ -265,8 +257,7 @@ func (c *Checker) preparePatch() error {
}
// linesChanges returns a map of file names to line numbers being changed.
-// If key is nil, the file has been recently added, else it contains a slice
-// of positions that have been added.
+// If key is nil, the file has been recently added, else it contains a slice of positions that have been added.
func (c *Checker) linesChanged() map[string][]pos {
type state struct {
file string
@@ -343,17 +334,12 @@ func (c *Checker) linesChanged() map[string][]pos {
return changes
}
-// GitPatch returns a patch from a git repository, if no git repository was
-// was found and no errors occurred, nil is returned, else an error is returned
-// revisionFrom and revisionTo defines the git diff parameters, if left blank
-// and there are unstaged changes or untracked files, only those will be returned
-// else only check changes since HEAD~. If revisionFrom is set but revisionTo
-// is not, untracked files will be included, to exclude untracked files set
-// revisionTo to HEAD~. It's incorrect to specify revisionTo without a
-// revisionFrom.
+// GitPatch returns a patch from a git repository,
+// if no git repository was found and no errors occurred, nil is returned, else an error is returned revisionFrom and revisionTo defines the git diff parameters,
+// if left blank and there are unstaged changes or untracked files, only those will be returned else only check changes since HEAD~.
+// If revisionFrom is set but revisionTo is not, untracked files will be included, to exclude untracked files set revisionTo to HEAD~.
+// It's incorrect to specify revisionTo without a revisionFrom.
func GitPatch(revisionFrom, revisionTo string) (io.Reader, []string, error) {
- var patch bytes.Buffer
-
// check if git repo exists
if err := exec.Command("git", "status", "--porcelain").Run(); err != nil {
// don't return an error, we assume the error is not repo exists
@@ -377,8 +363,9 @@ func GitPatch(revisionFrom, revisionTo string) (io.Reader, []string, error) {
newFiles = append(newFiles, string(file))
}
+ var patch bytes.Buffer
if revisionFrom != "" {
- cmd := exec.Command("git", "diff", "--color=never", "--relative", revisionFrom)
+ cmd := gitDiff(revisionFrom)
if revisionTo != "" {
cmd.Args = append(cmd.Args, revisionTo)
}
@@ -392,12 +379,12 @@ func GitPatch(revisionFrom, revisionTo string) (io.Reader, []string, error) {
if revisionTo == "" {
return &patch, newFiles, nil
}
+
return &patch, nil, nil
}
// make a patch for unstaged changes
- // use --no-prefix to remove b/ given: +++ b/main.go
- cmd := exec.Command("git", "diff", "--color=never", "--relative", "--")
+ cmd := gitDiff("--")
cmd.Stdout = &patch
if err := cmd.Run(); err != nil {
return nil, nil, fmt.Errorf("error executing git diff: %w", err)
@@ -412,7 +399,7 @@ func GitPatch(revisionFrom, revisionTo string) (io.Reader, []string, error) {
// check for changes in recent commit
- cmd = exec.Command("git", "diff", "--color=never", "--relative", "HEAD~", "--")
+ cmd = gitDiff("HEAD~", "--")
cmd.Stdout = &patch
if err := cmd.Run(); err != nil {
return nil, nil, fmt.Errorf("error executing git diff HEAD~: %w", err)
@@ -420,3 +407,55 @@ func GitPatch(revisionFrom, revisionTo string) (io.Reader, []string, error) {
return &patch, nil, nil
}
+
+func gitDiff(extraArgs ...string) *exec.Cmd {
+ cmd := exec.Command("git", "diff", "--color=never", "--no-ext-diff")
+
+ if isSupportedByGit(2, 41, 0) {
+ cmd.Args = append(cmd.Args, "--default-prefix")
+ }
+
+ cmd.Args = append(cmd.Args, "--relative")
+ cmd.Args = append(cmd.Args, extraArgs...)
+
+ return cmd
+}
+
+func isSupportedByGit(major, minor, patch int) bool {
+ output, err := exec.Command("git", "version").CombinedOutput()
+ if err != nil {
+ return false
+ }
+
+ parts := bytes.Split(bytes.TrimSpace(output), []byte(" "))
+ if len(parts) < 3 {
+ return false
+ }
+
+ v := string(parts[2])
+ if v == "" {
+ return false
+ }
+
+ vp := regexp.MustCompile(`^(\d+)\.(\d+)(?:\.(\d+))?.*$`).FindStringSubmatch(v)
+ if len(vp) < 4 {
+ return false
+ }
+
+ currentMajor, err := strconv.Atoi(vp[1])
+ if err != nil {
+ return false
+ }
+
+ currentMinor, err := strconv.Atoi(vp[2])
+ if err != nil {
+ return false
+ }
+
+ currentPatch, err := strconv.Atoi(vp[3])
+ if err != nil {
+ return false
+ }
+
+ return currentMajor*1_000_000_000+currentMinor*1_000_000+currentPatch*1_000 >= major*1_000_000_000+minor*1_000_000+patch*1_000
+}