From d57c3fd743b723d564be5764024241cdefd5aa43 Mon Sep 17 00:00:00 2001 From: Ian Alexander Date: Wed, 8 Oct 2025 15:05:14 -0400 Subject: [PATCH] cmd/go: inject State parameter into `work.runInstall` This command modifies the call tree starting at `work.runInstall` to inject a `State` parameter to every function that is currently using the global `modload.LoaderState` variable. By explicilty passing a `State` parameter, we can begin to eliminate the usage of the global `modload.LoaderState`. This commit is part of the overall effort to eliminate global modloader state. [git-generate] cd src/cmd/go/internal/work rf 'inject modload.LoaderState runInstall' cd .. ./rf-cleanup.zsh Change-Id: I038d2c4870d67835c165852b223eaad3e2496202 Reviewed-on: https://go-review.googlesource.com/c/go/+/710304 Reviewed-by: Michael Matloob LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Matloob --- src/cmd/go/internal/work/build.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 496247b9a7..d5687956b4 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -689,7 +689,7 @@ func libname(args []string, pkgs []*load.Package) (string, error) { func runInstall(ctx context.Context, cmd *base.Command, args []string) { for _, arg := range args { if strings.Contains(arg, "@") && !build.IsLocalImport(arg) && !filepath.IsAbs(arg) { - installOutsideModule(ctx, args) + installOutsideModule(modload.LoaderState, ctx, args) return } } @@ -725,7 +725,7 @@ func runInstall(ctx context.Context, cmd *base.Command, args []string) { load.PrepareForCoverageBuild(modload.LoaderState, pkgs) } - InstallPackages(ctx, args, pkgs) + InstallPackages(modload.LoaderState, ctx, args, pkgs) } // omitTestOnly returns pkgs with test-only packages removed. @@ -745,7 +745,7 @@ func omitTestOnly(pkgs []*load.Package) []*load.Package { return list } -func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Package) { +func InstallPackages(loaderstate *modload.State, ctx context.Context, patterns []string, pkgs []*load.Package) { ctx, span := trace.StartSpan(ctx, "InstallPackages "+strings.Join(patterns, " ")) defer span.Done() @@ -797,7 +797,7 @@ func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Packag // If p is a tool, delay the installation until the end of the build. // This avoids installing assemblers/compilers that are being executed // by other steps in the build. - a1 := b.AutoAction(modload.LoaderState, ModeInstall, depMode, p) + a1 := b.AutoAction(loaderstate, ModeInstall, depMode, p) if load.InstallTargetDir(p) == load.ToTool { a.Deps = append(a.Deps, a1.Deps...) a1.Deps = append(a1.Deps, a) @@ -819,7 +819,7 @@ func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Packag // tools above did not apply, and a is just a simple Action // with a list of Deps, one per package named in pkgs, // the same as in runBuild. - a = b.buildmodeShared(modload.LoaderState, ModeInstall, ModeInstall, patterns, pkgs, a) + a = b.buildmodeShared(loaderstate, ModeInstall, ModeInstall, patterns, pkgs, a) } b.Do(ctx, a) @@ -858,12 +858,12 @@ func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Packag // in the current directory or parent directories. // // See golang.org/issue/40276 for details and rationale. -func installOutsideModule(ctx context.Context, args []string) { - modload.LoaderState.ForceUseModules = true - modload.LoaderState.RootMode = modload.NoRoot - modload.AllowMissingModuleImports(modload.LoaderState) - modload.Init(modload.LoaderState) - BuildInit(modload.LoaderState) +func installOutsideModule(loaderstate *modload.State, ctx context.Context, args []string) { + loaderstate.ForceUseModules = true + loaderstate.RootMode = modload.NoRoot + modload.AllowMissingModuleImports(loaderstate) + modload.Init(loaderstate) + BuildInit(loaderstate) // Load packages. Ignore non-main packages. // Print a warning if an argument contains "..." and matches no main packages. @@ -872,7 +872,7 @@ func installOutsideModule(ctx context.Context, args []string) { // TODO(golang.org/issue/40276): don't report errors loading non-main packages // matched by a pattern. pkgOpts := load.PackageOpts{MainOnly: true} - pkgs, err := load.PackagesAndErrorsOutsideModule(modload.LoaderState, ctx, pkgOpts, args) + pkgs, err := load.PackagesAndErrorsOutsideModule(loaderstate, ctx, pkgOpts, args) if err != nil { base.Fatal(err) } @@ -883,7 +883,7 @@ func installOutsideModule(ctx context.Context, args []string) { } // Build and install the packages. - InstallPackages(ctx, patterns, pkgs) + InstallPackages(loaderstate, ctx, patterns, pkgs) } // ExecCmd is the command to use to run user binaries. -- 2.52.0