Skip to content

Commit

Permalink
[release-branch.go1.13] cmd/go/internal/modload: annotate replacement…
Browse files Browse the repository at this point in the history
…s in PackageNotInModuleError

Updates #34085
Fixes #34118

Change-Id: I3111f5997466ad33f51e80c71f5fb2ccebdcc6e4
Reviewed-on: https://go-review.googlesource.com/c/go/+/193617
Run-TryBot: Bryan C. Mills <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Jay Conrod <[email protected]>
(cherry picked from commit 8189a06)
Reviewed-on: https://go-review.googlesource.com/c/go/+/197317
  • Loading branch information
Bryan C. Mills committed Sep 26, 2019
1 parent a462e9f commit 4b1d9c4
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 12 deletions.
2 changes: 1 addition & 1 deletion src/cmd/go/internal/modload/import_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ var importTests = []struct {
},
{
path: "golang.org/x/net",
err: "module golang.org/x/net@.* found, but does not contain package golang.org/x/net",
err: `module golang.org/x/net@.* found \(v0.0.0-.*\), but does not contain package golang.org/x/net`,
},
{
path: "golang.org/x/text",
Expand Down
5 changes: 5 additions & 0 deletions src/cmd/go/internal/modload/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -1205,6 +1205,11 @@ func (*mvsReqs) next(m module.Version) (module.Version, error) {
return module.Version{Path: m.Path, Version: "none"}, nil
}

// fetch downloads the given module (or its replacement)
// and returns its location.
//
// The isLocal return value reports whether the replacement,
// if any, is local to the filesystem.
func fetch(mod module.Version) (dir string, isLocal bool, err error) {
if mod == Target {
return ModRoot(), true, nil
Expand Down
30 changes: 21 additions & 9 deletions src/cmd/go/internal/modload/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -381,9 +381,10 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q
r.Packages = match(r.Mod, root, isLocal)
if len(r.Packages) == 0 {
return r, &PackageNotInModuleError{
Mod: r.Mod,
Query: query,
Pattern: pattern,
Mod: r.Mod,
Replacement: Replacement(r.Mod),
Query: query,
Pattern: pattern,
}
}
return r, nil
Expand Down Expand Up @@ -536,21 +537,32 @@ func (e *NoMatchingVersionError) Error() string {
// code for the versions it knows about, and thus did not have the opportunity
// to return a non-400 status code to suppress fallback.
type PackageNotInModuleError struct {
Mod module.Version
Query string
Pattern string
Mod module.Version
Replacement module.Version
Query string
Pattern string
}

func (e *PackageNotInModuleError) Error() string {
found := ""
if e.Query != e.Mod.Version {
if r := e.Replacement; r.Path != "" {
replacement := r.Path
if r.Version != "" {
replacement = fmt.Sprintf("%s@%s", r.Path, r.Version)
}
if e.Query == e.Mod.Version {
found = fmt.Sprintf(" (replaced by %s)", replacement)
} else {
found = fmt.Sprintf(" (%s, replaced by %s)", e.Mod.Version, replacement)
}
} else if e.Query != e.Mod.Version {
found = fmt.Sprintf(" (%s)", e.Mod.Version)
}

if strings.Contains(e.Pattern, "...") {
return fmt.Sprintf("module %s@%s%s found, but does not contain packages matching %s", e.Mod.Path, e.Query, found, e.Pattern)
return fmt.Sprintf("module %s@%s found%s, but does not contain packages matching %s", e.Mod.Path, e.Query, found, e.Pattern)
}
return fmt.Sprintf("module %s@%s%s found, but does not contain package %s", e.Mod.Path, e.Query, found, e.Pattern)
return fmt.Sprintf("module %s@%s found%s, but does not contain package %s", e.Mod.Path, e.Query, found, e.Pattern)
}

// ModuleHasRootPackage returns whether module m contains a package m.Path.
Expand Down
4 changes: 2 additions & 2 deletions src/cmd/go/testdata/script/mod_get_patterns.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ grep 'require rsc.io/quote' go.mod

cp go.mod.orig go.mod
! go get -d rsc.io/quote/x...
stderr 'go get rsc.io/quote/x...: module rsc.io/quote@upgrade \(v1.5.2\) found, but does not contain packages matching rsc.io/quote/x...'
stderr 'go get rsc.io/quote/x...: module rsc.io/quote@upgrade found \(v1.5.2\), but does not contain packages matching rsc.io/quote/x...'
! grep 'require rsc.io/quote' go.mod

! go get -d rsc.io/quote/x/...
stderr 'go get rsc.io/quote/x/...: module rsc.io/quote@upgrade \(v1.5.2\) found, but does not contain packages matching rsc.io/quote/x/...'
stderr 'go get rsc.io/quote/x/...: module rsc.io/quote@upgrade found \(v1.5.2\), but does not contain packages matching rsc.io/quote/x/...'
! grep 'require rsc.io/quote' go.mod

# If a pattern matches no packages within a module, the module should not
Expand Down
7 changes: 7 additions & 0 deletions src/cmd/go/testdata/script/mod_replace.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ grep 'not-rsc.io/quote/v3 v3.1.0' go.mod
exec ./a5.exe
stdout 'Concurrency is not parallelism.'

# Error messages for modules not found in replacements should
# indicate the replacement module.
cp go.mod.orig go.mod
go mod edit -replace=rsc.io/quote/v3=./local/rsc.io/quote/v3
! go get -d rsc.io/quote/v3/missing-package
stderr 'module rsc.io/quote/v3@upgrade found \(v3.0.0, replaced by ./local/rsc.io/quote/v3\), but does not contain package'

-- go.mod --
module quoter

Expand Down

0 comments on commit 4b1d9c4

Please sign in to comment.