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: Russ Cox <rsc@golang.org>
"os", // cmd/go/internal/fmtcmd
"path/filepath", // cmd/go/internal/fmtcmd
"runtime", // cmd/go/internal/fmtcmd
+ "strings", // cmd/go/internal/fmtcmd
"sync", // cmd/go/internal/fmtcmd
},
tg.run("install", "-i", "p2")
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")
+}
"os"
"path/filepath"
"runtime"
+ "strings"
"sync"
"cmd/go/internal/base"
}
}()
}
- 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
// the command only applies to this package,
// not to packages in subdirectories.