Repository: gohugoio/hugo (language: go)

Issue:
Module `disable` should not disable other dependencies/modules required by other modules.
Hi, I'm encountering an issue about disabling the modules, for example, there are two modules, `foo` and `bar`, both of them require the `common` module. Their configuration as follows.

```toml
[[module.imports]]
path = "modules/common"
```

And the site configuration as follows.

```toml
[[module.imports]]
path = "modules/foo"

[[module.imports]]
path = "modules/bar"
```

When I disable the `foo` module, then the `common` module will be disabled as well, which is unexpected and causes the `bar` module broken.

```toml
[[module.imports]]
path = "modules/foo"
disable = true

[[module.imports]]
path = "modules/bar"
```

### What version of Hugo are you using (`hugo version`)?

<pre>
$ hugo version
hugo v0.117.0-b2f0696cad918fb61420a6aff173eb36662b406e+extended linux/amd64 BuildDate=2023-08-07T12:49:48Z VendorInfo=snap:0.117.0
</pre>

### Does this issue reproduce with the latest release?

Yes


Discussion / hints:

Fix patch:
diff --git a/config/allconfig/configlanguage.go b/config/allconfig/configlanguage.go
index 534276c25ba..27ba00d8204 100644
--- a/config/allconfig/configlanguage.go
+++ b/config/allconfig/configlanguage.go
@@ -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
diff --git a/config/allconfig/load.go b/config/allconfig/load.go
index b997c28969d..3af6147da6a 100644
--- a/config/allconfig/load.go
+++ b/config/allconfig/load.go
@@ -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()...)
diff --git a/hugolib/paths/paths.go b/hugolib/paths/paths.go
index 817670dbd65..83d5921e088 100644
--- a/hugolib/paths/paths.go
+++ b/hugolib/paths/paths.go
@@ -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.
diff --git a/modules/client.go b/modules/client.go
index 7108c9befde..b41ca142a99 100644
--- a/modules/client.go
+++ b/modules/client.go
@@ -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
diff --git a/modules/collect.go b/modules/collect.go
index e47563ab778..5b5418bcd03 100644
--- a/modules/collect.go
+++ b/modules/collect.go
@@ -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
 	}
diff --git a/modules/module.go b/modules/module.go
index 42bd94e7be1..da963de5892 100644
--- a/modules/module.go
+++ b/modules/module.go
@@ -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
 }


Test patch:
diff --git a/testscripts/commands/mod__disable.txt b/testscripts/commands/mod__disable.txt
new file mode 100644
index 00000000000..f2d65dd0cc3
--- /dev/null
+++ b/testscripts/commands/mod__disable.txt
@@ -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
+
diff --git a/testscripts/commands/mod_vendor.txt b/testscripts/commands/mod_vendor.txt
index 8a77776b3df..5ca10aa7529 100644
--- a/testscripts/commands/mod_vendor.txt
+++ b/testscripts/commands/mod_vendor.txt
@@ -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