Commit e5f6051e authored by Daniel Martí's avatar Daniel Martí Committed by Russ Cox

cmd/go: skip "exclude all Go files" error in fmt

Otherwise, one can't run "go fmt" on a directory containing Go files if
none of them are buildable (e.g. because of build tags). This is
counter-intuitive, as fmt will format all Go files anyway.

If we encounter such a load error, ignore it and carry on. All other
load errors, such as when a package can't be found, should still be
shown to the user.

Add a test for the two kinds of load errors. Use fmt -n so that any
changes to the formatting of the files in testdata don't actually get
applied. The load errors still occur with -n, so the test does its job.

Fixes #22183.

Change-Id: I99d0c0cdd29015b6a3f5286a9bbff50757c78e0d
Reviewed-on: https://go-review.googlesource.com/75930
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent d58d9015
...@@ -167,6 +167,7 @@ var builddeps = map[string][]string{ ...@@ -167,6 +167,7 @@ var builddeps = map[string][]string{
"os", // cmd/go/internal/fmtcmd "os", // cmd/go/internal/fmtcmd
"path/filepath", // cmd/go/internal/fmtcmd "path/filepath", // cmd/go/internal/fmtcmd
"runtime", // cmd/go/internal/fmtcmd "runtime", // cmd/go/internal/fmtcmd
"strings", // cmd/go/internal/fmtcmd
"sync", // cmd/go/internal/fmtcmd "sync", // cmd/go/internal/fmtcmd
}, },
......
...@@ -4906,3 +4906,11 @@ func TestInstallDeps(t *testing.T) { ...@@ -4906,3 +4906,11 @@ func TestInstallDeps(t *testing.T) {
tg.run("install", "-i", "p2") tg.run("install", "-i", "p2")
tg.mustExist(p1) tg.mustExist(p1)
} }
func TestFmtLoadErrors(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
tg.runFail("fmt", "does-not-exist")
tg.run("fmt", "-n", "exclude")
}
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings"
"sync" "sync"
"cmd/go/internal/base" "cmd/go/internal/base"
...@@ -55,7 +56,16 @@ func runFmt(cmd *base.Command, args []string) { ...@@ -55,7 +56,16 @@ func runFmt(cmd *base.Command, args []string) {
} }
}() }()
} }
for _, pkg := range load.Packages(args) { for _, pkg := range load.PackagesAndErrors(args) {
if pkg.Error != nil {
if strings.HasPrefix(pkg.Error.Err, "build constraints exclude all Go files") {
// Skip this error, as we will format
// all files regardless.
} else {
base.Errorf("can't load package: %s", pkg.Error)
continue
}
}
// Use pkg.gofiles instead of pkg.Dir so that // Use pkg.gofiles instead of pkg.Dir so that
// the command only applies to this package, // the command only applies to this package,
// not to packages in subdirectories. // not to packages in subdirectories.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment