diff options
author | Jay Conrod <jayconrod@google.com> | 2019-08-07 16:27:39 -0400 |
---|---|---|
committer | Jay Conrod <jayconrod@google.com> | 2019-08-08 20:38:47 +0000 |
commit | 1dc0110bf725640a9b912e3d31e6654ed1c4da9d (patch) | |
tree | 96a093b582c17b9e7e39d2d10716a81753ad0c27 /src/cmd/go/internal/modload/list.go | |
parent | c5178ef69eedce1374e684212ea9cdae6220e0f6 (diff) | |
download | go-1dc0110bf725640a9b912e3d31e6654ed1c4da9d.tar.gz go-1dc0110bf725640a9b912e3d31e6654ed1c4da9d.zip |
cmd/go: improve 'go mod download' and 'go list -m' error messages
modload.ListModules now wraps errors as module.ModuleError as
appropriate. The resulting errors always include the module path and
will include the version, if known.
'go mod download' no longer ignores errors reported by ListModules.
Previously, it started requesting module info, go.mod, and zip. Those
requests would fail, overwriting the original failure. They were
usually less descriptive.
'go mod download' with a module not in the build list (and no version
query) is now an error. Previously, this was silently ignored.
Fixes #30743
Change-Id: Icee8c1c6c5240de135a8b6ba42d6bbcdb757cdac
Reviewed-on: https://go-review.googlesource.com/c/go/+/189323
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Diffstat (limited to 'src/cmd/go/internal/modload/list.go')
-rw-r--r-- | src/cmd/go/internal/modload/list.go | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index c571ddc5f5..35d0c28cde 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -5,6 +5,7 @@ package modload import ( + "errors" "fmt" "os" "strings" @@ -70,9 +71,7 @@ func listModules(args []string, listVersions bool) []*modinfo.ModulePublic { mods = append(mods, &modinfo.ModulePublic{ Path: path, Version: vers, - Error: &modinfo.ModuleError{ - Err: err.Error(), - }, + Error: modinfoError(path, vers, err), }) continue } @@ -116,19 +115,15 @@ func listModules(args []string, listVersions bool) []*modinfo.ModulePublic { mods = append(mods, moduleInfo(module.Version{Path: arg, Version: info.Version}, false)) } else { mods = append(mods, &modinfo.ModulePublic{ - Path: arg, - Error: &modinfo.ModuleError{ - Err: err.Error(), - }, + Path: arg, + Error: modinfoError(arg, "", err), }) } continue } mods = append(mods, &modinfo.ModulePublic{ - Path: arg, - Error: &modinfo.ModuleError{ - Err: fmt.Sprintf("module %q is not a known dependency", arg), - }, + Path: arg, + Error: modinfoError(arg, "", errors.New("not a known dependency")), }) } else { fmt.Fprintf(os.Stderr, "warning: pattern %q matched no module dependencies\n", arg) @@ -138,3 +133,21 @@ func listModules(args []string, listVersions bool) []*modinfo.ModulePublic { return mods } + +// modinfoError wraps an error to create an error message in +// modinfo.ModuleError with minimal redundancy. +func modinfoError(path, vers string, err error) *modinfo.ModuleError { + var nerr *NoMatchingVersionError + var merr *module.ModuleError + if errors.As(err, &nerr) { + // NoMatchingVersionError contains the query, so we don't mention the + // query again in ModuleError. + err = &module.ModuleError{Path: path, Err: err} + } else if !errors.As(err, &merr) { + // If the error does not contain path and version, wrap it in a + // module.ModuleError. + err = &module.ModuleError{Path: path, Version: vers, Err: err} + } + + return &modinfo.ModuleError{Err: err.Error()} +} |