]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.26] cmd/go: revert update default go directive in mod or work...
authorMichael Matloob <matloob@golang.org>
Fri, 27 Feb 2026 18:03:36 +0000 (10:03 -0800)
committerCherry Mui <cherryyz@google.com>
Wed, 4 Mar 2026 18:38:52 +0000 (10:38 -0800)
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 <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/go/internal/modload/init.go
src/cmd/go/internal/workcmd/init.go
src/cmd/go/testdata/script/mod_edit.txt
src/cmd/go/testdata/script/mod_init_version.txt [deleted file]
src/cmd/go/testdata/script/work.txt
src/cmd/go/testdata/script/work_edit.txt
src/cmd/go/testdata/script/work_init_path.txt
src/cmd/go/testdata/script/work_init_toolchain.txt
src/cmd/go/testdata/script/work_init_version.txt [deleted file]
src/cmd/go/testdata/script/work_sync_toolchain.txt
src/cmd/go/testdata/script/work_use_toolchain.txt

index 8bfae2669282d2b12a8914e8c69bafa86aef685b..e3babc29c6a01ffc7a82addf8d09ba9a2dd5c243 100644 (file)
@@ -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 == ""
-}
index eff7a8c763968d39f924edd5094dd920611ca00b..896740f08035021fd9f5047f5714b86fffe00c19 100644 (file)
@@ -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)
 }
index 16d46610a26b7dbd520eaf591edfc7d43a880038..6b7dd2c2c5e21cdfbb2017627c68235810ea45df 100644 (file)
@@ -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 (file)
index 5b909bc..0000000
+++ /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
index a2d3e85d0371c6d3e6116e01132da195531ffdf1..31597928689552abaf79af4604caf4942c5f76cd 100644 (file)
@@ -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
index 2642d5b4c5a24902f56a49216863ed45bcf5fe2e..021346653fb6e30cb286dd8c0dd2d78fb27d4c26 100644 (file)
@@ -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
index 72a55fc3d4eed7ca4b0f8114ff642787d3bafb46..0a2d3729fca4bf33e77a39ba86049c521970b563 100644 (file)
@@ -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 (
        .
index 012d22bea3ab582aeb41ab32d83ef8745b4fa68c..900ea2cf2fc4317b92631f0c2947f03bd45b59e1 100644 (file)
@@ -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 (file)
index 7472ded..0000000
+++ /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
index 28b45556cdadd878d35a56316b81d71ba0404347..989d6bb792148adac2172dc9307e652e8cd4b652 100644 (file)
@@ -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
index 8ab2a9901305f9fd92884c54a4eef4b575ffec79..d81e4a4c3ef13e8352abe347accfca44036e5576 100644 (file)
@@ -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,