in gomod/version.go [16:79]
func UpdateRequires(repoRootPath string, tags git.ModuleTags, dependencies map[string]string, force bool) error {
discoverer := NewDiscoverer(repoRootPath)
if err := discoverer.Discover(); err != nil {
return fmt.Errorf("failed to discover repository modules: %v", err)
}
modules := discoverer.Modules()
repoModules := make(map[string]struct {
ModuleDir string
File *modfile.File
})
for it := modules.Iterator(); ; {
module := it.Next()
if module == nil {
break
}
mod, err := LoadModuleFile(module.Path(), nil, true)
if err != nil {
return fmt.Errorf("failed to load module file: %w", err)
}
rm := repoModules[mod.Module.Mod.Path]
rm.File = mod
rm.ModuleDir = module.Path()
repoModules[mod.Module.Mod.Path] = rm
}
for _, mod := range repoModules {
for _, require := range mod.File.Require {
version := require.Mod.Version
if requireMod, ok := repoModules[require.Mod.Path]; ok {
latest, ok := tags.Latest(requireMod.ModuleDir)
if ok {
if force {
version = latest
} else if semver.Compare(latest, version) > 0 {
version = latest
}
}
} else {
dv, ok := dependencies[require.Mod.Path]
if ok {
if force {
version = dv
} else if semver.Compare(dv, version) > 0 {
version = dv
}
}
}
if err := mod.File.AddRequire(require.Mod.Path, version); err != nil {
return err
}
}
if err := WriteModuleFile(filepath.Join(discoverer.Root(), mod.ModuleDir), mod.File); err != nil {
return fmt.Errorf("failed to write module file: %w", err)
}
}
return nil
}