From e28ac674af90b079a7018ce8275885b3b5366d2a Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Fri, 27 Feb 2026 10:03:36 -0800 Subject: [PATCH] [release-branch.go1.26] cmd/go: revert update default go directive in mod or work init This restores the previous behavior of setting go directive to the toolchain's version as per #77653. For #77653 Fixes #77860 Change-Id: Ie9d2de025a75f39fd8d6d01776d0cf4e5da954f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/749948 LUCI-TryBot-Result: Go LUCI Reviewed-by: Dmitri Shuralyov Reviewed-by: Austin Clements --- src/cmd/go/internal/modload/init.go | 35 ++------- src/cmd/go/internal/workcmd/init.go | 4 +- src/cmd/go/testdata/script/mod_edit.txt | 71 +++++++++---------- .../go/testdata/script/mod_init_version.txt | 47 ------------ src/cmd/go/testdata/script/work.txt | 3 +- src/cmd/go/testdata/script/work_edit.txt | 5 +- src/cmd/go/testdata/script/work_init_path.txt | 10 +-- .../testdata/script/work_init_toolchain.txt | 8 +-- .../go/testdata/script/work_init_version.txt | 35 --------- .../testdata/script/work_sync_toolchain.txt | 7 +- .../go/testdata/script/work_use_toolchain.txt | 6 +- 11 files changed, 60 insertions(+), 171 deletions(-) delete mode 100644 src/cmd/go/testdata/script/mod_init_version.txt delete mode 100644 src/cmd/go/testdata/script/work_init_version.txt diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 8bfae26692..e3babc29c6 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -29,7 +29,6 @@ import ( "cmd/go/internal/lockedfile" "cmd/go/internal/modfetch" "cmd/go/internal/search" - igover "internal/gover" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -838,7 +837,7 @@ func WriteWorkFile(path string, wf *modfile.WorkFile) error { wf.Cleanup() out := modfile.Format(wf.Syntax) - return os.WriteFile(path, out, 0o666) + return os.WriteFile(path, out, 0666) } // UpdateWorkGoVersion updates the go line in wf to be at least goVers, @@ -1212,7 +1211,7 @@ func CreateModFile(loaderstate *State, ctx context.Context, modPath string) { modFile := new(modfile.File) modFile.AddModuleStmt(modPath) loaderstate.MainModules = makeMainModules(loaderstate, []module.Version{modFile.Module.Mod}, []string{modRoot}, []*modfile.File{modFile}, []*modFileIndex{nil}, nil) - addGoStmt(modFile, modFile.Module.Mod, DefaultModInitGoVersion()) // Add the go directive before converted module requirements. + addGoStmt(modFile, modFile.Module.Mod, gover.Local()) // Add the go directive before converted module requirements. rs := requirementsFromModFiles(loaderstate, ctx, nil, []*modfile.File{modFile}, nil) rs, err := updateRoots(loaderstate, ctx, rs.direct, rs, nil, nil, false) @@ -1823,7 +1822,9 @@ Run 'go help mod init' for more information. return "", fmt.Errorf(msg, dir, reason) } -var importCommentRE = lazyregexp.New(`(?m)^package[ \t]+[^ \t\r\n/]+[ \t]+//[ \t]+import[ \t]+(\"[^"]+\")[ \t]*\r?\n`) +var ( + importCommentRE = lazyregexp.New(`(?m)^package[ \t]+[^ \t\r\n/]+[ \t]+//[ \t]+import[ \t]+(\"[^"]+\")[ \t]*\r?\n`) +) func findImportComment(file string) string { data, err := os.ReadFile(file) @@ -2262,29 +2263,3 @@ func CheckGodebug(verb, k, v string) error { } return fmt.Errorf("unknown %s %q", verb, k) } - -// DefaultModInitGoVersion returns the appropriate go version to include in a -// newly initialized module or work file. -// -// If the current toolchain version is a stable version of Go 1.N.M, default to -// go 1.(N-1).0 -// -// If the current toolchain version is a pre-release version of Go 1.N (Release -// Candidate M) or a development version of Go 1.N, default to go 1.(N-2).0 -func DefaultModInitGoVersion() string { - v := gover.Local() - if isPrereleaseOrDevelVersion(v) { - v = gover.Prev(gover.Prev(v)) - } else { - v = gover.Prev(v) - } - if strings.Count(v, ".") < 2 { - v += ".0" - } - return v -} - -func isPrereleaseOrDevelVersion(s string) bool { - v := igover.Parse(s) - return v.Kind != "" || v.Patch == "" -} diff --git a/src/cmd/go/internal/workcmd/init.go b/src/cmd/go/internal/workcmd/init.go index eff7a8c763..896740f080 100644 --- a/src/cmd/go/internal/workcmd/init.go +++ b/src/cmd/go/internal/workcmd/init.go @@ -12,6 +12,7 @@ import ( "cmd/go/internal/base" "cmd/go/internal/fsys" + "cmd/go/internal/gover" "cmd/go/internal/modload" "golang.org/x/mod/modfile" @@ -57,9 +58,10 @@ func runInit(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go: %s already exists", gowork) } + goV := gover.Local() // Use current Go version by default wf := new(modfile.WorkFile) wf.Syntax = new(modfile.FileSyntax) - wf.AddGoStmt(modload.DefaultModInitGoVersion()) + wf.AddGoStmt(goV) workUse(ctx, moduleLoaderState, gowork, wf, args) modload.WriteWorkFile(gowork, wf) } diff --git a/src/cmd/go/testdata/script/mod_edit.txt b/src/cmd/go/testdata/script/mod_edit.txt index 16d46610a2..6b7dd2c2c5 100644 --- a/src/cmd/go/testdata/script/mod_edit.txt +++ b/src/cmd/go/testdata/script/mod_edit.txt @@ -1,8 +1,5 @@ env GO111MODULE=on -# Set go version so that we can test produced mod files for equality. -env TESTGO_VERSION=go1.26.0 - # Test that go mod edits and related mod flags work. # Also test that they can use a dummy name that isn't resolvable. golang.org/issue/24100 @@ -13,16 +10,16 @@ stderr 'cannot determine module path' go mod init x.x/y/z stderr 'creating new go.mod: module x.x/y/z' -cmp go.mod $WORK/go.mod.init +cmpenv go.mod $WORK/go.mod.init ! go mod init -cmp go.mod $WORK/go.mod.init +cmpenv go.mod $WORK/go.mod.init # go mod edits go mod edit -droprequire=x.1 -require=x.1@v1.0.0 -require=x.2@v1.1.0 -droprequire=x.2 -exclude='x.1 @ v1.2.0' -exclude=x.1@v1.2.1 -exclude=x.1@v2.0.0+incompatible -replace=x.1@v1.3.0=y.1@v1.4.0 -replace='x.1@v1.4.0 = ../z' -retract=v1.6.0 -retract=[v1.1.0,v1.2.0] -retract=[v1.3.0,v1.4.0] -retract=v1.0.0 -cmp go.mod $WORK/go.mod.edit1 +cmpenv go.mod $WORK/go.mod.edit1 go mod edit -droprequire=x.1 -dropexclude=x.1@v1.2.1 -dropexclude=x.1@v2.0.0+incompatible -dropreplace=x.1@v1.3.0 -require=x.3@v1.99.0 -dropretract=v1.0.0 -dropretract=[v1.1.0,v1.2.0] -cmp go.mod $WORK/go.mod.edit2 +cmpenv go.mod $WORK/go.mod.edit2 # -exclude and -retract reject invalid versions. ! go mod edit -exclude=example.com/m@bad @@ -39,11 +36,11 @@ stderr '^go: -exclude=example.com/m/v2@v1\.0\.0: version "v1\.0\.0" invalid: sho ! go mod edit -exclude=gopkg.in/example.v1@v2.0.0 stderr '^go: -exclude=gopkg\.in/example\.v1@v2\.0\.0: version "v2\.0\.0" invalid: should be v1, not v2$' -cmp go.mod $WORK/go.mod.edit2 +cmpenv go.mod $WORK/go.mod.edit2 # go mod edit -json go mod edit -json -cmp stdout $WORK/go.mod.json +cmpenv stdout $WORK/go.mod.json # go mod edit -json (retractions with rationales) go mod edit -json $WORK/go.mod.retractrationale @@ -59,66 +56,66 @@ cmp stdout $WORK/go.mod.empty.json # go mod edit -replace go mod edit -replace=x.1@v1.3.0=y.1/v2@v2.3.5 -replace=x.1@v1.4.0=y.1/v2@v2.3.5 -cmp go.mod $WORK/go.mod.edit3 +cmpenv go.mod $WORK/go.mod.edit3 go mod edit -replace=x.1=y.1/v2@v2.3.6 -cmp go.mod $WORK/go.mod.edit4 +cmpenv go.mod $WORK/go.mod.edit4 go mod edit -dropreplace=x.1 -cmp go.mod $WORK/go.mod.edit5 +cmpenv go.mod $WORK/go.mod.edit5 go mod edit -replace=x.1=../y.1/@v2 -cmp go.mod $WORK/go.mod.edit6 +cmpenv go.mod $WORK/go.mod.edit6 ! go mod edit -replace=x.1=y.1/@v2 stderr '^go: -replace=x.1=y.1/@v2: invalid new path: malformed import path "y.1/": trailing slash$' # go mod edit -fmt cp $WORK/go.mod.badfmt go.mod go mod edit -fmt -print # -print should avoid writing file -cmp stdout $WORK/go.mod.goodfmt +cmpenv stdout $WORK/go.mod.goodfmt cmp go.mod $WORK/go.mod.badfmt go mod edit -fmt # without -print, should write file (and nothing to stdout) ! stdout . -cmp go.mod $WORK/go.mod.goodfmt +cmpenv go.mod $WORK/go.mod.goodfmt # go mod edit -module cd $WORK/m go mod init a.a/b/c go mod edit -module x.x/y/z -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit # golang.org/issue/30513: don't require go-gettable module paths. cd $WORK/local go mod init foo go mod edit -module local-only -require=other-local@v1.0.0 -replace other-local@v1.0.0=./other -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit # go mod edit -godebug cd $WORK/g cp go.mod.start go.mod go mod edit -godebug key=value -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit go mod edit -dropgodebug key2 -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit go mod edit -dropgodebug key -cmp go.mod go.mod.start +cmpenv go.mod go.mod.start # go mod edit -tool cd $WORK/h cp go.mod.start go.mod go mod edit -tool example.com/tool -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit go mod edit -droptool example.com/tool2 -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit go mod edit -droptool example.com/tool -cmp go.mod go.mod.start +cmpenv go.mod go.mod.start # go mod edit -ignore cd $WORK/i cp go.mod.start go.mod go mod edit -ignore example.com/ignore -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit go mod edit -dropignore example.com/ignore2 -cmp go.mod go.mod.edit +cmpenv go.mod go.mod.edit go mod edit -dropignore example.com/ignore -cmp go.mod go.mod.start +cmpenv go.mod go.mod.start -- x.go -- package x @@ -129,11 +126,11 @@ package w -- $WORK/go.mod.init -- module x.x/y/z -go 1.25.0 +go $goversion -- $WORK/go.mod.edit1 -- module x.x/y/z -go 1.25.0 +go $goversion require x.1 v1.0.0 @@ -157,7 +154,7 @@ retract ( -- $WORK/go.mod.edit2 -- module x.x/y/z -go 1.25.0 +go $goversion exclude x.1 v1.2.0 @@ -174,7 +171,7 @@ require x.3 v1.99.0 "Module": { "Path": "x.x/y/z" }, - "Go": "1.25.0", + "Go": "$goversion", "Require": [ { "Path": "x.3", @@ -214,7 +211,7 @@ require x.3 v1.99.0 -- $WORK/go.mod.edit3 -- module x.x/y/z -go 1.25.0 +go $goversion exclude x.1 v1.2.0 @@ -232,7 +229,7 @@ require x.3 v1.99.0 -- $WORK/go.mod.edit4 -- module x.x/y/z -go 1.25.0 +go $goversion exclude x.1 v1.2.0 @@ -247,7 +244,7 @@ require x.3 v1.99.0 -- $WORK/go.mod.edit5 -- module x.x/y/z -go 1.25.0 +go $goversion exclude x.1 v1.2.0 @@ -260,7 +257,7 @@ require x.3 v1.99.0 -- $WORK/go.mod.edit6 -- module x.x/y/z -go 1.25.0 +go $goversion exclude x.1 v1.2.0 @@ -275,7 +272,7 @@ replace x.1 => ../y.1/@v2 -- $WORK/local/go.mod.edit -- module local-only -go 1.25.0 +go $goversion require other-local v1.0.0 @@ -307,7 +304,7 @@ retract [v1.8.1, v1.8.2] -- $WORK/m/go.mod.edit -- module x.x/y/z -go 1.25.0 +go $goversion -- $WORK/go.mod.retractrationale -- module x.x/y/z @@ -408,4 +405,4 @@ module g go 1.24 -ignore example.com/ignore +ignore example.com/ignore \ No newline at end of file diff --git a/src/cmd/go/testdata/script/mod_init_version.txt b/src/cmd/go/testdata/script/mod_init_version.txt deleted file mode 100644 index 5b909bc1d7..0000000000 --- a/src/cmd/go/testdata/script/mod_init_version.txt +++ /dev/null @@ -1,47 +0,0 @@ -env TESTGO_VERSION=go1.28-devel -go mod init example.com -cmp go.mod go.mod.want-1.26.0 -rm go.mod -env TESTGO_VERSION=go1.26.0 -go mod init example.com -cmp go.mod go.mod.want-1.25.0 -rm go.mod -env TESTGO_VERSION=go1.22.2 -go mod init example.com -cmp go.mod go.mod.want-1.21.0 -rm go.mod -env TESTGO_VERSION=go1.25.0-xyzzy -go mod init example.com -cmp go.mod go.mod.want-1.24.0 -rm go.mod -env TESTGO_VERSION=go1.23rc3 -go mod init example.com -cmp go.mod go.mod.want-1.21.0 -rm go.mod -env TESTGO_VERSION=go1.18beta2 -go mod init example.com -cmp go.mod go.mod.want-1.16.0 --- go.mod.want-1.26.0 -- -module example.com - -go 1.26.0 --- go.mod.want-1.25.0 -- -module example.com - -go 1.25.0 --- go.mod.want-1.24.0 -- -module example.com - -go 1.24.0 --- go.mod.want-1.22.0 -- -module example.com - -go 1.22.0 --- go.mod.want-1.21.0 -- -module example.com - -go 1.21.0 --- go.mod.want-1.16.0 -- -module example.com - -go 1.16.0 diff --git a/src/cmd/go/testdata/script/work.txt b/src/cmd/go/testdata/script/work.txt index a2d3e85d03..3159792868 100644 --- a/src/cmd/go/testdata/script/work.txt +++ b/src/cmd/go/testdata/script/work.txt @@ -1,5 +1,4 @@ [short] skip 'runs go run' -env TESTGO_VERSION=go1.26.0 ! go work init doesnotexist stderr 'go: directory doesnotexist does not exist' @@ -75,7 +74,7 @@ use ( ../src/a ) -- go.work.want -- -go 1.25.0 +go $goversion use ( ./a diff --git a/src/cmd/go/testdata/script/work_edit.txt b/src/cmd/go/testdata/script/work_edit.txt index 2642d5b4c5..021346653f 100644 --- a/src/cmd/go/testdata/script/work_edit.txt +++ b/src/cmd/go/testdata/script/work_edit.txt @@ -1,5 +1,4 @@ # Test editing go.work files. -env TESTGO_VERSION=go1.26.0 go work init m cmpenv go.work go.work.want_initial @@ -55,11 +54,11 @@ module m go 1.18 -- go.work.want_initial -- -go 1.25.0 +go $goversion use ./m -- go.work.want_use_n -- -go 1.25.0 +go $goversion use ( ./m diff --git a/src/cmd/go/testdata/script/work_init_path.txt b/src/cmd/go/testdata/script/work_init_path.txt index 72a55fc3d4..0a2d3729fc 100644 --- a/src/cmd/go/testdata/script/work_init_path.txt +++ b/src/cmd/go/testdata/script/work_init_path.txt @@ -2,7 +2,7 @@ # 'go work init . .. foo/bar' should produce a go.work file # with the same paths as 'go work init; go work use -r ..', # and it should have 'use .' rather than 'use ./.' inside. -env TESTGO_VERSION=go1.23 + cd dir go work init . .. foo/bar @@ -12,19 +12,19 @@ go work init go work use -r .. cmp go.work go.work.init -cmp go.work $WORK/go.work.want +cmpenv go.work $WORK/go.work.want -- go.mod -- module example go 1.18 -- dir/go.mod -- module example -go 1.21.0 +go 1.18 -- dir/foo/bar/go.mod -- module example -go 1.21.0 +go 1.18 -- $WORK/go.work.want -- -go 1.21.0 +go $goversion use ( . diff --git a/src/cmd/go/testdata/script/work_init_toolchain.txt b/src/cmd/go/testdata/script/work_init_toolchain.txt index 012d22bea3..900ea2cf2f 100644 --- a/src/cmd/go/testdata/script/work_init_toolchain.txt +++ b/src/cmd/go/testdata/script/work_init_toolchain.txt @@ -8,13 +8,13 @@ go mod edit -C m1_22_0 -go=1.22.0 -toolchain=go1.99.0 # work init writes the current Go version to the go line go work init -grep '^go 1.48.0$' go.work +grep '^go 1.50$' go.work ! grep toolchain go.work -# work init with older modules should leave go 1.48.0 in the go.work. +# work init with older modules should leave go 1.50 in the go.work. rm go.work go work init ./m1_22_0 -grep '^go 1.48.0$' go.work +grep '^go 1.50$' go.work ! grep toolchain go.work # work init with newer modules should bump go, @@ -31,5 +31,5 @@ env GOTOOLCHAIN=auto go work init ./m1_22_0 stderr '^go: m1_22_0'${/}'go.mod requires go >= 1.22.0; switching to go1.22.9$' cat go.work -grep '^go 1.22.0$' go.work +grep '^go 1.22.9$' go.work ! grep toolchain go.work diff --git a/src/cmd/go/testdata/script/work_init_version.txt b/src/cmd/go/testdata/script/work_init_version.txt deleted file mode 100644 index 7472dedd48..0000000000 --- a/src/cmd/go/testdata/script/work_init_version.txt +++ /dev/null @@ -1,35 +0,0 @@ -env TESTGO_VERSION=go1.28-devel -go work init -cmp go.work go.work.want-1.26.0 -rm go.work -env TESTGO_VERSION=go1.26.0 -go work init -cmp go.work go.work.want-1.25.0 -rm go.work -env TESTGO_VERSION=go1.22.2 -go work init -cmp go.work go.work.want-1.21.0 -rm go.work -env TESTGO_VERSION=go1.25.0-xyzzy -go work init -cmp go.work go.work.want-1.24.0 -rm go.work -env TESTGO_VERSION=go1.24rc3 -go work init -cmp go.work go.work.want-1.22.0 -rm go.work -env TESTGO_VERSION=go1.18beta2 -go work init -cmp go.work go.work.want-1.16.0 --- go.work.want-1.26.0 -- -go 1.26.0 --- go.work.want-1.25.0 -- -go 1.25.0 --- go.work.want-1.24.0 -- -go 1.24.0 --- go.work.want-1.22.0 -- -go 1.22.0 --- go.work.want-1.21.0 -- -go 1.21.0 --- go.work.want-1.16.0 -- -go 1.16.0 diff --git a/src/cmd/go/testdata/script/work_sync_toolchain.txt b/src/cmd/go/testdata/script/work_sync_toolchain.txt index 28b45556cd..989d6bb792 100644 --- a/src/cmd/go/testdata/script/work_sync_toolchain.txt +++ b/src/cmd/go/testdata/script/work_sync_toolchain.txt @@ -11,14 +11,13 @@ go mod init -C m1_24_rc0 go mod edit -C m1_24_rc0 -go=1.24rc0 -toolchain=go1.99.2 go work init ./m1_22_0 ./m1_22_1 -cat go.work -grep '^go 1.48.0$' go.work +grep '^go 1.50$' go.work ! grep toolchain go.work -# work sync with older modules should leave go 1.48.0 in the go.work. +# work sync with older modules should leave go 1.50 in the go.work. go work sync cat go.work -grep '^go 1.48.0$' go.work +grep '^go 1.50$' go.work ! grep toolchain go.work # work sync with newer modules should update go 1.21 -> 1.22.1 and toolchain -> go1.22.9 in go.work diff --git a/src/cmd/go/testdata/script/work_use_toolchain.txt b/src/cmd/go/testdata/script/work_use_toolchain.txt index 8ab2a99013..d81e4a4c3e 100644 --- a/src/cmd/go/testdata/script/work_use_toolchain.txt +++ b/src/cmd/go/testdata/script/work_use_toolchain.txt @@ -11,12 +11,12 @@ go mod init -C m1_24_rc0 go mod edit -C m1_24_rc0 -go=1.24rc0 -toolchain=go1.99.2 go work init -grep '^go 1.48.0$' go.work +grep '^go 1.50$' go.work ! grep toolchain go.work -# work use with older modules should leave go 1.48.0 in the go.work. +# work use with older modules should leave go 1.50 in the go.work. go work use ./m1_22_0 -grep '^go 1.48.0$' go.work +grep '^go 1.50$' go.work ! grep toolchain go.work # work use with newer modules should bump go and toolchain, -- 2.52.0