aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2018-08-20 21:25:01 -0400
committerIan Lance Taylor <iant@golang.org>2018-08-22 15:50:27 +0000
commit811b0c1bf5b4034d32881ea090e0548444a9c14c (patch)
tree5c0c5a668037af6b95d00022246bc0047445e656
parentece4cdb9cb5d49efb1a7a43cc7d0501b0f3a9f60 (diff)
downloadgo-811b0c1bf5b4034d32881ea090e0548444a9c14c.tar.gz
go-811b0c1bf5b4034d32881ea090e0548444a9c14c.zip
[release-branch.go1.11] cmd/go: fix modload response for std-vendored packages
This fixes a failure when using Go 1.11 to build App Engine code. Change-Id: I008e8cf5ad4c568676d904deddff031a166f2d5d Reviewed-on: https://go-review.googlesource.com/130138 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> (cherry picked from commit c652a1b9c041a2d359665f01de21b19d53ba5ce5) Reviewed-on: https://go-review.googlesource.com/130616 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Andrew Bonventre <andybons@golang.org>
-rw-r--r--src/cmd/go/internal/modload/build.go16
-rw-r--r--src/cmd/go/internal/modload/load.go16
-rw-r--r--src/cmd/go/testdata/script/mod_std_vendor.txt19
3 files changed, 41 insertions, 10 deletions
diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go
index 5893db14aa..cebb802db9 100644
--- a/src/cmd/go/internal/modload/build.go
+++ b/src/cmd/go/internal/modload/build.go
@@ -25,15 +25,21 @@ var (
)
func isStandardImportPath(path string) bool {
+ return findStandardImportPath(path) != ""
+}
+
+func findStandardImportPath(path string) string {
if search.IsStandardImportPath(path) {
- if _, err := os.Stat(filepath.Join(cfg.GOROOT, "src", path)); err == nil {
- return true
+ dir := filepath.Join(cfg.GOROOT, "src", path)
+ if _, err := os.Stat(dir); err == nil {
+ return dir
}
- if _, err := os.Stat(filepath.Join(cfg.GOROOT, "src/vendor", path)); err == nil {
- return true
+ dir = filepath.Join(cfg.GOROOT, "src/vendor", path)
+ if _, err := os.Stat(dir); err == nil {
+ return dir
}
}
- return false
+ return ""
}
func PackageModuleInfo(pkgpath string) *modinfo.ModulePublic {
diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go
index 285daa8f4f..e6340b8bfd 100644
--- a/src/cmd/go/internal/modload/load.go
+++ b/src/cmd/go/internal/modload/load.go
@@ -399,11 +399,17 @@ func ModuleUsedDirectly(path string) bool {
func Lookup(path string) (dir, realPath string, err error) {
pkg, ok := loaded.pkgCache.Get(path).(*loadPkg)
if !ok {
- if isStandardImportPath(path) {
- dir := filepath.Join(cfg.GOROOT, "src", path)
- if _, err := os.Stat(dir); err == nil {
- return dir, path, nil
- }
+ // The loader should have found all the relevant paths.
+ // There are a few exceptions, though:
+ // - during go list without -test, the p.Resolve calls to process p.TestImports and p.XTestImports
+ // end up here to canonicalize the import paths.
+ // - during any load, non-loaded packages like "unsafe" end up here.
+ // - during any load, build-injected dependencies like "runtime/cgo" end up here.
+ // - because we ignore appengine/* in the module loader,
+ // the dependencies of any actual appengine/* library end up here.
+ dir := findStandardImportPath(path)
+ if dir != "" {
+ return dir, path, nil
}
return "", "", errMissing
}
diff --git a/src/cmd/go/testdata/script/mod_std_vendor.txt b/src/cmd/go/testdata/script/mod_std_vendor.txt
new file mode 100644
index 0000000000..36d4ffca9e
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_std_vendor.txt
@@ -0,0 +1,19 @@
+env GO111MODULE=on
+
+go list -f '{{.TestImports}}'
+stdout net/http # from .TestImports
+
+go list -test -f '{{.Deps}}'
+stdout golang_org/x/crypto # dep of .TestImports
+
+-- go.mod --
+module m
+
+-- x.go --
+package x
+
+-- x_test.go --
+package x
+import "testing"
+import _ "net/http"
+func Test(t *testing.T) {}