// EnterModule resets MainModules and requirements to refer to just this one module.
func EnterModule(ctx context.Context, enterModroot string) {
LoaderState.MainModules = nil // reset MainModules
- requirements = nil
+ LoaderState.requirements = nil
workFilePath = "" // Force module mode
modfetch.Reset()
// Update the content of the previous main module, and recompute the requirements.
*LoaderState.MainModules.ModFile(mm) = *updatedmodfile
- requirements = requirementsFromModFiles(ctx, LoaderState.MainModules.workFile, slices.Collect(maps.Values(LoaderState.MainModules.modFiles)), nil)
+ LoaderState.requirements = requirementsFromModFiles(ctx, LoaderState.MainModules.workFile, slices.Collect(maps.Values(LoaderState.MainModules.modFiles)), nil)
return func() {
setState(oldstate)
modRoots: LoaderState.modRoots,
modulesEnabled: cfg.ModulesEnabled,
MainModules: LoaderState.MainModules,
- requirements: requirements,
+ requirements: LoaderState.requirements,
}
LoaderState.initialized = s.initialized
LoaderState.ForceUseModules = s.ForceUseModules
LoaderState.modRoots = s.modRoots
cfg.ModulesEnabled = s.modulesEnabled
LoaderState.MainModules = s.MainModules
- requirements = s.requirements
+ LoaderState.requirements = s.requirements
workFilePath = s.workFilePath
// The modfetch package's global state is used to compute
// the go.sum file, so save and restore it along with the
modRoots []string
modulesEnabled bool
MainModules *MainModuleSet
- requirements *Requirements
- workFilePath string
- modfetchState modfetch.State
+
+ // requirements is the requirement graph for the main module.
+ //
+ // It is always non-nil if the main module's go.mod file has been
+ // loaded.
+ //
+ // This variable should only be read from the loadModFile
+ // function, and should only be written in the loadModFile and
+ // commitRequirements functions. All other functions that need or
+ // produce a *Requirements should accept and/or return an explicit
+ // parameter.
+ requirements *Requirements
+ workFilePath string
+ modfetchState modfetch.State
}
func NewState() *State { return &State{} }
}
func loadModFile(ctx context.Context, opts *PackageOpts) (*Requirements, error) {
- if requirements != nil {
- return requirements, nil
+ if LoaderState.requirements != nil {
+ return LoaderState.requirements, nil
}
Init()
}
}
rawGoVersion.Store(mainModule, goVersion)
- requirements = newRequirements(pruning, roots, direct)
+ LoaderState.requirements = newRequirements(pruning, roots, direct)
if cfg.BuildMod == "vendor" {
// For issue 56536: Some users may have GOFLAGS=-mod=vendor set.
// Make sure it behaves as though the fake module is vendored
// with no dependencies.
- requirements.initVendor(nil)
+ LoaderState.requirements.initVendor(nil)
}
- return requirements, nil
+ return LoaderState.requirements, nil
}
var modFiles []*modfile.File
if inWorkspaceMode() {
// We don't need to update the mod file so return early.
- requirements = rs
+ LoaderState.requirements = rs
return rs, nil
}
}
}
- requirements = rs
- return requirements, nil
+ LoaderState.requirements = rs
+ return LoaderState.requirements, nil
}
func errWorkTooOld(gomod string, wf *modfile.WorkFile, goVers string) error {
if err != nil {
base.Fatal(err)
}
- requirements = rs
+ LoaderState.requirements = rs
if err := commitRequirements(ctx, WriteOpts{}); err != nil {
base.Fatal(err)
}
// WriteGoMod writes the current build list back to go.mod.
func WriteGoMod(ctx context.Context, opts WriteOpts) error {
- requirements = LoadModFile(ctx)
+ LoaderState.requirements = LoadModFile(ctx)
return commitRequirements(ctx, opts)
}
var list []*modfile.Require
toolchain := ""
goVersion := ""
- for _, m := range requirements.rootModules {
+ for _, m := range LoaderState.requirements.rootModules {
if m.Path == "go" {
goVersion = m.Version
continue
}
list = append(list, &modfile.Require{
Mod: m,
- Indirect: !requirements.direct[m.Path],
+ Indirect: !LoaderState.requirements.direct[m.Path],
})
}
if inWorkspaceMode() {
// go.mod files aren't updated in workspace mode, but we still want to
// update the go.work.sum file.
- return modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements())
+ return modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, LoaderState.requirements, addBuildListZipSums), mustHaveCompleteRequirements())
}
_, updatedGoMod, modFile, err := UpdateGoModFromReqs(ctx, opts)
if err != nil {
// Don't write go.mod, but write go.sum in case we added or trimmed sums.
// 'go mod init' shouldn't write go.sum, since it will be incomplete.
if cfg.CmdName != "mod init" {
- if err := modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements()); err != nil {
+ if err := modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, LoaderState.requirements, addBuildListZipSums), mustHaveCompleteRequirements()); err != nil {
return err
}
}
// 'go mod init' shouldn't write go.sum, since it will be incomplete.
if cfg.CmdName != "mod init" {
if err == nil {
- err = modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, requirements, addBuildListZipSums), mustHaveCompleteRequirements())
+ err = modfetch.WriteGoSum(ctx, keepSums(ctx, loaded, LoaderState.requirements, addBuildListZipSums), mustHaveCompleteRequirements())
}
}
}()
if opts.TidyDiff {
cfg.BuildMod = "readonly"
loaded = ld
- requirements = loaded.requirements
+ LoaderState.requirements = loaded.requirements
currentGoMod, updatedGoMod, _, err := UpdateGoModFromReqs(ctx, WriteOpts{})
if err != nil {
base.Fatal(err)
// Dropping compatibility for 1.16 may result in a strictly smaller go.sum.
// Update the keep map with only the loaded.requirements.
if gover.Compare(compatVersion, "1.16") > 0 {
- keep = keepSums(ctx, loaded, requirements, addBuildListZipSums)
+ keep = keepSums(ctx, loaded, LoaderState.requirements, addBuildListZipSums)
}
currentGoSum, tidyGoSum := modfetch.TidyGoSum(keep)
goSumDiff := diff.Diff("current/go.sum", currentGoSum, "tidy/go.sum", tidyGoSum)
// to call WriteGoMod itself) or if ResolveMissingImports is false (the
// command wants to examine the package graph as-is).
loaded = ld
- requirements = loaded.requirements
+ LoaderState.requirements = loaded.requirements
for _, pkg := range ld.pkgs {
if !pkg.isTest() {
return roots
},
})
- requirements = loaded.requirements
+ LoaderState.requirements = loaded.requirements
if !ExplicitWriteGoMod {
if err := commitRequirements(ctx, WriteOpts{}); err != nil {