]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/vet: skip -fix on pkgs from vendor or non-main mod
authorAlan Donovan <adonovan@google.com>
Fri, 5 Dec 2025 17:41:21 +0000 (12:41 -0500)
committerGopher Robot <gobot@golang.org>
Fri, 5 Dec 2025 22:29:25 +0000 (14:29 -0800)
This change causes go fix (and go vet -fix) to skip applying fixes
to any package in the vendor/ tree, including the GOROOT vendor
packages that are part of std, and to any package from a non-main
module (since these usually come from the readonly module cache).

+ test

Fixes golang/go#76479

Change-Id: Ifdb73e09fbe413b4d99a92e5081b8ea43460be0b
Reviewed-on: https://go-review.googlesource.com/c/go/+/727300
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
Reviewed-by: Michael Matloob <matloob@google.com>
Auto-Submit: Alan Donovan <adonovan@google.com>

src/cmd/go/internal/vet/vet.go
src/cmd/go/testdata/script/fix_vendor.txt [new file with mode: 0644]

index 34d904cffc61f85bc495d441e2b0a1a329383540..e7d01782bf2f6c6feebd0ec22fe28a6ffa2461f9 100644 (file)
@@ -262,6 +262,15 @@ func run(ctx context.Context, cmd *base.Command, args []string) {
        // will only be executed in VetxOnly mode, for facts but not
        // diagnostics.
        for _, p := range pkgs {
+               // Don't apply fixes to vendored packages, including
+               // the GOROOT vendor packages that are part of std,
+               // or to packages from non-main modules (#76479).
+               if applyFixes {
+                       if p.Standard && strings.HasPrefix(p.ImportPath, "vendor/") ||
+                               p.Module != nil && !p.Module.Main {
+                               continue
+                       }
+               }
                _, ptest, pxtest, perr := load.TestPackagesFor(moduleLoaderState, ctx, pkgOpts, p, nil)
                if perr != nil {
                        base.Errorf("%v", perr.Error)
diff --git a/src/cmd/go/testdata/script/fix_vendor.txt b/src/cmd/go/testdata/script/fix_vendor.txt
new file mode 100644 (file)
index 0000000..f03f326
--- /dev/null
@@ -0,0 +1,44 @@
+# Test that go fix skips fixes to non-main and/or vendored packages.
+# (It uses the interface{} -> any modernizer.)
+
+# Create vendor tree programmatically to avoid
+# having to hardcode sums in this txtar archive.
+go mod vendor
+
+# Show fixes on two packages, one in the main module
+# and one in a vendored dependency.
+# Only the main one (a) is shown.
+go fix -diff example.com/a example.com/b
+stdout 'a[/\\]a.go'
+stdout '\-var _ interface\{\}'
+stdout '\+var _ any'
+! stdout 'b[/\\]b.go'
+
+# Apply fixes to the same two packages.
+# Only the main module was modified.
+go fix example.com/a example.com/b
+grep 'var _ any'          a/a.go
+grep 'var _ interface{}'  b/b.go
+grep 'var _ interface{}'  vendor/example.com/b/b.go
+
+-- go.mod --
+module example.com
+go 1.26
+
+require "example.com/b" v0.0.0
+replace "example.com/b" => ./b
+
+-- a/a.go --
+package a
+
+import _ "example.com/b"
+
+var _ interface{}
+
+-- b/go.mod --
+module example.com/b
+
+-- b/b.go --
+package b
+
+var _ interface{}