Commit aa09e751 authored by Jay Conrod's avatar Jay Conrod

cmd/doc: show original import error when package cannot be found

Updates #34669

Change-Id: I8d0ee68885e804e131f42a512080486f9b25e9dd
Reviewed-on: https://go-review.googlesource.com/c/go/+/199819
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
parent 99b9ee3e
...@@ -231,8 +231,8 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo ...@@ -231,8 +231,8 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
// First, is it a complete package path as it is? If so, we are done. // First, is it a complete package path as it is? If so, we are done.
// This avoids confusion over package paths that have other // This avoids confusion over package paths that have other
// package paths as their prefix. // package paths as their prefix.
pkg, err = build.Import(arg, wd, build.ImportComment) pkg, importErr := build.Import(arg, wd, build.ImportComment)
if err == nil { if importErr == nil {
return pkg, arg, "", false return pkg, arg, "", false
} }
// Another disambiguator: If the symbol starts with an upper // Another disambiguator: If the symbol starts with an upper
...@@ -286,7 +286,18 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo ...@@ -286,7 +286,18 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
} }
// If it has a slash, we've failed. // If it has a slash, we've failed.
if slash >= 0 { if slash >= 0 {
log.Fatalf("no such package %s", arg[0:period]) // build.Import should always include the path in its error message,
// and we should avoid repeating it. Unfortunately, build.Import doesn't
// return a structured error. That can't easily be fixed, since it
// invokes 'go list' and returns the error text from the loaded package.
// TODO(golang.org/issue/34750): load using golang.org/x/tools/go/packages
// instead of go/build.
importErrStr := importErr.Error()
if strings.Contains(importErrStr, arg[:period]) {
log.Fatal(importErrStr)
} else {
log.Fatalf("no such package %s: %s", arg[:period], importErrStr)
}
} }
// Guess it's a symbol in the current directory. // Guess it's a symbol in the current directory.
return importDir(wd), "", arg, false return importDir(wd), "", arg, false
......
...@@ -36,6 +36,11 @@ go doc rsc.io/quote ...@@ -36,6 +36,11 @@ go doc rsc.io/quote
! stdout 'Package quote is located in a GOPATH workspace.' ! stdout 'Package quote is located in a GOPATH workspace.'
stdout 'Package quote collects pithy sayings.' stdout 'Package quote collects pithy sayings.'
# Check that a sensible error message is printed when a package is not found.
env GOPROXY=off
! go doc example.com/hello
stderr '^doc: cannot find module providing package example.com/hello: module lookup disabled by GOPROXY=off$'
-- go.mod -- -- go.mod --
module x module x
require rsc.io/quote v1.5.2 require rsc.io/quote v1.5.2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment