]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.9] cmd/go: fix 'go get' compatibility for direct download of...
authorRuss Cox <rsc@golang.org>
Fri, 1 Jun 2018 19:47:29 +0000 (15:47 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 4 Jun 2018 16:21:11 +0000 (16:21 +0000)
CL 109340 added “minimal module-awareness for legacy operation.”
One part of that is reinterpreting imports inside code trees with go.mod files
as using semantic import versioning, and converting them back to
legacy import paths by stripping the major version element
(for example, interpreting import "x.com/foo/v2/bar" as import "x.com/foo/bar").
This rewrite was not being applied during "go get", with the effect that once
you had the target code downloaded already, everything was fine,
but it didn't download and build successfully the first time.

Fixes #25687.
Cherry-pick fixes #25691.

Change-Id: I3e122efdc8fd9a0a4e66f5aa3e6a99f90c7df779
Reviewed-on: https://go-review.googlesource.com/115797
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Reviewed-on: https://go-review.googlesource.com/116175

src/cmd/go/internal/get/get.go
src/cmd/go/internal/load/pkg.go
src/cmd/go/vendor_test.go

index 54460ec38fcb6b0db1ef3ae133f86d5e1e6f9e06..6495576ab4b6a2456769ef8e807fd924066f1d5e 100644 (file)
@@ -218,7 +218,7 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int)
                if parent == nil {
                        return load.LoadPackage(path, stk)
                }
-               return load.LoadImport(path, parent.Dir, parent, stk, nil, mode)
+               return load.LoadImport(path, parent.Dir, parent, stk, nil, mode|load.ResolveModule)
        }
 
        p := load1(arg, mode)
@@ -347,12 +347,12 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int)
                                base.Errorf("%s", err)
                                continue
                        }
-                       // If this is a test import, apply vendor lookup now.
-                       // We cannot pass useVendor to download, because
+                       // If this is a test import, apply module and vendor lookup now.
+                       // We cannot pass ResolveImport to download, because
                        // download does caching based on the value of path,
                        // so it must be the fully qualified path already.
                        if i >= len(p.Imports) {
-                               path = load.VendoredImportPath(p, path)
+                               path = load.ResolveImportPath(p, path)
                        }
                        download(path, p, stk, 0)
                }
index de3f5b8fa26466ffd92770a4bc728edd3ce501fd..873abe07a0a34fcda5312f3b68140f34fb2df78e 100644 (file)
@@ -395,7 +395,11 @@ const (
        // disallowVendor will reject direct use of paths containing /vendor/.
        ResolveImport = 1 << iota
 
-       // getTestDeps is for download (part of "go get") and indicates
+       // ResolveModule is for download (part of "go get") and indicates
+       // that the module adjustment should be done, but not vendor adjustment.
+       ResolveModule
+
+       // GetTestDeps is for download (part of "go get") and indicates
        // that test dependencies should be fetched too.
        GetTestDeps
 )
@@ -425,6 +429,9 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo
                // The code is also needed in a few other places anyway.
                path = ResolveImportPath(parent, path)
                importPath = path
+       } else if mode&ResolveModule != 0 {
+               path = ModuleImportPath(parent, path)
+               importPath = path
        }
 
        p := packageCache[importPath]
index d68e4f94fe55f98e19f9ea4de56989ebb453fe73..c394365d9f9882e7715cf427ebf0501d86143a9e 100644 (file)
@@ -10,6 +10,7 @@ import (
        "bytes"
        "fmt"
        "internal/testenv"
+       "os"
        "path/filepath"
        "regexp"
        "strings"
@@ -351,10 +352,51 @@ func TestModLegacyGet(t *testing.T) {
        tg := testgo(t)
        defer tg.cleanup()
        tg.makeTempdir()
-       tg.setenv("GOPATH", tg.path("."))
+       tg.setenv("GOPATH", tg.path("d1"))
        tg.run("get", "vcs-test.golang.org/git/modlegacy1-old.git/p1")
        tg.run("list", "-f", "{{.Deps}}", "vcs-test.golang.org/git/modlegacy1-old.git/p1")
        tg.grepStdout("new.git/p2", "old/p1 should depend on new/p2")
        tg.grepStdoutNot("new.git/v2/p2", "old/p1 should NOT depend on new/v2/p2")
        tg.run("build", "vcs-test.golang.org/git/modlegacy1-old.git/p1", "vcs-test.golang.org/git/modlegacy1-new.git/p1")
+
+       tg.setenv("GOPATH", tg.path("d2"))
+
+       tg.must(os.RemoveAll(tg.path("d2")))
+       tg.run("get", "github.com/rsc/vgotest5")
+       tg.run("get", "github.com/rsc/vgotest4")
+       tg.run("get", "github.com/myitcv/vgo_example_compat")
+
+       if testing.Short() {
+               return
+       }
+
+       tg.must(os.RemoveAll(tg.path("d2")))
+       tg.run("get", "github.com/rsc/vgotest4")
+       tg.run("get", "github.com/rsc/vgotest5")
+       tg.run("get", "github.com/myitcv/vgo_example_compat")
+
+       tg.must(os.RemoveAll(tg.path("d2")))
+       tg.run("get", "github.com/rsc/vgotest4", "github.com/rsc/vgotest5")
+       tg.run("get", "github.com/myitcv/vgo_example_compat")
+
+       tg.must(os.RemoveAll(tg.path("d2")))
+       tg.run("get", "github.com/rsc/vgotest5", "github.com/rsc/vgotest4")
+       tg.run("get", "github.com/myitcv/vgo_example_compat")
+
+       tg.must(os.RemoveAll(tg.path("d2")))
+       tg.run("get", "github.com/myitcv/vgo_example_compat")
+       tg.run("get", "github.com/rsc/vgotest4", "github.com/rsc/vgotest5")
+
+       pkgs := []string{"github.com/myitcv/vgo_example_compat", "github.com/rsc/vgotest4", "github.com/rsc/vgotest5"}
+       for i := 0; i < 3; i++ {
+               for j := 0; j < 3; j++ {
+                       for k := 0; k < 3; k++ {
+                               if i == j || i == k || k == j {
+                                       continue
+                               }
+                               tg.must(os.RemoveAll(tg.path("d2")))
+                               tg.run("get", pkgs[i], pkgs[j], pkgs[k])
+                       }
+               }
+       }
 }