cmd/go/internal/vet: skip -fix on pkgs from vendor or non-main mod

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>
This commit is contained in:
Alan Donovan 2025-12-05 12:41:21 -05:00 committed by Gopher Robot
parent 745349712e
commit c270e71835
2 changed files with 53 additions and 0 deletions

View 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)

View file

@ -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{}