Skip to content

cmd/go: fix go get with ... fails in module mode #29606

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 28 additions & 9 deletions src/cmd/go/internal/modload/import.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,18 +252,37 @@ func dirInModule(path, mpath, mdir string, isLocal bool) (dir string, haveGoFile
// We don't care about build tags, not even "+build ignore".
// We're just looking for a plausible directory.
haveGoFiles = haveGoFilesCache.Do(dir, func() interface{} {
f, err := os.Open(dir)
if strings.HasSuffix(dir, "/...") {
dir = strings.TrimSuffix(dir, "/...")
var have bool
_ = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
// ignore dir
return nil
}
if filepath.Ext(info.Name()) == ".go" && info.Mode().IsRegular() {
have = true
return errors.New("just to terminate walk")
}
return nil
})
return have
}
pattern := filepath.Join(dir, "*.go")
goFiles, err := filepath.Glob(pattern)
if err != nil {
return false
}
defer f.Close()
names, _ := f.Readdirnames(-1)
for _, name := range names {
if strings.HasSuffix(name, ".go") {
info, err := os.Stat(filepath.Join(dir, name))
if err == nil && info.Mode().IsRegular() {
return true
}
for _, fullPath := range goFiles {
info, err := os.Stat(fullPath)
if err != nil {
return false
}
if info.Mode().IsRegular() {
return true
}
}
return false
Expand Down
87 changes: 87 additions & 0 deletions src/cmd/go/internal/modload/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,90 @@ func TestQuery(t *testing.T) {
})
}
}

var (
_queryPackage = []struct {
path string
query string
err string
realPath string
version string
}{
{
path: "github.com/google/codesearch/cmd/...",
query: "latest",
err: "",
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
{
path: "github.com/google/codesearch/cmd/...",
query: "v1.1.0",
err: "",
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
{
path: "github.com/google/codesearch/cmd",
query: "latest",
err: `no matching versions for query "latest"`,
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
{
path: "github.com/google/codesearch/cmd",
query: "v1.1.0",
err: `unknown revision cmd/v1.1.0`,
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
{
path: "github.com/google/codesearch/...",
query: "latest",
err: ``,
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
{
path: "github.com/google/codesearch/...",
query: "v1.1.0",
err: ``,
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
{
path: "github.com/google/codesearch",
query: "latest",
err: `invalid github.com/ import path "github.com/google"`,
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
{
path: "github.com/google/codesearch",
query: "v1.1.0",
err: `invalid github.com/ import path "github.com/google"`,
realPath: "github.com/google/codesearch",
version: "v1.1.0",
},
}
)

func TestQueryPackage(t *testing.T) {
for _, tt := range _queryPackage {
t.Run(strings.Replace(tt.path, "/", "_", -1)+"@"+tt.query, func(t *testing.T) {
m, _, err := QueryPackage(tt.path, tt.query, Allowed)
if err != nil {
if err.Error() != tt.err {
t.Errorf("queryPackage %s get wrong err: %s, expect: %s", tt.path, err, tt.err)
}
return
}
if m.Version != tt.version {
t.Errorf("queryPackage get wrong info: %s, expect: %s", m.Version, tt.version)
}
if m.Path != tt.realPath {
t.Errorf("queryPackage get wrong path: %s, expect: %s", m.Path, tt.realPath)
}
})
}
}
79 changes: 79 additions & 0 deletions src/cmd/go/testdata/script/mod_get_wildcard.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# This testcase is specific for wildcards
env GO111MODULE=on

# turn off proxy.
[!net] skip
[!exec:git] skip
env GOPROXY=

# try get master, just similar with mod_get_pseudo, except end with /... (wildcards)
go get -m github.com/rsc/legacytest/...@master
go list -m all
stdout '^github.com/rsc/legacytest v2\.0\.1-0\.\d{14}-7303f7796364\+incompatible$'

# try get latest, just similar with mod_get_pseudo, except end with /... (wildcards)
go get -m github.com/rsc/legacytest/...@latest
go list
go list -m all
stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'

# v2.0.1-0.pseudo+incompatible
go get -m ...test...@7303f77
go list -m all
stdout '^github.com/rsc/legacytest v2\.0\.1-0\.\d{14}-7303f7796364\+incompatible$'

# v2.0.0+incompatible by tag+incompatible
go get -m [email protected]+incompatible
go list -m all
stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'

# v2.0.0+incompatible by tag
go get -m [email protected]
go list -m all
stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'

# v2.0.0+incompatible by hash (back on master)
go get -m ...test...@d7ae1e4
go list -m all
stdout '^github.com/rsc/legacytest v2\.0\.0\+incompatible$'

# v1.2.1-0.pseudo
go get -m ...test...@d2d4c3e
go list -m all
stdout '^github.com/rsc/legacytest v1\.2\.1-0\.\d{14}-d2d4c3ea6623$'

# v1.2.0
go get -m ...test...@9f6f860
go list -m all
stdout '^github.com/rsc/legacytest v1\.2\.0$'

# v1.1.0-pre.0.pseudo
go get -m ...test...@fb3c628
go list -m all
stdout '^github.com/rsc/legacytest v1\.1\.0-pre\.0\.\d{14}-fb3c628075e3$'

# v1.1.0-pre (no longer on master)
go get -m ...test...@731e3b1
go list -m all
stdout '^github.com/rsc/legacytest v1\.1\.0-pre$'

# v1.0.1-0.pseudo
go get -m ...test...@fa4f5d6
go list -m all
stdout '^github.com/rsc/legacytest v1\.0\.1-0\.\d{14}-fa4f5d6a71c6$'

# v1.0.0
go get -m ...test...@7fff7f3
go list -m all
stdout '^github.com/rsc/legacytest v1\.0\.0$'

# v0.0.0-pseudo
go get -m ...test...@52853eb
go list -m all
stdout '^github.com/rsc/legacytest v0\.0\.0-\d{14}-52853eb7b552$'

-- go.mod --
module x
-- x.go --
package x
import "github.com/rsc/legacytest"