env GO111MODULE=on
[short] skip

cd m

# 'go list all' should list all of the packages used (directly or indirectly) by
# the packages in the main module, but no other packages from the standard
# library or active modules.
#
# 'go list ...' should list packages in all active modules and the standard library.
#
# 'go list example.com/m/...' should list packages in all modules that begin with 'example.com/m/'.
#
# 'go list ./...' should list only packages in the current module, not other active modules.
#
# Warnings about unmatched patterns should only be printed once.
#
# And the go command should be able to keep track of all this!
go list -f '{{.ImportPath}}: {{.Match}}' all ... example.com/m/... ./... ./xyz...
stdout 'example.com/m/useunicode: \[all \.\.\. example.com/m/... ./...\]'
stdout 'example.com/m/useunsafe: \[all \.\.\. example.com/m/... ./...\]'
[cgo] stdout 'example.com/m/useC: \[all \.\.\. example.com/m/... ./...\]'
[!cgo] ! stdout example.com/m/useC
stdout 'example.com/unused/useerrors: \[\.\.\.\]' # but not "all"
stdout 'example.com/m/nested/useencoding: \[\.\.\. example.com/m/...\]' # but NOT "all" or "./..."
stdout '^unicode: \[all \.\.\.\]'
stdout '^unsafe: \[all \.\.\.\]'
stdout 'index/suffixarray: \[\.\.\.\]'
stdout 'cmd/pprof: \[\.\.\.\]'

stderr -count=1 '^go: warning: "./xyz..." matched no packages$'

# 'go list ./...' should not try to resolve the main module.
cd ../empty
go list -deps ./...
! stdout .
! stderr 'finding'
stderr -count=1 '^go: warning: "./..." matched no packages'

# disabling cgo should drop useC
[short] skip
env CGO_ENABLED=0
go list -f '{{.ImportPath}}: {{.Match}}' all ... example.com/m/... ./... ./xyz...
! stdout example.com/m/useC

-- m/go.mod --
module example.com/m

require example.com/unused v0.0.0 // indirect
replace example.com/unused => ../unused

require example.com/m/nested v0.0.0 // indirect
replace example.com/m/nested => ../nested

-- m/useC/useC.go --
package useC
import _ "C" // "C" is a pseudo-package, not an actual one
-- m/useunicode/useunicode.go --
package useunicode
import _ "unicode"
-- m/useunsafe/useunsafe.go --
package useunsafe
import _ "unsafe"

-- unused/go.mod --
module example.com/unused
-- unused/useerrors/useerrors.go --
package useerrors
import _ "errors"

-- nested/go.mod --
module example.com/m/nested
-- nested/useencoding/useencoding.go --
package useencoding
import _ "encoding"

-- empty/go.mod --
module example.com/empty
