]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: fix 'go vet' of package with external tests
authorRuss Cox <rsc@golang.org>
Mon, 6 Oct 2014 18:49:22 +0000 (14:49 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 6 Oct 2014 18:49:22 +0000 (14:49 -0400)
For example, fixes 'go vet syscall', which has source
files in package syscall_test.

Fixes #8511.

LGTM=r
R=golang-codereviews, r
CC=golang-codereviews, iant
https://golang.org/cl/152220044

src/cmd/go/test.bash
src/cmd/go/testdata/src/vetpkg/a_test.go [new file with mode: 0644]
src/cmd/go/testdata/src/vetpkg/b.go [new file with mode: 0644]
src/cmd/go/vet.go

index 6a72bcde076c2d7649d608e8ea3138dce6996706..652ef3b5b6ad0e0f68dd988401f858408ead2d4c 100755 (executable)
@@ -1085,6 +1085,20 @@ fi
 unset GOPATH
 rm -rf $d
 
+TEST go vet with external tests
+d=$(mktemp -d -t testgoXXX)
+export GOPATH=$(pwd)/testdata
+if ./testgo vet vetpkg >$d/err 2>&1; then
+       echo "go vet vetpkg passes incorrectly"
+       ok=false
+elif ! grep -q 'missing argument for Printf' $d/err; then
+       echo "go vet vetpkg did not find missing argument for Printf"
+       cat $d/err
+       ok=false
+fi
+unset GOPATH
+rm -rf $d
+
 # clean up
 if $started; then stop; fi
 rm -rf testdata/bin testdata/bin1
diff --git a/src/cmd/go/testdata/src/vetpkg/a_test.go b/src/cmd/go/testdata/src/vetpkg/a_test.go
new file mode 100644 (file)
index 0000000..9b64e8e
--- /dev/null
@@ -0,0 +1 @@
+package p_test
diff --git a/src/cmd/go/testdata/src/vetpkg/b.go b/src/cmd/go/testdata/src/vetpkg/b.go
new file mode 100644 (file)
index 0000000..99e18f6
--- /dev/null
@@ -0,0 +1,7 @@
+package p
+
+import "fmt"
+
+func f() {
+       fmt.Printf("%d")
+}
index ffb4318373bcc374d971b4235b0bf0e8fc8066ef..de7befc6115b9cd8ecab69ac9e3e439a2a1d3df8 100644 (file)
@@ -4,6 +4,8 @@
 
 package main
 
+import "path/filepath"
+
 func init() {
        addBuildFlagsNX(cmdVet)
 }
@@ -28,10 +30,21 @@ See also: go fmt, go fix.
 }
 
 func runVet(cmd *Command, args []string) {
-       for _, pkg := range packages(args) {
-               // Use pkg.gofiles instead of pkg.Dir so that
-               // the command only applies to this package,
-               // not to packages in subdirectories.
-               run(tool("vet"), relPaths(stringList(pkg.gofiles, pkg.sfiles)))
+       for _, p := range packages(args) {
+               // Vet expects to be given a set of files all from the same package.
+               // Run once for package p and once for package p_test.
+               if len(p.GoFiles)+len(p.CgoFiles)+len(p.TestGoFiles) > 0 {
+                       runVetFiles(p, stringList(p.GoFiles, p.CgoFiles, p.TestGoFiles, p.SFiles))
+               }
+               if len(p.XTestGoFiles) > 0 {
+                       runVetFiles(p, stringList(p.XTestGoFiles))
+               }
+       }
+}
+
+func runVetFiles(p *Package, files []string) {
+       for i := range files {
+               files[i] = filepath.Join(p.Dir, files[i])
        }
+       run(tool("vet"), relPaths(files))
 }