# -u=patch will patch dependencies as far as possible, but not so far that they
# conflict with other command-line arguments.

go list -m all
stdout '^example.net/a v0.1.0 '
stdout '^example.net/b v0.1.0 '

go get -u=patch example.net/a@v0.2.0
go list -m all
stdout '^example.net/a v0.2.0 '
stdout '^example.net/b v0.1.1 '  # not v0.1.2, which requires …/a v0.3.0.

-- go.mod --
module example

go 1.16

require (
	example.net/a v0.1.0
	example.net/b v0.1.0 // indirect
)

replace (
	example.net/a v0.1.0 => ./a
	example.net/a v0.2.0 => ./a
	example.net/a v0.3.0 => ./a
	example.net/b v0.1.0 => ./b10
	example.net/b v0.1.1 => ./b11
	example.net/b v0.1.2 => ./b12
)
-- example.go --
package example

import _ "example.net/a"

-- a/go.mod --
module example.net/a

go 1.16

require example.net/b v0.1.0
-- a/a.go --
package a

import _ "example.net/b"

-- b10/go.mod --
module example.net/b

go 1.16

require example.net/a v0.1.0
-- b10/b.go --
package b
-- b10/b_test.go --
package b_test

import _ "example.net/a"

-- b11/go.mod --
module example.net/b

go 1.16

require example.net/a v0.2.0
-- b11/b.go --
package b
-- b11/b_test.go --
package b_test

import _ "example.net/a"

-- b12/go.mod --
module example.net/b

go 1.16

require example.net/a v0.3.0
-- b12/b.go --
package b
-- b12/b_test.go --
package b_test

import _ "example.net/a"