]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: populate available module information for packages in vendor mode
authorBryan C. Mills <bcmills@google.com>
Wed, 23 Oct 2019 20:43:55 +0000 (16:43 -0400)
committerBryan C. Mills <bcmills@google.com>
Thu, 24 Oct 2019 16:17:59 +0000 (16:17 +0000)
Updates #33848

Change-Id: I10b4c79faef8bc3dee2ceba14d496fa049e84fb2
Reviewed-on: https://go-review.googlesource.com/c/go/+/202977
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
src/cmd/go/internal/modload/build.go
src/cmd/go/testdata/script/mod_vendor_replace.txt

index 4105c47ba7611ed364706f05b7961b93d6db2f05..f31f60a448b6684cd8078fe3fda52f7ef94ae88c 100644 (file)
@@ -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
 }
 
index 900b36a07240cc048a9a15a78b18321883671e05..0c1c1d22f5bff1602ea2e7541da02e95fad8b7af 100644 (file)
@@ -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