]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/modload: fail if no package was found in local module
authorAriel Mashraki <ariel@mashraki.co.il>
Thu, 24 Oct 2019 11:36:57 +0000 (14:36 +0300)
committerBryan C. Mills <bcmills@google.com>
Fri, 8 Nov 2019 20:50:17 +0000 (20:50 +0000)
Changing the Import function to return a PackageNotInModuleError if no
package was found in a local module. This replacing the vague message
"missing dot in first path element" you get today with much more friendly
one - "module was found, but does not contain package".

Fixes #35273

Change-Id: I6d726c17e6412258274b10f58f76621617d26e0a
Reviewed-on: https://go-review.googlesource.com/c/go/+/203118
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>

src/cmd/go/internal/modload/import.go
src/cmd/go/testdata/script/mod_replace_import.txt

index 8a18da37d54f66e53409ccce1329954583ff673f..a01ef62d550f2cb92f190a5e50ce06f9719e3799 100644 (file)
@@ -237,6 +237,17 @@ func Import(path string) (m module.Version, dir string, err error) {
                                return m, "", &ImportMissingError{Path: path, Module: m}
                        }
                }
+               if len(mods) > 0 && module.CheckPath(path) != nil {
+                       // The package path is not valid to fetch remotely,
+                       // so it can only exist if in a replaced module,
+                       // and we know from the above loop that it is not.
+                       return module.Version{}, "", &PackageNotInModuleError{
+                               Mod:         mods[0],
+                               Query:       "latest",
+                               Pattern:     path,
+                               Replacement: Replacement(mods[0]),
+                       }
+               }
        }
 
        candidates, err := QueryPackage(path, "latest", Allowed)
index 0da753a1a763cb4375b19208b0517be4369086c6..941ef61d35589b655ab9d4d011d23147f773a373 100644 (file)
@@ -23,6 +23,13 @@ stdout 'example.com/y v0.0.0-00010101000000-000000000000 => ./y'
 stdout 'example.com/x/v3 v3.0.0-00010101000000-000000000000 => ./v3'
 stdout 'example.com/v v1.12.0 => ./v12'
 
+# The go command should print an informative error when the matched
+# module does not contain a package.
+cd fail
+! go list all
+stdout 'localhost.fail'
+stderr '^can.t load package: m.go:3:8: module w@latest found \(v0.0.0-00010101000000-000000000000, replaced by ../w\), but does not contain package w$'
+
 -- go.mod --
 module example.com/m
 
@@ -107,3 +114,16 @@ package v
 module v.localhost
 -- v/v.go --
 package v
+
+-- fail/m.go --
+package main
+
+import _ "w"
+
+func main() {}
+
+-- fail/go.mod --
+module localhost.fail
+
+replace w => ../w
+