blob: 15c712a4392825648faf13d6225c94a64ec2bec0 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package gover
import "golang.org/x/mod/modfile"
const (
// narrowAllVersion is the Go version at which the
// module-module "all" pattern no longer closes over the dependencies of
// tests outside of the main module.
NarrowAllVersion = "1.16"
// DefaultGoModVersion is the Go version to assume for go.mod files
// that do not declare a Go version. The go command has been
// writing go versions to modules since Go 1.12, so a go.mod
// without a version is either very old or recently hand-written.
// Since we can't tell which, we have to assume it's very old.
// The semantics of the go.mod changed at Go 1.17 to support
// graph pruning. If see a go.mod without a go line, we have to
// assume Go 1.16 so that we interpret the requirements correctly.
// Note that this default must stay at Go 1.16; it cannot be moved forward.
DefaultGoModVersion = "1.16"
// DefaultGoWorkVersion is the Go version to assume for go.work files
// that do not declare a Go version. Workspaces were added in Go 1.18,
// so use that.
DefaultGoWorkVersion = "1.18"
// ExplicitIndirectVersion is the Go version at which a
// module's go.mod file is expected to list explicit requirements on every
// module that provides any package transitively imported by that module.
//
// Other indirect dependencies of such a module can be safely pruned out of
// the module graph; see https://golang.org/ref/mod#graph-pruning.
ExplicitIndirectVersion = "1.17"
// separateIndirectVersion is the Go version at which
// "// indirect" dependencies are added in a block separate from the direct
// ones. See https://golang.org/issue/45965.
SeparateIndirectVersion = "1.17"
// tidyGoModSumVersion is the Go version at which
// 'go mod tidy' preserves go.mod checksums needed to build test dependencies
// of packages in "all", so that 'go test all' can be run without checksum
// errors.
// See https://go.dev/issue/56222.
TidyGoModSumVersion = "1.21"
// goStrictVersion is the Go version at which the Go versions
// became "strict" in the sense that, restricted to modules at this version
// or later, every module must have a go version line ≥ all its dependencies.
// It is also the version after which "too new" a version is considered a fatal error.
GoStrictVersion = "1.21"
// ExplicitModulesTxtImportVersion is the Go version at which vendored packages need to be present
// in modules.txt to be imported.
ExplicitModulesTxtImportVersion = "1.23"
)
// FromGoMod returns the go version from the go.mod file.
// It returns DefaultGoModVersion if the go.mod file does not contain a go line or if mf is nil.
func FromGoMod(mf *modfile.File) string {
if mf == nil || mf.Go == nil {
return DefaultGoModVersion
}
return mf.Go.Version
}
// FromGoWork returns the go version from the go.mod file.
// It returns DefaultGoWorkVersion if the go.mod file does not contain a go line or if wf is nil.
func FromGoWork(wf *modfile.WorkFile) string {
if wf == nil || wf.Go == nil {
return DefaultGoWorkVersion
}
return wf.Go.Version
}