# Enter the first set of test cases. In this test case, package # example.com/m has an import of example.com/n, which is also # in the workspace, but is not required by example.com/m, and does not exist # upstream. It also has an import of rsc.io/quote, which # is also not required by example.com/m but does exist upstream. get should resolve # rsc.io/quote and not try to resolve example.com/n. cd m cp go.mod go.mod.orig # Test go get with an incomplete module using a local query. cp go.mod.orig go.mod go get cmp go.mod go.mod.want cmp go.sum go.sum.want # Test go get with an incomplete module using a wildcard query. cp go.mod.orig go.mod rm go.sum go get ./... cmp go.mod go.mod.want cmp go.sum go.sum.want # Test go get with an incomplete module using a path query that can be resolved. cp go.mod.orig go.mod rm go.sum go get rsc.io/quote cmp go.mod go.mod.want.path_query # query wasn't resolved through import, so don't know if it's direct cmp go.sum go.sum.want # Test go get with a path query that is to a workspace module but that can't be resolved. # Normally, when we encounter an unresolved import of a workspace module, it's # ignored, but a path query of the module was asked for explicitly and isn't ignored. cp go.mod.orig go.mod rm go.sum ! go get example.com/n # The following error is returned because module example.com does exist in the proxy we use # to run these tests, and because its is a prefix of example.com/n, it is a candidate to # satisfy the import. stderr 'module example.com@upgrade found \(v1\.0\.0\), but does not contain package example.com/n' # Test go get with an incomplete module using an "all" query. cp go.mod.orig go.mod rm go.sum go get all cmp go.mod go.mod.want.all # all loads a different graph so the requirements get bumped up cmp go.sum go.sum.want.all # Test go get with an incomplete module using a tool query # The hastool directory has its own go.work file than includes example.com/n and hastool. cd ../hastool go get tool cmp go.mod go.mod.want # Test that missing imports from loading the workspace are reported. # In this example, there is a workspace with the # example.com/missingworkspaceimport and example.com/withmissing modules. # missingworkspaceimport imports withmissing, and withmissing in turn # imports rsc.io/quote, but doesn't have a requirement on it. # The get operation won't resolve rsc.io/quote because it doesn't # appear in the missingworkspaceimport's module graph, and the # workspace will fail to load in checkPackageProblems because of the missing import. cd ../missingworkspaceimport ! go get ./... stderr 'cannot find module providing package rsc.io/quote' # Test that missing imports are not reported if they're not in the package # graph. This test case is the same as the above except that there's no # import from the missingworkspaceimport package to the one that # imports the unresolved rsc.io/quote dependency. The example.com/missingworkspaceimport # package imports example.com/withmissing/other so it still depends on the example.com/missing # module, but not on the withmissing package itself. The example.com/withmissing # module still has an import on the rsc.io/quote package, but the package # with the import doesn't appear in the loaded package graph. cd ../missingworkspaceimport_disconnected go get ./... # Test that deprecations are reported using the workspace. # First, the control case: without the workspace, the deprecated module # is an indirect dependency of example.com/withdeprecation/indirect, # so we shouldn't get a deprecation warning. cd ../withdeprecation/indirect cp go.mod go.mod.orig env GOWORK=off go get ./... ! stderr 'is deprecated' cmp go.mod go.mod.want # Now, in the workspace, we should get a deprecation warning, because # the deprecated module is a direct dependency of example.com/withdeprecation/direct, which # is a workspace module. cp go.mod.orig go.mod env GOWORK= go get ./... stderr 'go: module example.com/deprecated/b is deprecated: in example.com/deprecated/b@v1.9.0' cmp go.mod go.mod.want # Test that retractions are reported using the workspace. # First, the control case. Even though a workspace module depends on # a retracted version, because we didn't ask for it on the command line, # we didn't resolve that retracted module to satisfy an import, # or need it to build a requested package, we don't produce the warning. cd ../../withretraction/doesnotrequireretracted cp go.mod go.mod.orig go get rsc.io/quote ! stderr 'retracted' # If we do request a non-retracted version of the module but the workspace # is off, we also won't see the retraction warning because the retracted # module isn't selected in the graph. cp go.mod.orig go.mod env GOWORK=off go get example.com/retract@v1.0.0-good ! stderr 'retracted' # Now, with the workspace on, because example.com/retract@v1.0.0-unused # is a higher version, it will be selected and the retraction will # be reported. cp go.mod.orig go.mod env GOWORK= go get example.com/retract@v1.0.0-good stderr 'retracted' # Finally, with the workspace on, if the other workspace depends on # example.com/retract@v1.0.0-bad rather than 'v1.0.0-unused', because # 'v1.0.0-bad' is considered a lower version than 'v1.0.0-good', 'v1.0.0-good' # will be selected and the deprecation will not be reported. cp go.mod.orig go.mod cd ../requiresretracted go get example.com/retract@v1.0.0-bad # set the verison to 'v1.0.0-bad' stderr 'retracted' cd ../doesnotrequireretracted go get example.com/retract@v1.0.0-good ! stderr 'retracted' -- go.work -- go 1.25 use ( m n ) -- q/go.mod -- module example.com/q go 1.25 -- q/q.go -- package q import "rsc.io/quote" func Q() { quote.Hello() } -- m/go.mod -- module example.com/m go 1.25 -- m/go.mod.want -- module example.com/m go 1.25 require rsc.io/quote v1.5.2 require ( golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect rsc.io/sampler v1.3.0 // indirect ) -- m/go.mod.want.path_query -- module example.com/m go 1.25 require ( golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect rsc.io/quote v1.5.2 // indirect rsc.io/sampler v1.3.0 // indirect ) -- m/go.sum.want -- golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:pvCbr/wm8HzDD3fVywevekufpn6tCGPY3spdHeZJEsw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= rsc.io/quote v1.5.2 h1:3fEykkD9k7lYzXqCYrwGAf7iNhbk4yCjHmKBN9td4L0= rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= rsc.io/sampler v1.3.0 h1:HLGR/BgEtI3r0uymSP/nl2uPLsUnNJX8toRyhfpBTII= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -- m/go.mod.want.all -- module example.com/m go 1.25 require rsc.io/quote v1.5.2 require ( golang.org/x/text v0.3.0 // indirect rsc.io/sampler v1.99.99 // indirect ) -- m/go.sum.want.all -- golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:ivTorhoiROmZ1mcs15mO2czVF0uy0tnezXpBVNzgrmA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= rsc.io/quote v1.5.2 h1:3fEykkD9k7lYzXqCYrwGAf7iNhbk4yCjHmKBN9td4L0= rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/sampler v1.99.99 h1:iMG9lbEG/8MdeR4lgL+Q8IcwbLNw7ijW7fTiK8Miqts= rsc.io/sampler v1.99.99/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -- m/m.go -- package m import ( "example.com/n" "rsc.io/quote" ) func M() { n.Hello() quote.Hello() } -- n/go.mod -- module example.com/n go 1.25 -- n/n.go -- package n func Hello() { } -- hastool/go.work -- go 1.25 use ( . ../n ) -- hastool/go.mod -- module example.com/hastool go 1.25 tool rsc.io/fortune -- hastool/go.mod.want -- module example.com/hastool go 1.25 tool rsc.io/fortune require ( golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect rsc.io/fortune v1.0.0 // indirect rsc.io/quote v1.5.2 // indirect rsc.io/sampler v1.3.0 // indirect ) -- hastool/p.go -- package hastool import "example.com/n" func T() { n.Hello() } -- missingworkspaceimport/go.work -- go 1.25 use ( . withmissing ) -- missingworkspaceimport/go.mod -- module example.com/missingworkspaceimport go 1.25 -- missingworkspaceimport/m.go -- package m import _ "example.com/withmissing" -- missingworkspaceimport/withmissing/go.mod -- module example.com/withmissing go 1.25 -- missingworkspaceimport/withmissing/w.go -- package w import _ "rsc.io/quote" -- missingworkspaceimport_disconnected/go.work -- go 1.25 use ( . withmissing ) -- missingworkspaceimport_disconnected/go.mod -- module example.com/missingworkspaceimport go 1.25 -- missingworkspaceimport_disconnected/m.go -- package m import _ "example.com/withmissing/other" -- missingworkspaceimport_disconnected/withmissing/go.mod -- module example.com/withmissing go 1.25 -- missingworkspaceimport_disconnected/withmissing/w.go -- package w import _ "rsc.io/quote" -- missingworkspaceimport_disconnected/withmissing/other/other.go -- package other -- withdeprecation/go.work -- go 1.25 use ( indirect direct ) replace example.com/requiresdeprecatednotworkspace => ./requiresdeprecatednotworkspace -- withdeprecation/indirect/go.mod -- module example.com/withdeprecation/indirect go 1.25 replace example.com/requiresdeprecatednotworkspace => ../requiresdeprecatednotworkspace -- withdeprecation/indirect/go.mod.want -- module example.com/withdeprecation/indirect go 1.25 replace example.com/requiresdeprecatednotworkspace => ../requiresdeprecatednotworkspace require example.com/requiresdeprecatednotworkspace v0.0.0-00010101000000-000000000000 require example.com/deprecated/b v1.9.0 // indirect -- withdeprecation/indirect/go.mod.want.direct -- module example.com/withdeprecation/indirect go 1.25 replace example.com/requiresdeprecatednotworkspace => ../requiresdeprecatednotworkspace require example.com/requiresdeprecatednotworkspace v0.0.0-00010101000000-000000000000 require example.com/deprecated/b v1.9.0 -- withdeprecation/indirect/a.go -- package indirect import "example.com/requiresdeprecatednotworkspace" -- withdeprecation/direct/go.mod -- module example.com/withdeprecation/direct go 1.25 require "example.com/deprecated/b" v1.9.0 -- withdeprecation/direct/import.go -- package direct import "example.com/deprecated/b" -- withdeprecation/requiresdeprecatednotworkspace/go.mod -- module example.com/requiresdeprecatednotworkspace go 1.25 -- withdeprecation/requiresdeprecatednotworkspace/a.go -- package a import "example.com/deprecated/b" -- withretraction/go.work -- go 1.25 use ( doesnotrequireretracted requiresretracted ) -- withretraction/doesnotrequireretracted/go.mod -- module example.com/withretraction/doesnotrequireretracted go 1.25 -- withretraction/requiresretracted/go.mod -- module example.com/withretraction/requiresretracted go 1.25 require example.com/retract v1.0.0-unused