From b36f22bff04cf62f77d42d9584a050afffa2d723 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 23 Oct 2019 16:43:55 -0400 Subject: [PATCH] cmd/go: populate available module information for packages in vendor mode Updates #33848 Change-Id: I10b4c79faef8bc3dee2ceba14d496fa049e84fb2 Reviewed-on: https://go-review.googlesource.com/c/go/+/202977 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/build.go | 30 +++++++++++-------- .../go/testdata/script/mod_vendor_replace.txt | 7 ++++- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 4105c47ba7..f31f60a448 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -119,14 +119,8 @@ func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { info.GoVersion = loaded.goVersion[m.Path] } - if cfg.BuildMod == "vendor" { - // The vendor directory doesn't contain enough information to reconstruct - // anything more about the module. - return info - } - - // complete fills in the extra fields in m. - complete := func(m *modinfo.ModulePublic) { + // completeFromModCache fills in the extra fields in m using the module cache. + completeFromModCache := func(m *modinfo.ModulePublic) { if m.Version != "" { if q, err := Query(m.Path, m.Version, "", nil); err != nil { m.Error = &modinfo.ModuleError{Err: err.Error()} @@ -152,13 +146,21 @@ func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { } if !fromBuildList { - complete(info) + completeFromModCache(info) // Will set m.Error in vendor mode. return info } r := Replacement(m) if r.Path == "" { - complete(info) + if cfg.BuildMod == "vendor" { + // It's tempting to fill in the "Dir" field to point within the vendor + // directory, but that would be misleading: the vendor directory contains + // a flattened package tree, not complete modules, and it can even + // interleave packages from different modules if one module path is a + // prefix of the other. + } else { + completeFromModCache(info) + } return info } @@ -178,9 +180,11 @@ func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { info.Replace.Dir = filepath.Join(ModRoot(), r.Path) } } - complete(info.Replace) - info.Dir = info.Replace.Dir - info.GoMod = filepath.Join(info.Dir, "go.mod") + if cfg.BuildMod != "vendor" { + completeFromModCache(info.Replace) + info.Dir = info.Replace.Dir + info.GoMod = filepath.Join(info.Dir, "go.mod") + } return info } diff --git a/src/cmd/go/testdata/script/mod_vendor_replace.txt b/src/cmd/go/testdata/script/mod_vendor_replace.txt index 900b36a072..0c1c1d22f5 100644 --- a/src/cmd/go/testdata/script/mod_vendor_replace.txt +++ b/src/cmd/go/testdata/script/mod_vendor_replace.txt @@ -21,6 +21,11 @@ stdout '.*[/\\]vendor[/\\]rsc.io[/\\]quote[/\\]v3' ! stderr 'finding' ! stderr 'lookup disabled' +# 'go list' should provide the original replacement directory as the module's +# replacement path. +go list -mod=vendor -f '{{with .Module}}{{with .Replace}}{{.Path}}{{end}}{{end}}' rsc.io/quote/v3 +stdout '.*[/\\]not-rsc.io[/\\]quote[/\\]v3' + # The same module can't be used as two different paths. cd multiple-paths ! go mod vendor @@ -58,4 +63,4 @@ require ( rsc.io/quote/v3 v3.0.0 not-rsc.io/quote/v3 v3.0.0 ) -replace not-rsc.io/quote/v3 => rsc.io/quote/v3 v3.0.0 \ No newline at end of file +replace not-rsc.io/quote/v3 => rsc.io/quote/v3 v3.0.0 -- 2.50.0