| # This test examines the behavior of 'go get …@patch' |
| # See also mod_upgrade_patch.txt (focused on "-u=patch" specifically) |
| # and mod_get_patchmod.txt (focused on module/package ambiguities). |
| |
| cp go.mod go.mod.orig |
| |
| # example.net/b@patch refers to the patch for the version of b that was selected |
| # at the start of 'go get', not the version after applying other changes. |
| |
| ! go get example.net/a@v0.2.0 example.net/b@patch |
| stderr '^go: example.net/a@v0.2.0 requires example.net/b@v0.2.0, not example.net/b@patch \(v0.1.1\)$' |
| cmp go.mod go.mod.orig |
| |
| |
| # -u=patch changes the default version for other arguments to '@patch', |
| # but they continue to be resolved against the originally-selected version, |
| # not the updated one. |
| # |
| # TODO(#42360): Reconsider the change in defaults. |
| |
| ! go get -u=patch example.net/a@v0.2.0 example.net/b |
| stderr '^go: example.net/a@v0.2.0 requires example.net/b@v0.2.0, not example.net/b@patch \(v0.1.1\)$' |
| cmp go.mod go.mod.orig |
| |
| |
| # -u=patch refers to the patches for the selected versions of dependencies *after* |
| # applying other version changes, not the versions that were selected at the start. |
| # However, it should not patch versions determined by explicit arguments. |
| |
| 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.2.1 ' |
| |
| |
| # "-u=patch all" should be equivalent to "all@patch", and should fail if the |
| # patched versions result in a higher-than-patch upgrade. |
| |
| cp go.mod.orig go.mod |
| ! go get -u=patch all |
| stderr '^go: example.net/a@v0.1.1 \(matching all@patch\) requires example.net/b@v0.2.0, not example.net/b@v0.1.1 \(matching all@patch\)$' |
| cmp go.mod go.mod.orig |
| |
| |
| # On the other hand, "-u=patch ./..." should patch-upgrade dependencies until |
| # they reach a fixed point, even if that results in higher-than-patch upgrades. |
| |
| go get -u=patch ./... |
| go list -m all |
| stdout '^example.net/a v0.1.1 ' |
| stdout '^example.net/b v0.2.1 ' |
| |
| |
| -- 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 => ./a10 |
| example.net/a v0.1.1 => ./a11 |
| example.net/a v0.2.0 => ./a20 |
| example.net/a v0.2.1 => ./a21 |
| example.net/b v0.1.0 => ./b |
| example.net/b v0.1.1 => ./b |
| example.net/b v0.2.0 => ./b |
| example.net/b v0.2.1 => ./b |
| example.net/b v0.3.0 => ./b |
| example.net/b v0.3.1 => ./b |
| ) |
| -- example.go -- |
| package example |
| |
| import _ "example.net/a" |
| |
| -- a10/go.mod -- |
| module example.net/a |
| |
| go 1.16 |
| |
| require example.net/b v0.1.0 |
| -- a10/a.go -- |
| package a |
| |
| import _ "example.net/b" |
| |
| -- a11/go.mod -- |
| module example.net/a |
| |
| go 1.16 |
| |
| require example.net/b v0.2.0 // upgraded |
| -- a11/a.go -- |
| package a |
| |
| import _ "example.net/b" |
| |
| -- a20/go.mod -- |
| module example.net/a |
| |
| go 1.16 |
| |
| require example.net/b v0.2.0 |
| -- a20/a.go -- |
| package a |
| |
| import _ "example.net/b" |
| |
| -- a21/go.mod -- |
| module example.net/a |
| |
| go 1.16 |
| |
| require example.net/b v0.2.0 // not upgraded |
| -- a21/a.go -- |
| package a |
| |
| import _ "example.net/b" |
| |
| -- b/go.mod -- |
| module example.net/b |
| |
| go 1.16 |
| -- b/b.go -- |
| package b |