1
0
mirror of https://github.com/golang/go synced 2024-10-02 12:08:32 -06:00

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: Russ Cox <rsc@golang.org>
This commit is contained in:
Daniel Martí 2017-11-03 18:14:37 +00:00 committed by Russ Cox
parent d58d90152b
commit e5f6051e77
3 changed files with 20 additions and 1 deletions

View File

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

View File

@ -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")
}

View File

@ -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.