From e5f6051e77b207561dd11ae72cc7451e5ab8bcf3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Fri, 3 Nov 2017 18:14:37 +0000 Subject: [PATCH] cmd/go: skip "exclude all Go files" error in fmt MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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í TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox --- src/cmd/dist/deps.go | 1 + src/cmd/go/go_test.go | 8 ++++++++ src/cmd/go/internal/fmtcmd/fmt.go | 12 +++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/cmd/dist/deps.go b/src/cmd/dist/deps.go index ffc3b4788c..294ca22a70 100644 --- a/src/cmd/dist/deps.go +++ b/src/cmd/dist/deps.go @@ -167,6 +167,7 @@ var builddeps = map[string][]string{ "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 }, diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 25cc18fa61..854de7968f 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -4906,3 +4906,11 @@ func TestInstallDeps(t *testing.T) { 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") +} diff --git a/src/cmd/go/internal/fmtcmd/fmt.go b/src/cmd/go/internal/fmtcmd/fmt.go index 2ff6dd5356..eb96823fa6 100644 --- a/src/cmd/go/internal/fmtcmd/fmt.go +++ b/src/cmd/go/internal/fmtcmd/fmt.go @@ -9,6 +9,7 @@ import ( "os" "path/filepath" "runtime" + "strings" "sync" "cmd/go/internal/base" @@ -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 // the command only applies to this package, // not to packages in subdirectories. -- 2.48.1