# build with no newer version to satisfy exclude
env GO111MODULE=on
cp go.mod go.mod.orig

# With the selected version excluded, commands that query that version without
# updating go.mod should fail.

! go list -mod=readonly -m all
stderr '^go: ignoring requirement on excluded version rsc.io/sampler v1\.99\.99$'
stderr '^go: updates to go.mod needed, disabled by -mod=readonly; to update it:\n\tgo mod tidy$'
! stdout '^rsc.io/sampler v1.99.99'
cmp go.mod go.mod.orig

! go list -mod=vendor -m rsc.io/sampler
stderr '^go: ignoring requirement on excluded version rsc.io/sampler v1\.99\.99$'
stderr '^go: updates to go.mod needed, disabled by -mod=vendor; to update it:\n\tgo mod tidy$'
! stdout '^rsc.io/sampler v1.99.99'
cmp go.mod go.mod.orig

# The failure message should be clear when -mod=vendor is implicit.

go mod edit -go=1.14
! go list -m rsc.io/sampler
stderr '^go: ignoring requirement on excluded version rsc.io/sampler v1\.99\.99$'
stderr '^go: updates to go.mod needed, disabled by -mod=vendor\n\t\(Go version in go.mod is at least 1.14 and vendor directory exists\.\)\n\tto update it:\n\tgo mod tidy$'
! stdout '^rsc.io/sampler v1.99.99'
go mod edit -go=1.13
cmp go.mod go.mod.orig


# With the selected version excluded, commands that load only modules should
# drop the excluded module.

go list -m -mod=mod all
stderr '^go: dropping requirement on excluded version rsc.io/sampler v1\.99\.99$'
stdout '^x$'
! stdout '^rsc.io/sampler'
cmp go.mod go.moddrop

# With the latest version excluded, 'go list' should resolve needed packages
# from the next-highest version.

cp go.mod.orig go.mod
go list -mod=mod -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all
stderr '^go: dropping requirement on excluded version rsc.io/sampler v1\.99\.99$'
stdout '^x $'
! stdout '^rsc.io/sampler v1.99.99'
stdout '^rsc.io/sampler v1.3.0'

# build with newer version available
cp go.mod2 go.mod
go list -mod=mod -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all
stderr '^go: dropping requirement on excluded version rsc.io/quote v1\.5\.1$'
stdout 'rsc.io/quote v1.5.2'

# build with excluded newer version
cp go.mod3 go.mod
go list -mod=mod -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all
! stderr '^go: dropping requirement'
stdout 'rsc.io/quote v1.5.1'

-- x.go --
package x
import _ "rsc.io/quote"

-- go.mod --
module x

go 1.13

exclude rsc.io/sampler v1.99.99

require rsc.io/sampler v1.99.99
-- vendor/modules.txt --
# rsc.io/sampler v1.99.99
## explicit
-- go.moddrop --
module x

go 1.13

exclude rsc.io/sampler v1.99.99
-- go.mod2 --
module x

go 1.13

exclude rsc.io/quote v1.5.1
require rsc.io/quote v1.5.1
-- go.mod3 --
module x

go 1.13

exclude rsc.io/quote v1.5.2
require rsc.io/quote v1.5.1
