Fix it so disable a module does not disable transitive dependency required by others

The motivation behind the original implementation was probably to show disabled modules when running `hugo mod graph`.

Fixes #11376
This commit is contained in:
Bjørn Erik Pedersen 2023-08-23 12:39:24 +02:00
parent 9a8c84d600
commit dcf425c846
8 changed files with 37 additions and 42 deletions

View file

@ -140,7 +140,7 @@ func (c ConfigLanguage) GetConfigSection(s string) any {
return c.config.Permalinks
case "minify":
return c.config.Minify
case "activeModules":
case "allModules":
return c.m.Modules
case "deployment":
return c.config.Deployment

View file

@ -84,7 +84,7 @@ func LoadConfig(d ConfigSourceDescriptor) (*Configs, error) {
return nil, fmt.Errorf("failed to create config: %w", err)
}
configs.Modules = moduleConfig.ActiveModules
configs.Modules = moduleConfig.AllModules
configs.ModulesClient = modulesClient
if err := configs.Init(); err != nil {
@ -471,7 +471,7 @@ func (l *configLoader) loadModules(configs *Configs) (modules.ModulesConfig, *mo
ex := hexec.New(conf.Security)
hook := func(m *modules.ModulesConfig) error {
for _, tc := range m.ActiveModules {
for _, tc := range m.AllModules {
if len(tc.ConfigFilenames()) > 0 {
if tc.Watch() {
l.ModulesConfigFiles = append(l.ModulesConfigFiles, tc.ConfigFilenames()...)

View file

@ -83,7 +83,7 @@ func New(fs *hugofs.Fs, cfg config.AllProvider) (*Paths, error) {
}
func (p *Paths) AllModules() modules.Modules {
return p.Cfg.GetConfigSection("activeModules").(modules.Modules)
return p.Cfg.GetConfigSection("allModules").(modules.Modules)
}
// GetBasePath returns any path element in baseURL if needed.

View file

@ -153,10 +153,6 @@ func (c *Client) Graph(w io.Writer) error {
continue
}
prefix := ""
if module.Disabled() {
prefix = "DISABLED "
}
dep := pathVersion(module.Owner()) + " " + pathVersion(module)
if replace := module.Replace(); replace != nil {
if replace.Version() != "" {
@ -166,7 +162,7 @@ func (c *Client) Graph(w io.Writer) error {
dep += " => " + replace.Dir()
}
}
fmt.Fprintln(w, prefix+dep)
fmt.Fprintln(w, dep)
}
return nil

View file

@ -109,11 +109,8 @@ func (h *Client) collect(tidy bool) (ModulesConfig, *collector) {
}
type ModulesConfig struct {
// All modules, including any disabled.
AllModules Modules
// All active modules.
ActiveModules Modules
AllModules Modules
// Set if this is a Go modules enabled project.
GoModulesFilename string
@ -123,7 +120,7 @@ type ModulesConfig struct {
}
func (m ModulesConfig) HasConfigFile() bool {
for _, mod := range m.ActiveModules {
for _, mod := range m.AllModules {
if len(mod.ConfigFilenames()) > 0 {
return true
}
@ -133,18 +130,12 @@ func (m ModulesConfig) HasConfigFile() bool {
}
func (m *ModulesConfig) setActiveMods(logger loggers.Logger) error {
var activeMods Modules
for _, mod := range m.AllModules {
if !mod.Config().HugoVersion.IsValid() {
logger.Warnf(`Module %q is not compatible with this Hugo version; run "hugo mod graph" for more information.`, mod.Path())
}
if !mod.Disabled() {
activeMods = append(activeMods, mod)
}
}
m.ActiveModules = activeMods
return nil
}
@ -228,7 +219,7 @@ func (c *collector) getVendoredDir(path string) (vendoredModule, bool) {
return v, found
}
func (c *collector) add(owner *moduleAdapter, moduleImport Import, disabled bool) (*moduleAdapter, error) {
func (c *collector) add(owner *moduleAdapter, moduleImport Import) (*moduleAdapter, error) {
var (
mod *goModule
@ -316,11 +307,10 @@ func (c *collector) add(owner *moduleAdapter, moduleImport Import, disabled bool
}
ma := &moduleAdapter{
dir: moduleDir,
vendor: vendored,
disabled: disabled,
gomod: mod,
version: version,
dir: moduleDir,
vendor: vendored,
gomod: mod,
version: version,
// This may be the owner of the _vendor dir
owner: realOwner,
}
@ -343,7 +333,7 @@ func (c *collector) add(owner *moduleAdapter, moduleImport Import, disabled bool
return ma, nil
}
func (c *collector) addAndRecurse(owner *moduleAdapter, disabled bool) error {
func (c *collector) addAndRecurse(owner *moduleAdapter) error {
moduleConfig := owner.Config()
if owner.projectMod {
if err := c.applyMounts(Import{}, owner); err != nil {
@ -352,17 +342,18 @@ func (c *collector) addAndRecurse(owner *moduleAdapter, disabled bool) error {
}
for _, moduleImport := range moduleConfig.Imports {
disabled := disabled || moduleImport.Disable
if moduleImport.Disable {
continue
}
if !c.isSeen(moduleImport.Path) {
tc, err := c.add(owner, moduleImport, disabled)
tc, err := c.add(owner, moduleImport)
if err != nil {
return err
}
if tc == nil || moduleImport.IgnoreImports {
continue
}
if err := c.addAndRecurse(tc, disabled); err != nil {
if err := c.addAndRecurse(tc); err != nil {
return err
}
}
@ -531,7 +522,7 @@ func (c *collector) collect() {
projectMod := createProjectModule(c.gomods.GetMain(), c.ccfg.WorkingDir, c.moduleConfig)
if err := c.addAndRecurse(projectMod, false); err != nil {
if err := c.addAndRecurse(projectMod); err != nil {
c.err = err
return
}

View file

@ -40,9 +40,6 @@ type Module interface {
// Directory holding files for this module.
Dir() string
// This module is disabled.
Disabled() bool
// Returns whether this is a Go Module.
IsGoMod() bool
@ -81,7 +78,6 @@ type moduleAdapter struct {
dir string
version string
vendor bool
disabled bool
projectMod bool
owner Module
@ -115,10 +111,6 @@ func (m *moduleAdapter) Dir() string {
return m.gomod.Dir
}
func (m *moduleAdapter) Disabled() bool {
return m.disabled
}
func (m *moduleAdapter) IsGoMod() bool {
return m.gomod != nil
}

View file

@ -0,0 +1,15 @@
hugo mod graph
stdout 'withhugotoml.*commonmod'
-- hugo.toml --
title = "Hugo Modules Test"
[module]
[[module.imports]]
path="github.com/gohugoio/hugo-mod-integrationtests/withconfigtoml"
disable = true
[[module.imports]]
path="github.com/gohugoio/hugo-mod-integrationtests/withhugotoml"
-- go.mod --
module foo
go 1.19

View file

@ -20,5 +20,6 @@ go 1.19
module github.com/gohugoio/testmod
-- golden/vendor.txt --
# github.com/gohugoio/hugo-mod-integrationtests/withconfigtoml v1.0.0
# github.com/gohugoio/hugo-mod-integrationtests/withhugotoml v1.0.0
# github.com/gohugoio/hugo-mod-integrationtests/withconfigtoml v1.1.0
# github.com/gohugoio/hugo-mod-integrationtests/commonmod v0.0.0-20230823103305-919cefe8a425
# github.com/gohugoio/hugo-mod-integrationtests/withhugotoml v1.1.0