From f86ddb54b5b8e4cb30b8fe2f9f3a2c0c172e7c37 Mon Sep 17 00:00:00 2001 From: Ian Alexander Date: Wed, 20 Aug 2025 19:21:56 -0400 Subject: [PATCH] cmd/go: refactor usage of `ForceUseModules` This commit refactors usage of the global variable `ForceUseModules` to the global LoaderState field of the same name. This commit is part of the overall effort to eliminate global modloader state. [git-generate] cd src/cmd/go/internal/modload rf 'mv State.forceUseModules State.ForceUseModules' rf 'ex { ForceUseModules -> LoaderState.ForceUseModules }' for dir in load modcmd modget run toolchain work workcmd ; do cd ../${dir} rf 'ex { import "cmd/go/internal/modload"; modload.ForceUseModules -> modload.LoaderState.ForceUseModules }' done cd ../modload rf 'add State.initialized \ // ForceUseModules may be set to force modules to be enabled when\ // GO111MODULE=auto or to report an error when GO111MODULE=off.' rf 'rm ForceUseModules' Change-Id: Ibdecfd273ff672516c9eb86279e5dfc6cdecb2ea Reviewed-on: https://go-review.googlesource.com/c/go/+/698057 Reviewed-by: Michael Matloob Reviewed-by: Michael Matloob LUCI-TryBot-Result: Go LUCI --- src/cmd/go/internal/load/pkg.go | 2 +- src/cmd/go/internal/modcmd/download.go | 2 +- src/cmd/go/internal/modcmd/graph.go | 2 +- src/cmd/go/internal/modcmd/init.go | 2 +- src/cmd/go/internal/modcmd/tidy.go | 2 +- src/cmd/go/internal/modcmd/vendor.go | 2 +- src/cmd/go/internal/modcmd/verify.go | 2 +- src/cmd/go/internal/modcmd/why.go | 2 +- src/cmd/go/internal/modget/get.go | 2 +- src/cmd/go/internal/modload/init.go | 21 ++++++++++----------- src/cmd/go/internal/run/run.go | 2 +- src/cmd/go/internal/toolchain/select.go | 4 ++-- src/cmd/go/internal/work/build.go | 2 +- src/cmd/go/internal/workcmd/init.go | 2 +- src/cmd/go/internal/workcmd/sync.go | 2 +- src/cmd/go/internal/workcmd/use.go | 2 +- 16 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 1f791546f9..48b2e70d74 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -3348,7 +3348,7 @@ func GoFilesPackage(ctx context.Context, opts PackageOpts, gofiles []string) *Pa // would cause it to be interpreted differently if it were the main module // (replace, exclude). func PackagesAndErrorsOutsideModule(ctx context.Context, opts PackageOpts, args []string) ([]*Package, error) { - if !modload.ForceUseModules { + if !modload.LoaderState.ForceUseModules { panic("modload.ForceUseModules must be true") } if modload.RootMode != modload.NoRoot { diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 2f4feae8f2..6d12d689f0 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -112,7 +112,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { modload.InitWorkfile() // Check whether modules are enabled and whether we're in a module. - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.ExplicitWriteGoMod = true haveExplicitArgs := len(args) > 0 diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 172c1dda5c..4abae33129 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -57,7 +57,7 @@ func runGraph(ctx context.Context, cmd *base.Command, args []string) { if len(args) > 0 { base.Fatalf("go: 'go mod graph' accepts no arguments") } - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NeedRoot goVersion := graphGo.String() diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index 356a056991..618c673bf8 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -43,6 +43,6 @@ func runInit(ctx context.Context, cmd *base.Command, args []string) { modPath = args[0] } - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.CreateModFile(ctx, modPath) // does all the hard work } diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index 2efa33a7c3..dde70c6d74 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -119,7 +119,7 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { // those packages. In order to make 'go test' reproducible for the packages // that are in 'all' but outside of the main module, we must explicitly // request that their test dependencies be included. - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NeedRoot goVersion := tidyGo.String() diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index e1a9081a95..bd3d8d602e 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -77,7 +77,7 @@ func RunVendor(ctx context.Context, vendorE bool, vendorO string, args []string) if len(args) != 0 { base.Fatalf("go: 'go mod vendor' accepts no arguments") } - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NeedRoot loadOpts := modload.PackageOpts{ diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go index d07f730c5d..ecd25d3a40 100644 --- a/src/cmd/go/internal/modcmd/verify.go +++ b/src/cmd/go/internal/modcmd/verify.go @@ -50,7 +50,7 @@ func runVerify(ctx context.Context, cmd *base.Command, args []string) { // NOTE(rsc): Could take a module pattern. base.Fatalf("go: verify takes no arguments") } - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NeedRoot // Only verify up to GOMAXPROCS zips at once. diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index 198672d806..6c4bf8abab 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -64,7 +64,7 @@ func init() { func runWhy(ctx context.Context, cmd *base.Command, args []string) { modload.InitWorkfile() - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NeedRoot modload.ExplicitWriteGoMod = true // don't write go.mod in ListModules diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 25dbf3972f..167f515be9 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -298,7 +298,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go: -insecure flag is no longer supported; use GOINSECURE instead") } - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true // Do not allow any updating of go.mod until we've applied // all the requested changes and checked that the result matches diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index d7d532ec94..264c02ef6d 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -41,10 +41,6 @@ var ( // RootMode determines whether a module root is needed. RootMode Root - // ForceUseModules may be set to force modules to be enabled when - // GO111MODULE=auto or to report an error when GO111MODULE=off. - ForceUseModules bool - allowMissingModuleImports bool // ExplicitWriteGoMod prevents LoadPackages, ListModules, and other functions @@ -96,7 +92,7 @@ func EnterWorkspace(ctx context.Context) (exit func(), err error) { // Reset the state to a clean state. oldstate := setState(State{}) - ForceUseModules = true + LoaderState.ForceUseModules = true // Load in workspace mode. InitWorkfile() @@ -406,7 +402,7 @@ func Reset() { func setState(s State) State { oldState := State{ initialized: LoaderState.initialized, - forceUseModules: ForceUseModules, + ForceUseModules: LoaderState.ForceUseModules, rootMode: RootMode, modRoots: modRoots, modulesEnabled: cfg.ModulesEnabled, @@ -414,7 +410,7 @@ func setState(s State) State { requirements: requirements, } LoaderState.initialized = s.initialized - ForceUseModules = s.forceUseModules + LoaderState.ForceUseModules = s.ForceUseModules RootMode = s.rootMode modRoots = s.modRoots cfg.ModulesEnabled = s.modulesEnabled @@ -429,8 +425,11 @@ func setState(s State) State { } type State struct { - initialized bool - forceUseModules bool + initialized bool + + // ForceUseModules may be set to force modules to be enabled when + // GO111MODULE=auto or to report an error when GO111MODULE=off. + ForceUseModules bool rootMode Root modRoots []string modulesEnabled bool @@ -465,11 +464,11 @@ func Init() { default: base.Fatalf("go: unknown environment setting GO111MODULE=%s", env) case "auto": - mustUseModules = ForceUseModules + mustUseModules = LoaderState.ForceUseModules case "on", "": mustUseModules = true case "off": - if ForceUseModules { + if LoaderState.ForceUseModules { base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") } mustUseModules = false diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index b81b1a007b..05ea5eaa15 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -76,7 +76,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { // This must be done before modload.Init, but we need to call work.BuildInit // before loading packages, since it affects package locations, e.g., // for -race and -msan. - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NoRoot modload.AllowMissingModuleImports() modload.Init() diff --git a/src/cmd/go/internal/toolchain/select.go b/src/cmd/go/internal/toolchain/select.go index e871261336..8f55076c62 100644 --- a/src/cmd/go/internal/toolchain/select.go +++ b/src/cmd/go/internal/toolchain/select.go @@ -353,7 +353,7 @@ func Exec(gotoolchain string) { // Set up modules without an explicit go.mod, to download distribution. modload.Reset() - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NoRoot modload.Init() @@ -692,7 +692,7 @@ func maybeSwitchForGoInstallVersion(minVers string) { // command lines if we add new flags in the future. // Set up modules without an explicit go.mod, to download go.mod. - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NoRoot modload.Init() defer modload.Reset() diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 6741b39f05..21bbab1bf4 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -859,7 +859,7 @@ func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Packag // // See golang.org/issue/40276 for details and rationale. func installOutsideModule(ctx context.Context, args []string) { - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.RootMode = modload.NoRoot modload.AllowMissingModuleImports() modload.Init() diff --git a/src/cmd/go/internal/workcmd/init.go b/src/cmd/go/internal/workcmd/init.go index 02240b8189..52185391c1 100644 --- a/src/cmd/go/internal/workcmd/init.go +++ b/src/cmd/go/internal/workcmd/init.go @@ -46,7 +46,7 @@ func init() { func runInit(ctx context.Context, cmd *base.Command, args []string) { modload.InitWorkfile() - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true gowork := modload.WorkFilePath() if gowork == "" { diff --git a/src/cmd/go/internal/workcmd/sync.go b/src/cmd/go/internal/workcmd/sync.go index 719cf76c9b..800dd15dd6 100644 --- a/src/cmd/go/internal/workcmd/sync.go +++ b/src/cmd/go/internal/workcmd/sync.go @@ -48,7 +48,7 @@ func init() { } func runSync(ctx context.Context, cmd *base.Command, args []string) { - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.InitWorkfile() if modload.WorkFilePath() == "" { base.Fatalf("go: no go.work file found\n\t(run 'go work init' first or specify path using GOWORK environment variable)") diff --git a/src/cmd/go/internal/workcmd/use.go b/src/cmd/go/internal/workcmd/use.go index afbe99d3a4..2842163517 100644 --- a/src/cmd/go/internal/workcmd/use.go +++ b/src/cmd/go/internal/workcmd/use.go @@ -61,7 +61,7 @@ func init() { } func runUse(ctx context.Context, cmd *base.Command, args []string) { - modload.ForceUseModules = true + modload.LoaderState.ForceUseModules = true modload.InitWorkfile() gowork := modload.WorkFilePath() if gowork == "" { -- 2.52.0