Commit 6140829e authored by Russ Cox's avatar Russ Cox

cmd/go: convert still more module tests to scripts

Change-Id: I249bb848c9911948dbd84cd88ad043a61ed6ea6b
Reviewed-on: https://go-review.googlesource.com/124699Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
parent e3f15e3b
......@@ -10,9 +10,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
"regexp"
"sort"
"strings"
"testing"
"cmd/go/internal/cfg"
......@@ -414,226 +412,6 @@ require x.3 v1.99.0
`)
}
func TestModGetVersions(t *testing.T) {
tg := testGoModules(t)
defer tg.cleanup()
tg.setenv(homeEnvName(), tg.path("home"))
tg.must(os.MkdirAll(tg.path("x"), 0777))
tg.cd(tg.path("x"))
tg.must(ioutil.WriteFile(tg.path("x/x.go"), []byte(`package x`), 0666))
tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
module x
require rsc.io/quote v1.1.0
`), 0666))
tg.run("get", "rsc.io/quote@v2.0.0")
tg.run("list", "-m", "all")
tg.grepStdout("rsc.io/quote.*v0.0.0-20180709153244-fd906ed3b100", "did downgrade to v0.0.0-*")
tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
module x
require rsc.io/quote v1.2.0
`), 0666))
tg.run("get", "rsc.io/quote@v1.1.0")
tg.run("list", "-m", "-u", "all")
tg.grepStdout(`rsc.io/quote v1.1.0`, "did downgrade to v1.1.0")
tg.grepStdout(`rsc.io/quote v1.1.0 \[v1`, "did show upgrade to v1.2.0 or later")
tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
module x
require rsc.io/quote v1.1.0
`), 0666))
tg.run("get", "rsc.io/quote@v1.2.0")
tg.run("list", "-m", "all")
tg.grepStdout("rsc.io/quote.*v1.2.0", "did upgrade to v1.2.0")
// @14c0d48ead0c should resolve,
// and also there should be no build error about not having Go files in the root.
tg.run("get", "golang.org/x/text@14c0d48ead0c")
// @14c0d48ead0c should resolve.
// Now there should be no build at all.
tg.run("get", "-m", "golang.org/x/text@14c0d48ead0c")
// language@7f39a6fea4fe9364 should not resolve with -m,
// because .../language is not a module path.
tg.runFail("get", "-m", "golang.org/x/text/language@14c0d48ead0c")
// language@7f39a6fea4fe9364 should resolve without -m.
// Because of -d, there should be no build at all.
tg.run("get", "-d", "-x", "golang.org/x/text/language@14c0d48ead0c")
tg.grepStderrNot(`compile|cp .*language\.a$`, "should not see compile steps")
// Dropping -d, we should see a build now.
tg.run("get", "-x", "golang.org/x/text/language@14c0d48ead0c")
tg.grepStderr(`compile|cp .*language\.a$`, "should see compile steps")
// Even with -d, we should see an error for unknown packages.
tg.runFail("get", "-x", "golang.org/x/text/foo@14c0d48ead0c")
}
func TestModGetUpgrade(t *testing.T) {
tg := testGoModules(t)
defer tg.cleanup()
tg.setenv(homeEnvName(), tg.path("home"))
tg.must(os.MkdirAll(tg.path("x"), 0777))
tg.cd(tg.path("x"))
tg.must(ioutil.WriteFile(tg.path("x/x.go"), []byte(`package x; import _ "rsc.io/quote"`), 0666))
tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
module x
require rsc.io/quote v1.5.1
`), 0666))
tg.run("get", "-x", "-u")
tg.run("list", "-m", "-f={{.Path}} {{.Version}}{{if .Indirect}} // indirect{{end}}", "all")
tg.grepStdout(`quote v1.5.2$`, "should have upgraded only to v1.5.2")
tg.grepStdout(`x/text [v0-9a-f.\-]+ // indirect`, "should list golang.org/x/text as indirect")
var gomod string
readGoMod := func() {
data, err := ioutil.ReadFile(tg.path("x/go.mod"))
if err != nil {
t.Fatal(err)
}
gomod = string(data)
}
readGoMod()
if !strings.Contains(gomod, "rsc.io/quote v1.5.2\n") {
t.Fatalf("expected rsc.io/quote direct requirement:\n%s", gomod)
}
if !regexp.MustCompile(`(?m)golang.org/x/text.* // indirect`).MatchString(gomod) {
t.Fatalf("expected golang.org/x/text indirect requirement:\n%s", gomod)
}
tg.must(ioutil.WriteFile(tg.path("x/x.go"), []byte(`package x; import _ "golang.org/x/text"`), 0666))
tg.run("list") // rescans directory
readGoMod()
if !strings.Contains(gomod, "rsc.io/quote v1.5.2\n") {
t.Fatalf("expected rsc.io/quote direct requirement:\n%s", gomod)
}
if !regexp.MustCompile(`(?m)golang.org/x/text[^/]+\n`).MatchString(gomod) {
t.Fatalf("expected golang.org/x/text DIRECT requirement:\n%s", gomod)
}
tg.must(ioutil.WriteFile(tg.path("x/x.go"), []byte(`package x; import _ "rsc.io/quote"`), 0666))
tg.run("mod", "-sync") // rescans everything, can put // indirect marks back
readGoMod()
if !strings.Contains(gomod, "rsc.io/quote v1.5.2\n") {
t.Fatalf("expected rsc.io/quote direct requirement:\n%s", gomod)
}
if !regexp.MustCompile(`(?m)golang.org/x/text.* // indirect\n`).MatchString(gomod) {
t.Fatalf("expected golang.org/x/text indirect requirement:\n%s", gomod)
}
tg.run("get", "rsc.io/quote@v0.0.0-20180214005840-23179ee8a569") // should record as (time-corrected) pseudo-version
readGoMod()
if !strings.Contains(gomod, "rsc.io/quote v0.0.0-20180214005840-23179ee8a569\n") {
t.Fatalf("expected rsc.io/quote v0.0.0-20180214005840-23179ee8a569 (not v1.5.1)\n%s", gomod)
}
tg.run("get", "rsc.io/quote@23179ee") // should record as v1.5.1
readGoMod()
if !strings.Contains(gomod, "rsc.io/quote v1.5.1\n") {
t.Fatalf("expected rsc.io/quote v1.5.1 (not 23179ee)\n%s", gomod)
}
tg.run("mod", "-require", "rsc.io/quote@23179ee") // should record as 23179ee
readGoMod()
if !strings.Contains(gomod, "rsc.io/quote 23179ee\n") {
t.Fatalf("expected rsc.io/quote 23179ee\n%s", gomod)
}
tg.run("mod", "-fix") // fixup in any future go command should find v1.5.1 again
readGoMod()
if !strings.Contains(gomod, "rsc.io/quote v1.5.1\n") {
t.Fatalf("expected rsc.io/quote v1.5.1\n%s", gomod)
}
tg.run("get", "-m", "rsc.io/quote@dd9747d")
tg.run("list", "-m", "all")
tg.grepStdout(`quote v0.0.0-20180628003336-dd9747d19b04$`, "should have moved to pseudo-commit")
tg.run("get", "-m", "-u")
tg.run("list", "-m", "all")
tg.grepStdout(`quote v0.0.0-20180628003336-dd9747d19b04$`, "should have stayed on pseudo-commit")
tg.run("get", "-m", "rsc.io/quote@e7a685a342")
tg.run("list", "-m", "all")
tg.grepStdout(`quote v0.0.0-20180214005133-e7a685a342c0$`, "should have moved to new pseudo-commit")
tg.run("get", "-m", "-u")
tg.run("list", "-m", "all")
tg.grepStdout(`quote v1.5.2$`, "should have moved off pseudo-commit")
tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
module x
`), 0666))
tg.run("list")
tg.run("list", "-m", "all")
tg.grepStdout(`quote v1.5.2$`, "should have added quote v1.5.2")
tg.grepStdoutNot(`v1.5.3-pre1`, "should not mention v1.5.3-pre1")
tg.run("list", "-m", "-versions", "rsc.io/quote")
want := "rsc.io/quote v1.0.0 v1.1.0 v1.2.0 v1.2.1 v1.3.0 v1.4.0 v1.5.0 v1.5.1 v1.5.2 v1.5.3-pre1\n"
if tg.getStdout() != want {
t.Errorf("go list versions:\nhave:\n%s\nwant:\n%s", tg.getStdout(), want)
}
tg.run("list", "-m", "rsc.io/quote@>v1.5.2")
tg.grepStdout(`v1.5.3-pre1`, "expected to find v1.5.3-pre1")
tg.run("list", "-m", "rsc.io/quote@<v1.5.4")
tg.grepStdout(`v1.5.2$`, "expected to find v1.5.2 (NOT v1.5.3-pre1)")
tg.runFail("list", "-m", "rsc.io/quote@>v1.5.3")
tg.grepStderr(`go list -m rsc.io/quote: no matching versions for query ">v1.5.3"`, "expected no matching version")
tg.run("list", "-m", "-e", "-f={{.Error.Err}}", "rsc.io/quote@>v1.5.3")
tg.grepStdout(`no matching versions for query ">v1.5.3"`, "expected no matching version")
tg.must(ioutil.WriteFile(tg.path("x/go.mod"), []byte(`
module x
require rsc.io/quote v1.4.0
`), 0666))
tg.run("list", "-m", "all")
tg.grepStdout(`rsc.io/sampler v1.0.0`, "expected sampler v1.0.0")
tg.run("get", "-m", "-u=patch", "rsc.io/quote")
tg.run("list", "-m", "all")
tg.grepStdout(`rsc.io/quote v1.5.2`, "expected quote v1.5.2") // rsc.io/quote gets implicit @latest (not -u=patch)
tg.grepStdout(`rsc.io/sampler v1.3.1`, "expected sampler v1.3.1") // even though v1.5.2 requires v1.3.0
tg.grepStdout(`golang.org/x/text v0.0.0-`, "expected x/text pseudo-version") // can't jump from v0.0.0- to v0.3.0
tg.run("get", "-m", "-u=patch", "rsc.io/quote@v1.2.0")
tg.run("list", "-m", "all")
tg.grepStdout(`rsc.io/quote v1.2.0`, "expected quote v1.2.0") // not v1.2.1: -u=patch applies to deps of args, not args
tg.grepStdout(`rsc.io/sampler v1.3.1`, "expected sampler line to stay") // even though v1.2.0 does not require sampler?
tg.run("get", "-m", "-u=patch")
tg.run("list", "-m", "all")
tg.grepStdout(`rsc.io/quote v1.2.1`, "expected quote v1.2.1") // -u=patch with no args applies to deps of main module
tg.grepStdout(`rsc.io/sampler v1.3.1`, "expected sampler line to stay")
tg.grepStdout(`golang.org/x/text v0.0.0-`, "expected x/text pseudo-version") // even though x/text v0.3.0 is tagged
tg.run("get", "-m", "rsc.io/quote@v1.5.1")
tg.run("mod", "-vendor")
tg.setenv("GOPATH", tg.path("empty"))
tg.setenv("GOPROXY", "file:///nonexist")
tg.run("list", "-getmode=vendor", "all")
tg.run("list", "-getmode=vendor", "-m", "-f={{.Path}} {{.Version}} {{.Dir}}", "all")
tg.grepStdout(`rsc.io/quote v1.5.1 .*vendor[\\/]rsc.io[\\/]quote`, "expected vendored rsc.io/quote")
tg.grepStdout(`golang.org/x/text v0.0.0.* .*vendor[\\/]golang.org[\\/]x[\\/]text`, "expected vendored golang.org/x/text")
tg.runFail("list", "-getmode=vendor", "-m", "rsc.io/quote@latest")
tg.grepStderr(`module lookup disabled by -getmode=vendor`, "expected disabled")
tg.runFail("get", "-getmode=vendor", "-u")
tg.grepStderr(`go get: disabled by -getmode=vendor`, "expected disabled")
}
func TestModSync(t *testing.T) {
tg := testGoModules(t)
defer tg.cleanup()
......@@ -793,46 +571,3 @@ func TestModVendor(t *testing.T) {
tg.run("test", "-getmode=vendor", "./...")
}
}
func TestModMultiVersion(t *testing.T) {
tg := testGoModules(t)
defer tg.cleanup()
checkModules := func(dirs ...string) {
t.Helper()
tg.run("list", "-deps", "-f", "{{.ImportPath}}: {{.Dir}}")
for _, line := range strings.Split(tg.getStdout(), "\n") {
line = strings.Replace(line, `\`, `/`, -1) // windows!
if strings.HasPrefix(line, "rsc.io/quote: ") {
if strings.Contains(line, "/src/mod/") {
t.Fatalf("rsc.io/quote should not be from module cache: %v", line)
}
} else if strings.Contains(line, "rsc.io/quote") {
if !strings.Contains(line, "/src/mod/") {
t.Fatalf("rsc.io/quote/* should be from module cache: %v", line)
}
}
}
}
tg.extract("testdata/mod/rsc.io_quote_v1.5.2.txt")
checkModules()
// These are git checkouts from rsc.io/quote not downlaoded modules.
// As such they contain extra files like spurious pieces of other modules.
tg.extract("testdata/rsc.io_quote_0d003b9.txt") // wraps v2
checkModules()
tg.extract("testdata/rsc.io_quote_b44a0b1.txt") // adds go.mod
checkModules()
tg.extract("testdata/rsc.io_quote_fe488b8.txt") // adds broken v3 subdirectory
tg.run("list", "./...") // should ignore v3 because v3/go.mod exists
checkModules()
tg.extract("testdata/rsc.io_quote_a91498b.txt") // wraps v3
checkModules() // looks up v3 from internet, not v3 subdirectory
tg.extract("testdata/rsc.io_quote_5d9f230.txt") // adds go.mod
checkModules() // knows which v3 to use (still needs download from internet, cached from last step)
}
......@@ -569,7 +569,9 @@ func scriptMatch(ts *testScript, neg bool, args []string, text, name string) {
re, err := regexp.Compile(`(?m)` + pattern)
ts.check(err)
if name == "grep" {
isGrep := name == "grep"
if isGrep {
name = args[1] // for error messages
data, err := ioutil.ReadFile(ts.mkabs(args[1]))
ts.check(err)
text = string(data)
......@@ -577,15 +579,24 @@ func scriptMatch(ts *testScript, neg bool, args []string, text, name string) {
if neg {
if re.MatchString(text) {
ts.fatalf("unexpected match for %#q found in %s: %s %q", pattern, name, text, re.FindString(text))
if isGrep {
fmt.Fprintf(&ts.log, "[%s]\n%s\n", name, text)
}
ts.fatalf("unexpected match for %#q found in %s: %s", pattern, name, re.FindString(text))
}
} else {
if !re.MatchString(text) {
if isGrep {
fmt.Fprintf(&ts.log, "[%s]\n%s\n", name, text)
}
ts.fatalf("no match for %#q found in %s", pattern, name)
}
if n > 0 {
count := len(re.FindAllString(text, -1))
if count != n {
if isGrep {
fmt.Fprintf(&ts.log, "[%s]\n%s\n", name, text)
}
ts.fatalf("have %d matches for %#q, want %d", count, pattern, n)
}
}
......
generated by: go run savedir.go .
-- LICENSE --
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- README.md --
This package collects pithy sayings.
It's part of a demonstration of
[package versioning in Go](https://research.swtch.com/vgo1).
-- buggy/buggy_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package buggy
import "testing"
func Test(t *testing.T) {
t.Fatal("buggy!")
}
-- go.mod --
module rsc.io/quote
require rsc.io/sampler v1.3.0
-- quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/quote/v2"
// Hello returns a greeting.
func Hello() string {
return quote.HelloV2()
}
// Glass returns a useful phrase for world travelers.
func Glass() string {
// See http://www.oocities.org/nodotus/hbglass.html.
return quote.GlassV2()
}
// Go returns a Go proverb.
func Go() string {
return quote.GoV2()
}
// Opt returns an optimization truth.
func Opt() string {
// Wisdom from ken.
return quote.OptV2()
}
-- quote_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package quote
import (
"os"
"testing"
)
func init() {
os.Setenv("LC_ALL", "en")
}
func TestHello(t *testing.T) {
hello := "Hello, world."
if out := Hello(); out != hello {
t.Errorf("Hello() = %q, want %q", out, hello)
}
}
func TestGlass(t *testing.T) {
glass := "I can eat glass and it doesn't hurt me."
if out := Glass(); out != glass {
t.Errorf("Glass() = %q, want %q", out, glass)
}
}
func TestGo(t *testing.T) {
go1 := "Don't communicate by sharing memory, share memory by communicating."
if out := Go(); out != go1 {
t.Errorf("Go() = %q, want %q", out, go1)
}
}
func TestOpt(t *testing.T) {
opt := "If a program is too slow, it must have a loop."
if out := Opt(); out != opt {
t.Errorf("Opt() = %q, want %q", out, opt)
}
}
-- v3/go.mod --
module rsc.io/quote/v3
require rsc.io/sampler v1.3.0
-- v3/go.sum --
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/sampler v1.99.99 h1:7i08f/p5TBU5joCPW3GjWG1ZFCmr28ybGqlXtelhEK8=
rsc.io/sampler v1.99.99/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-- v3/quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/sampler"
// Hello returns a greeting.
func HelloV3() string {
return sampler.Hello()
}
// Glass returns a useful phrase for world travelers.
func GlassV3() string {
// See http://www.oocities.org/nodotus/hbglass.html.
return "I can eat glass and it doesn't hurt me."
}
// Go returns a Go proverb.
func GoV3() string {
return "Don't communicate by sharing memory, share memory by communicating."
}
// Opt returns an optimization truth.
func OptV3() string {
// Wisdom from ken.
return "If a program is too slow, it must have a loop."
}
generated by: go run savedir.go .
-- LICENSE --
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- README.md --
This package collects pithy sayings.
It's part of a demonstration of
[package versioning in Go](https://research.swtch.com/vgo1).
-- buggy/buggy_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package buggy
import "testing"
func Test(t *testing.T) {
t.Fatal("buggy!")
}
-- go.mod --
module rsc.io/quote
require (
rsc.io/quote/v3 v3.0.0
rsc.io/sampler v1.3.0
)
-- quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/quote/v3"
// Hello returns a greeting.
func Hello() string {
return quote.HelloV3()
}
// Glass returns a useful phrase for world travelers.
func Glass() string {
// See http://www.oocities.org/nodotus/hbglass.html.
return quote.GlassV3()
}
// Go returns a Go proverb.
func Go() string {
return quote.GoV3()
}
// Opt returns an optimization truth.
func Opt() string {
// Wisdom from ken.
return quote.OptV3()
}
-- quote_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package quote
import (
"os"
"testing"
)
func init() {
os.Setenv("LC_ALL", "en")
}
func TestHello(t *testing.T) {
hello := "Hello, world."
if out := Hello(); out != hello {
t.Errorf("Hello() = %q, want %q", out, hello)
}
}
func TestGlass(t *testing.T) {
glass := "I can eat glass and it doesn't hurt me."
if out := Glass(); out != glass {
t.Errorf("Glass() = %q, want %q", out, glass)
}
}
func TestGo(t *testing.T) {
go1 := "Don't communicate by sharing memory, share memory by communicating."
if out := Go(); out != go1 {
t.Errorf("Go() = %q, want %q", out, go1)
}
}
func TestOpt(t *testing.T) {
opt := "If a program is too slow, it must have a loop."
if out := Opt(); out != opt {
t.Errorf("Opt() = %q, want %q", out, opt)
}
}
-- v3/go.mod --
module rsc.io/quote/v3
require rsc.io/sampler v1.3.0
-- v3/go.sum --
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/sampler v1.99.99 h1:7i08f/p5TBU5joCPW3GjWG1ZFCmr28ybGqlXtelhEK8=
rsc.io/sampler v1.99.99/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-- v3/quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/sampler"
// Hello returns a greeting.
func HelloV3() string {
return sampler.Hello()
generated by: go run savedir.go .
-- LICENSE --
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- README.md --
This package collects pithy sayings.
It's part of a demonstration of
[package versioning in Go](https://research.swtch.com/vgo1).
-- buggy/buggy_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package buggy
import "testing"
func Test(t *testing.T) {
t.Fatal("buggy!")
}
-- go.mod --
module rsc.io/quote
require rsc.io/sampler v1.3.0
-- quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/quote/v3"
// Hello returns a greeting.
func Hello() string {
return quote.HelloV3()
}
// Glass returns a useful phrase for world travelers.
func Glass() string {
// See http://www.oocities.org/nodotus/hbglass.html.
return quote.GlassV3()
}
// Go returns a Go proverb.
func Go() string {
return quote.GoV3()
}
// Opt returns an optimization truth.
func Opt() string {
// Wisdom from ken.
return quote.OptV3()
}
-- quote_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package quote
import (
"os"
"testing"
)
func init() {
os.Setenv("LC_ALL", "en")
}
func TestHello(t *testing.T) {
hello := "Hello, world."
if out := Hello(); out != hello {
t.Errorf("Hello() = %q, want %q", out, hello)
}
}
func TestGlass(t *testing.T) {
glass := "I can eat glass and it doesn't hurt me."
if out := Glass(); out != glass {
t.Errorf("Glass() = %q, want %q", out, glass)
}
}
func TestGo(t *testing.T) {
go1 := "Don't communicate by sharing memory, share memory by communicating."
if out := Go(); out != go1 {
t.Errorf("Go() = %q, want %q", out, go1)
}
}
func TestOpt(t *testing.T) {
opt := "If a program is too slow, it must have a loop."
if out := Opt(); out != opt {
t.Errorf("Opt() = %q, want %q", out, opt)
}
}
-- v3/go.mod --
module rsc.io/quote/v3
require rsc.io/sampler v1.3.0
-- v3/go.sum --
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/sampler v1.99.99 h1:7i08f/p5TBU5joCPW3GjWG1ZFCmr28ybGqlXtelhEK8=
rsc.io/sampler v1.99.99/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-- v3/quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/sampler"
// Hello returns a greeting.
func HelloV3() string {
return sampler.Hello()
generated by: go run savedir.go .
-- LICENSE --
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- README.md --
This package collects pithy sayings.
It's part of a demonstration of
[package versioning in Go](https://research.swtch.com/vgo1).
-- buggy/buggy_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package buggy
import "testing"
func Test(t *testing.T) {
t.Fatal("buggy!")
}
-- go.mod --
module rsc.io/quote
require (
rsc.io/quote/v2 v2.0.1
rsc.io/sampler v1.3.0
)
-- quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/quote/v2"
// Hello returns a greeting.
func Hello() string {
return quote.HelloV2()
}
// Glass returns a useful phrase for world travelers.
func Glass() string {
// See http://www.oocities.org/nodotus/hbglass.html.
return quote.GlassV2()
}
// Go returns a Go proverb.
func Go() string {
return quote.GoV2()
}
// Opt returns an optimization truth.
func Opt() string {
// Wisdom from ken.
return quote.OptV2()
}
-- quote_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package quote
import (
"os"
"testing"
)
func init() {
os.Setenv("LC_ALL", "en")
}
func TestHello(t *testing.T) {
hello := "Hello, world."
if out := Hello(); out != hello {
t.Errorf("Hello() = %q, want %q", out, hello)
}
}
func TestGlass(t *testing.T) {
glass := "I can eat glass and it doesn't hurt me."
if out := Glass(); out != glass {
t.Errorf("Glass() = %q, want %q", out, glass)
}
}
func TestGo(t *testing.T) {
go1 := "Don't communicate by sharing memory, share memory by communicating."
if out := Go(); out != go1 {
t.Errorf("Go() = %q, want %q", out, go1)
}
}
func TestOpt(t *testing.T) {
opt := "If a program is too slow, it must have a loop."
if out := Opt(); out != opt {
t.Errorf("Opt() = %q, want %q", out, opt)
}
}
-- v3/go.mod --
module rsc.io/quote/v3
require rsc.io/sampler v1.3.0
-- v3/go.sum --
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/sampler v1.99.99 h1:7i08f/p5TBU5joCPW3GjWG1ZFCmr28ybGqlXtelhEK8=
rsc.io/sampler v1.99.99/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-- v3/quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/sampler"
// Hello returns a greeting.
func HelloV3() string {
return sampler.Hello()
}
// Glass returns a useful phrase for world travelers.
func GlassV3() string {
// See http://www.oocities.org/nodotus/hbglass.html.
return "I can eat glass and it doesn't hurt me."
}
// Go returns a Go proverb.
func GoV3() string {
return "Don't communicate by sharing memory, share memory by communicating."
}
// Opt returns an optimization truth.
func OptV3() string {
// Wisdom from ken.
return "If a program is too slow, it must have a loop."
}
generated by: go run savedir.go .
-- LICENSE --
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- README.md --
This package collects pithy sayings.
It's part of a demonstration of
[package versioning in Go](https://research.swtch.com/vgo1).
-- buggy/buggy_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package buggy
import "testing"
func Test(t *testing.T) {
t.Fatal("buggy!")
}
-- go.mod --
module rsc.io/quote
require (
rsc.io/quote/v2 v2.0.1
rsc.io/sampler v1.3.0
)
-- quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/quote/v2"
// Hello returns a greeting.
func Hello() string {
return quote.HelloV2()
}
// Glass returns a useful phrase for world travelers.
func Glass() string {
// See http://www.oocities.org/nodotus/hbglass.html.
return quote.GlassV2()
}
// Go returns a Go proverb.
func Go() string {
return quote.GoV2()
}
// Opt returns an optimization truth.
func Opt() string {
// Wisdom from ken.
return quote.OptV2()
}
-- quote_test.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package quote
import (
"os"
"testing"
)
func init() {
os.Setenv("LC_ALL", "en")
}
func TestHello(t *testing.T) {
hello := "Hello, world."
if out := Hello(); out != hello {
t.Errorf("Hello() = %q, want %q", out, hello)
}
}
func TestGlass(t *testing.T) {
glass := "I can eat glass and it doesn't hurt me."
if out := Glass(); out != glass {
t.Errorf("Glass() = %q, want %q", out, glass)
}
}
func TestGo(t *testing.T) {
go1 := "Don't communicate by sharing memory, share memory by communicating."
if out := Go(); out != go1 {
t.Errorf("Go() = %q, want %q", out, go1)
}
}
func TestOpt(t *testing.T) {
opt := "If a program is too slow, it must have a loop."
if out := Opt(); out != opt {
t.Errorf("Opt() = %q, want %q", out, opt)
}
}
-- v3/go.mod --
module rsc.io/quote/v3
require rsc.io/sampler v1.3.0
-- v3/go.sum --
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/sampler v1.99.99 h1:7i08f/p5TBU5joCPW3GjWG1ZFCmr28ybGqlXtelhEK8=
rsc.io/sampler v1.99.99/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-- v3/quote.go --
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package quote collects pithy sayings.
package quote // import "rsc.io/quote"
import "rsc.io/sampler"
// Hello returns a greeting.
func HelloV3() string {
return sampler.Hello()
......@@ -2,21 +2,21 @@
env GO111MODULE=on
env GOPATH=$WORK/gopath1
cd $WORK/x
! go list -getmode=local all
go list all
go list -getmode=local all
! go list -getmode=local
go list
go list -getmode=local
env GOPROXY=file:///nonexist
go list -getmode=local all
go list -getmode=local
grep v1.5.1 $GOPATH/src/mod/cache/download/rsc.io/quote/@v/list
# Use download cache as file:/// proxy.
env GOPATH=$WORK/gopath2
env GOPROXY=file:///nonexist
! go list -getmode=local all
! go list all
! go list -getmode=local
! go list
env GOPROXY=file://$WORK/gopath1/src/mod/cache/download
! go list -getmode=local all
go list all
! go list -getmode=local
go list
grep v1.5.1 $GOPATH/src/mod/cache/download/rsc.io/quote/@v/list
-- $WORK/x/go.mod --
......
env GO111MODULE=on
# @commit should resolve
# go get should skip build with no Go files in root
go get golang.org/x/text@14c0d48
# ... and go get should skip build with -m
go get -m golang.org/x/text@14c0d48
# golang.org/x/text/language@commit should not resolve with -m,
# because that's not a module path.
! go get -m golang.org/x/text/language@14c0d48
# ... but it should work without -m.
# because of -d, the compiler should not run
go get -d -x golang.org/x/text/language@14c0d48
! stderr 'compile|cp|gccgo .*language\.a$'
# dropping -d, we should see a build.
go get -x golang.org/x/text/language@14c0d48
stderr 'compile|cp|gccgo .*language\.a$'
# even with -d, we should see an error for unknown packages.
! go get -d -x golang.org/x/text/foo@14c0d48
# get pseudo-version should record that version
go get rsc.io/quote@v0.0.0-20180214005840-23179ee8a569
grep 'rsc.io/quote v0.0.0-20180214005840-23179ee8a569' go.mod
# but as commit should record as v1.5.1
go get rsc.io/quote@23179ee8
grep 'rsc.io/quote v1.5.1' go.mod
# go mod -require does not interpret commits
go mod -require rsc.io/quote@23179ee
grep 'rsc.io/quote 23179ee' go.mod
# but go mod -fix fixes them
go mod -fix
grep 'rsc.io/quote v1.5.1' go.mod
-- go.mod --
module x
env GO111MODULE=on
go get rsc.io/quote@v2.0.0
go list -m all
stdout 'rsc.io/quote v0.0.0-'
-- go.mod --
module x
require rsc.io/quote v1.5.1
-- x.go --
package x
env GO111MODULE=on
# get -u should find quote v1.5.2
go get -u
go list -m all
stdout 'quote v1.5.2$'
grep 'rsc.io/quote v1.5.2$' go.mod
# it should also update x/text later than requested by v1.5.2
go list -m -f '{{.Path}} {{.Version}}{{if .Indirect}} // indirect{{end}}' all
stdout '^golang.org/x/text [v0-9a-f\.-]+ // indirect'
grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
# indirect tag should be removed upon seeing direct import
cp $WORK/tmp/usetext.go x.go
go list
grep 'rsc.io/quote v1.5.2$' go.mod
grep 'golang.org/x/text [v0-9a-f\.-]+$' go.mod
# indirect tag should be added by go mod -sync
cp $WORK/tmp/usequote.go x.go
go mod -sync
grep 'rsc.io/quote v1.5.2$' go.mod
grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
# requirement should be dropped entirely if not needed
cp $WORK/tmp/usetext.go x.go
go mod -sync
! grep rsc.io/quote go.mod
grep 'golang.org/x/text [v0-9a-f\.-]+$' go.mod
-- go.mod --
module x
require rsc.io/quote v1.5.1
-- x.go --
package x
-- $WORK/tmp/usetext.go --
package x
import _ "golang.org/x/text"
-- $WORK/tmp/usequote.go --
package x
import _ "rsc.io/quote"
env GO111MODULE=on
go get rsc.io/quote@v1.5.1
go list -m all
stdout 'rsc.io/quote v1.5.1'
grep 'rsc.io/quote v1.5.1$' go.mod
# get -u should update all dependencies
go get -u
grep 'rsc.io/quote v1.5.2$' go.mod
grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
# get -u rsc.io/sampler should update only sampler's dependencies
cp go.mod-v1.5.1 go.mod
go get -u rsc.io/sampler
grep 'rsc.io/quote v1.5.1$' go.mod
grep 'golang.org/x/text [v0-9a-f\.-]+ // indirect' go.mod
# move to a pseudo-version after any tags
go get -m rsc.io/quote@dd9747d
grep 'rsc.io/quote v0.0.0-20180628003336-dd9747d19b04' go.mod
# get -u should not jump off newer pseudo-version to earlier tag
go get -m -u
grep 'rsc.io/quote v0.0.0-20180628003336-dd9747d19b04' go.mod
# move to earlier pseudo-version
go get -m rsc.io/quote@e7a685a342
grep 'rsc.io/quote v0.0.0-20180214005133-e7a685a342c0' go.mod
# get -u should jump off earlier pseudo-version to newer tag
go get -m -u
grep 'rsc.io/quote v1.5.2' go.mod
-- go.mod --
module x
require rsc.io/quote v1.1.0
-- go.mod-v1.5.1 --
module x
require rsc.io/quote v1.5.1
env GO111MODULE=on
go get -m rsc.io/quote@v1.5.1
go mod -vendor
env GOPATH=$WORK/empty
env GOPROXY=file:///nonexist
go list -getmode=vendor
go list -getmode=vendor -m -f '{{.Path}} {{.Version}} {{.Dir}}' all
stdout '^rsc.io/quote v1.5.1 .*vendor[\\/]rsc.io[\\/]quote$'
stdout '^golang.org/x/text v0.0.0.* .*vendor[\\/]golang.org[\\/]x[\\/]text$'
! go list -getmode=vendor -m rsc.io/quote@latest
stderr 'module lookup disabled by -getmode=vendor'
! go get -getmode=vendor -u
stderr 'go get: disabled by -getmode=vendor'
-- go.mod --
module x
-- x.go --
package x
import _ "rsc.io/quote"
env GO111MODULE=on
# latest rsc.io/quote should be v1.5.2 not v1.5.3-pre1
go list
go list -m all
stdout 'rsc.io/quote v1.5.2'
# but v1.5.3-pre1 should be a known version
go list -m -versions rsc.io/quote
stdout '^rsc.io/quote v1.0.0 v1.1.0 v1.2.0 v1.2.1 v1.3.0 v1.4.0 v1.5.0 v1.5.1 v1.5.2 v1.5.3-pre1$'
-- go.mod --
module x
-- x.go --
package x
import _ "rsc.io/quote"
env GO111MODULE=on
go list -m -u all
stdout 'rsc.io/quote v1.2.0 \[v1\.5\.2\]'
-- go.mod --
module x
require rsc.io/quote v1.2.0
env GO111MODULE=on
# initial standalone module should use no downloaded modules
go list -deps -f {{.Dir}}
! stdout 'src[\\/]mod'
# v2 import should use a downloaded module
# both without an explicit go.mod entry ...
cp tmp/use_v2.go x.go
go list -deps -f {{.Dir}}
stdout 'src[\\/]mod[\\/]rsc.io[\\/]quote[\\/]v2@v2.0.1$'
# ... and with one ...
cp tmp/use_v2.mod go.mod
go list -deps -f {{.Dir}}
stdout 'src[\\/]mod[\\/]rsc.io[\\/]quote[\\/]v2@v2.0.1$'
# ... and even if there is a v2 module in a subdirectory.
mkdir v2
cp x.go v2/x.go
cp tmp/v2.mod v2/go.mod
go list -deps -f {{.Dir}}
stdout 'src[\\/]mod[\\/]rsc.io[\\/]quote[\\/]v2@v2.0.1$'
-- go.mod --
module rsc.io/quote
-- x.go --
package quote
-- tmp/use_v2.go --
package quote
import _ "rsc.io/quote/v2"
-- tmp/use_v2.mod --
module rsc.io/quote
require rsc.io/quote/v2 v2.0.1
-- tmp/v2.mod --
package rsc.io/quote/v2
env GO111MODULE=on
go list -m -versions rsc.io/quote
stdout '^rsc.io/quote v1.0.0 v1.1.0 v1.2.0 v1.2.1 v1.3.0 v1.4.0 v1.5.0 v1.5.1 v1.5.2 v1.5.3-pre1$'
# latest rsc.io/quote should be v1.5.2 not v1.5.3-pre1
go list -m rsc.io/quote@latest
stdout 'rsc.io/quote v1.5.2$'
go list -m rsc.io/quote@>v1.5.2
stdout 'rsc.io/quote v1.5.3-pre1$'
go list -m rsc.io/quote@<v1.5.4
stdout 'rsc.io/quote v1.5.2$'
! go list -m rsc.io/quote@>v1.5.3
stderr 'go list -m rsc.io/quote: no matching versions for query ">v1.5.3"'
go list -m -e -f '{{.Error.Err}}' rsc.io/quote@>v1.5.3
stdout 'no matching versions for query ">v1.5.3"'
-- go.mod --
module x
require rsc.io/quote v1.0.0
env GO111MODULE=on
go list -m all
stdout '^rsc.io/quote v1.4.0'
stdout '^rsc.io/sampler v1.0.0'
# get -u=patch rsc.io/quote should take latest quote & patch update its deps
go get -m -u=patch rsc.io/quote
go list -m all
stdout '^rsc.io/quote v1.5.2'
stdout '^rsc.io/sampler v1.3.1'
stdout '^golang.org/x/text v0.0.0-'
# get -u=patch quote@v1.2.0 should take that version of quote & patch update its deps
go get -m -u=patch rsc.io/quote@v1.2.0
go list -m all
stdout '^rsc.io/quote v1.2.0'
stdout '^rsc.io/sampler v1.3.1'
stdout '^golang.org/x/text v0.0.0-'
# get -u=patch with no args applies to all deps
go get -m -u=patch
go list -m all
stdout '^rsc.io/quote v1.2.1'
-- go.mod --
module x
require rsc.io/quote v1.4.0
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment