cmd/go: eliminate additional global variable

Move global variable to a field on the State type.

Change-Id: I1edd32e1d28ce814bcd75501098ee4b22227546b
Reviewed-on: https://go-review.googlesource.com/c/go/+/716162
Reviewed-by: Michael Matloob <matloob@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Matloob <matloob@google.com>
This commit is contained in:
Ian Alexander 2025-10-27 13:03:32 -04:00
parent f93186fb44
commit 0a95856b95
7 changed files with 47 additions and 45 deletions

View file

@ -308,7 +308,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) {
// Allow looking up modules for import paths when outside of a module.
// 'go get' is expected to do this, unlike other commands.
modload.AllowMissingModuleImports(moduleLoaderState)
moduleLoaderState.AllowMissingModuleImports()
// 'go get' no longer builds or installs packages, so there's nothing to do
// if there's no go.mod file.

View file

@ -29,10 +29,11 @@ import (
)
type ImportMissingError struct {
Path string
Module module.Version
QueryErr error
modContainingCWD module.Version
Path string
Module module.Version
QueryErr error
modContainingCWD module.Version
allowMissingModuleImports bool
// modRoot is dependent on the value of ImportingMainModule and should be
// kept in sync.
@ -70,7 +71,7 @@ func (e *ImportMissingError) Error() string {
if e.QueryErr != nil && !errors.Is(e.QueryErr, ErrNoModRoot) {
return fmt.Sprintf("cannot find module providing package %s: %v", e.Path, e.QueryErr)
}
if cfg.BuildMod == "mod" || (cfg.BuildMod == "readonly" && allowMissingModuleImports) {
if cfg.BuildMod == "mod" || (cfg.BuildMod == "readonly" && e.allowMissingModuleImports) {
return "cannot find module providing package " + e.Path
}
@ -373,8 +374,9 @@ func importFromModules(loaderstate *State, ctx context.Context, path string, rs
if len(mods) == 0 {
return module.Version{}, "", "", nil, &ImportMissingError{
Path: path,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
Path: path,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
allowMissingModuleImports: loaderstate.allowMissingModuleImports,
}
}
@ -494,10 +496,11 @@ func importFromModules(loaderstate *State, ctx context.Context, path string, rs
queryErr = NewNoMainModulesError(loaderstate)
}
return module.Version{}, "", "", nil, &ImportMissingError{
Path: path,
QueryErr: queryErr,
isStd: pathIsStd,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
Path: path,
QueryErr: queryErr,
isStd: pathIsStd,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
allowMissingModuleImports: loaderstate.allowMissingModuleImports,
}
}
@ -571,9 +574,10 @@ func queryImport(loaderstate *State, ctx context.Context, path string, rs *Requi
} else if ok {
if cfg.BuildMod == "readonly" {
return module.Version{}, &ImportMissingError{
Path: path,
replaced: m,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
Path: path,
replaced: m,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
allowMissingModuleImports: loaderstate.allowMissingModuleImports,
}
}
return m, nil
@ -601,13 +605,14 @@ func queryImport(loaderstate *State, ctx context.Context, path string, rs *Requi
//
// Instead of trying QueryPattern, report an ImportMissingError immediately.
return module.Version{}, &ImportMissingError{
Path: path,
isStd: true,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
Path: path,
isStd: true,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
allowMissingModuleImports: loaderstate.allowMissingModuleImports,
}
}
if (cfg.BuildMod == "readonly" || cfg.BuildMod == "vendor") && !allowMissingModuleImports {
if (cfg.BuildMod == "readonly" || cfg.BuildMod == "vendor") && !loaderstate.allowMissingModuleImports {
// In readonly mode, we can't write go.mod, so we shouldn't try to look up
// the module. If readonly mode was enabled explicitly, include that in
// the error message.
@ -620,9 +625,10 @@ func queryImport(loaderstate *State, ctx context.Context, path string, rs *Requi
queryErr = fmt.Errorf("import lookup disabled by -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason)
}
return module.Version{}, &ImportMissingError{
Path: path,
QueryErr: queryErr,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
Path: path,
QueryErr: queryErr,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
allowMissingModuleImports: loaderstate.allowMissingModuleImports,
}
}
@ -642,9 +648,10 @@ func queryImport(loaderstate *State, ctx context.Context, path string, rs *Requi
// Return "cannot find module providing package […]" instead of whatever
// low-level error QueryPattern produced.
return module.Version{}, &ImportMissingError{
Path: path,
QueryErr: err,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
Path: path,
QueryErr: err,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
allowMissingModuleImports: loaderstate.allowMissingModuleImports,
}
} else {
return module.Version{}, err
@ -670,10 +677,11 @@ func queryImport(loaderstate *State, ctx context.Context, path string, rs *Requi
return c.Mod, nil
}
return module.Version{}, &ImportMissingError{
Path: path,
Module: candidates[0].Mod,
newMissingVersion: candidate0MissingVersion,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
Path: path,
Module: candidates[0].Mod,
newMissingVersion: candidate0MissingVersion,
modContainingCWD: loaderstate.MainModules.ModContainingCWD(),
allowMissingModuleImports: loaderstate.allowMissingModuleImports,
}
}

View file

@ -58,16 +58,11 @@ var importTests = []struct {
func TestQueryImport(t *testing.T) {
loaderstate := NewState()
loaderstate.RootMode = NoRoot
loaderstate.AllowMissingModuleImports()
testenv.MustHaveExternalNetwork(t)
testenv.MustHaveExecPath(t, "git")
oldAllowMissingModuleImports := allowMissingModuleImports
defer func() {
allowMissingModuleImports = oldAllowMissingModuleImports
}()
allowMissingModuleImports = true
ctx := context.Background()
rs := LoadModFile(loaderstate, ctx)

View file

@ -38,8 +38,6 @@ import (
//
// TODO(#40775): See if these can be plumbed as explicit parameters.
var (
allowMissingModuleImports bool
// ExplicitWriteGoMod prevents LoadPackages, ListModules, and other functions
// from updating go.mod and go.sum or reporting errors when updates are
// needed. A package should set this if it would cause go.mod to be written
@ -415,7 +413,8 @@ func (s *State) setState(new State) State {
}
type State struct {
initialized bool
initialized bool
allowMissingModuleImports bool
// ForceUseModules may be set to force modules to be enabled when
// GO111MODULE=auto or to report an error when GO111MODULE=off.
@ -1292,11 +1291,11 @@ func fixVersion(loaderstate *State, ctx context.Context, fixed *bool) modfile.Ve
//
// This function affects the default cfg.BuildMod when outside of a module,
// so it can only be called prior to Init.
func AllowMissingModuleImports(loaderstate *State) {
if loaderstate.initialized {
func (s *State) AllowMissingModuleImports() {
if s.initialized {
panic("AllowMissingModuleImports after Init")
}
allowMissingModuleImports = true
s.allowMissingModuleImports = true
}
// makeMainModules creates a MainModuleSet and associated variables according to
@ -1553,7 +1552,7 @@ func setDefaultBuildMod(loaderstate *State) {
return
}
if loaderstate.modRoots == nil {
if allowMissingModuleImports {
if loaderstate.allowMissingModuleImports {
cfg.BuildMod = "mod"
} else {
cfg.BuildMod = "readonly"

View file

@ -1184,7 +1184,7 @@ func loadFromRoots(loaderstate *State, ctx context.Context, params loaderParams)
continue
}
if !ld.ResolveMissingImports || (!HasModRoot(loaderstate) && !allowMissingModuleImports) {
if !ld.ResolveMissingImports || (!HasModRoot(loaderstate) && !loaderstate.allowMissingModuleImports) {
// We've loaded as much as we can without resolving missing imports.
break
}

View file

@ -79,7 +79,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) {
// for -race and -msan.
moduleLoaderState.ForceUseModules = true
moduleLoaderState.RootMode = modload.NoRoot
modload.AllowMissingModuleImports(moduleLoaderState)
moduleLoaderState.AllowMissingModuleImports()
modload.Init(moduleLoaderState)
} else {
modload.InitWorkfile(moduleLoaderState)

View file

@ -863,7 +863,7 @@ func InstallPackages(loaderstate *modload.State, ctx context.Context, patterns [
func installOutsideModule(loaderstate *modload.State, ctx context.Context, args []string) {
loaderstate.ForceUseModules = true
loaderstate.RootMode = modload.NoRoot
modload.AllowMissingModuleImports(loaderstate)
loaderstate.AllowMissingModuleImports()
modload.Init(loaderstate)
BuildInit(loaderstate)