1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package gover
6
7import "golang.org/x/mod/modfile"
8
9const (
10	// narrowAllVersion is the Go version at which the
11	// module-module "all" pattern no longer closes over the dependencies of
12	// tests outside of the main module.
13	NarrowAllVersion = "1.16"
14
15	// DefaultGoModVersion is the Go version to assume for go.mod files
16	// that do not declare a Go version. The go command has been
17	// writing go versions to modules since Go 1.12, so a go.mod
18	// without a version is either very old or recently hand-written.
19	// Since we can't tell which, we have to assume it's very old.
20	// The semantics of the go.mod changed at Go 1.17 to support
21	// graph pruning. If see a go.mod without a go line, we have to
22	// assume Go 1.16 so that we interpret the requirements correctly.
23	// Note that this default must stay at Go 1.16; it cannot be moved forward.
24	DefaultGoModVersion = "1.16"
25
26	// DefaultGoWorkVersion is the Go version to assume for go.work files
27	// that do not declare a Go version. Workspaces were added in Go 1.18,
28	// so use that.
29	DefaultGoWorkVersion = "1.18"
30
31	// ExplicitIndirectVersion is the Go version at which a
32	// module's go.mod file is expected to list explicit requirements on every
33	// module that provides any package transitively imported by that module.
34	//
35	// Other indirect dependencies of such a module can be safely pruned out of
36	// the module graph; see https://golang.org/ref/mod#graph-pruning.
37	ExplicitIndirectVersion = "1.17"
38
39	// separateIndirectVersion is the Go version at which
40	// "// indirect" dependencies are added in a block separate from the direct
41	// ones. See https://golang.org/issue/45965.
42	SeparateIndirectVersion = "1.17"
43
44	// tidyGoModSumVersion is the Go version at which
45	// 'go mod tidy' preserves go.mod checksums needed to build test dependencies
46	// of packages in "all", so that 'go test all' can be run without checksum
47	// errors.
48	// See https://go.dev/issue/56222.
49	TidyGoModSumVersion = "1.21"
50
51	// goStrictVersion is the Go version at which the Go versions
52	// became "strict" in the sense that, restricted to modules at this version
53	// or later, every module must have a go version line ≥ all its dependencies.
54	// It is also the version after which "too new" a version is considered a fatal error.
55	GoStrictVersion = "1.21"
56
57	// ExplicitModulesTxtImportVersion is the Go version at which vendored packages need to be present
58	// in modules.txt to be imported.
59	ExplicitModulesTxtImportVersion = "1.23"
60)
61
62// FromGoMod returns the go version from the go.mod file.
63// It returns DefaultGoModVersion if the go.mod file does not contain a go line or if mf is nil.
64func FromGoMod(mf *modfile.File) string {
65	if mf == nil || mf.Go == nil {
66		return DefaultGoModVersion
67	}
68	return mf.Go.Version
69}
70
71// FromGoWork returns the go version from the go.mod file.
72// It returns DefaultGoWorkVersion if the go.mod file does not contain a go line or if wf is nil.
73func FromGoWork(wf *modfile.WorkFile) string {
74	if wf == nil || wf.Go == nil {
75		return DefaultGoWorkVersion
76	}
77	return wf.Go.Version
78}
79