]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
docshelper: Fix some YAML serialization issues with sites matrix configuration
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 11 Nov 2025 10:27:26 +0000 (11:27 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 11 Nov 2025 12:49:31 +0000 (13:49 +0100)
Fixes #14132

commands/gen.go
hugolib/roles/roles.go
hugolib/sitesmatrix/sitematrix_integration_test.go
hugolib/sitesmatrix/vectorstores.go
hugolib/versions/versions.go
langs/config.go
modules/config.go

index 5579b755459a63e2cccf9467c44601b3f80bef38..a9d2fa7a24219686273f2791350c97e891989b92 100644 (file)
@@ -249,7 +249,7 @@ url: %s
                                        return err
                                }
                                defer f.Close()
-                               yamlEnc := yaml.NewEncoder(f, yaml.AutoInt())
+                               yamlEnc := yaml.NewEncoder(f, yaml.UseSingleQuote(true), yaml.AutoInt())
                                if err := yamlEnc.Encode(m); err != nil {
                                        return err
                                }
index f2cf3d633e29835af338e86446ba4189bf9572a8..6b1b5d3f6edbf74d42a5984207521067dbf41ca9 100644 (file)
@@ -206,7 +206,7 @@ func DecodeConfig(defaultContentRole string, m map[string]any) (*config.ConfigNa
                if defaultContentRole, err = roles.init(defaultContentRole); err != nil {
                        return roles, nil, err
                }
-               return roles, nil, nil
+               return roles, roles.roleConfigs, nil
        })
 
        return v, defaultContentRole, err
index bfe234db0aa6a492fee54ca0fca71f921abe1b97..5ab6ebba31ce4d54f02009602dbd05d2f31fa0be 100644 (file)
@@ -14,6 +14,7 @@
 package sitesmatrix_test
 
 import (
+       "encoding/json"
        "fmt"
        "strings"
        "testing"
@@ -1100,6 +1101,87 @@ title: "P%d"
        return b
 }
 
+// See #14132. We recently reworked the config structs for languages, versions, and roles,
+// which made them incomplete when generating the docshelper YAML file.
+// Add a test here to ensure we don't regress.
+func TestUnmarshalSitesMatrixConfig(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- hugo.toml --
+defaultContentLanguage = "en"
+defaultContentLanguageInSubDir = true
+defaultCOntentVersionInSubDir = true
+defaultContentVersion = "v1.0.0"
+defaultContentRole = "guest"
+defaultContentRoleInSubDir = true
+
+[moule.mounts]
+source = 'content'
+target = 'content'
+
+
+[languages]
+[languages.en]
+
+[versions]
+[versions."v1.0.0"]
+
+[roles]
+[roles.guest]
+
+`
+
+       b := hugolib.Test(t, files)
+
+       toJSONAndMap := func(v any) map[string]any {
+               bb, err := json.Marshal(v)
+               b.Assert(err, qt.IsNil)
+               var m map[string]any
+               err = json.Unmarshal(bb, &m)
+               b.Assert(err, qt.IsNil)
+               return m
+       }
+
+       conf := b.H.Configs.Base
+
+       b.Assert(toJSONAndMap(conf.Languages), qt.DeepEquals,
+               map[string]any{
+                       "en": map[string]any{
+                               "Disabled":          bool(false),
+                               "LanguageCode":      "",
+                               "LanguageDirection": "",
+                               "LanguageName":      "",
+                               "Title":             "",
+                               "Weight":            float64(0),
+                       },
+               })
+
+       b.Assert(toJSONAndMap(conf.Versions), qt.DeepEquals, map[string]any{
+               "v1.0.0": map[string]any{
+                       "Weight": float64(0),
+               },
+       })
+
+       b.Assert(toJSONAndMap(conf.Roles), qt.DeepEquals, map[string]any{
+               "guest": map[string]any{
+                       "Weight": float64(0),
+               },
+       })
+
+       firstMount := conf.Module.Mounts[0]
+       b.Assert(toJSONAndMap(firstMount.Sites.Matrix), qt.DeepEquals, map[string]any{
+               "languages": nil,
+               "versions":  nil,
+               "roles":     nil,
+       })
+       b.Assert(toJSONAndMap(firstMount.Sites.Complements), qt.DeepEquals, map[string]any{
+               "languages": nil,
+               "versions":  nil,
+               "roles":     nil,
+       })
+}
+
 func TestSitesMatrixContentBenchmark(t *testing.T) {
        const numPages = 3
        b := newSitesMatrixContentBenchmarkBuilder(t, numPages, false, true)
index 6f385857485de40cba78270a41fc6b2e8e312167..4f51be7a3d9480f76b35c6e853b03cc5446a39e6 100644 (file)
@@ -813,9 +813,9 @@ type IntSetsConfig struct {
 // Sites holds configuration about which sites a file/content/page/resource belongs to.
 type Sites struct {
        // Matrix defines what sites to build this content for.
-       Matrix StringSlices `mapstructure:"matrix" json:"matrix,omitzero"`
+       Matrix StringSlices `mapstructure:"matrix" json:"matrix"`
        // Complements defines what sites to complement with this content.
-       Complements StringSlices `mapstructure:"complements" json:"complements,omitzero"`
+       Complements StringSlices `mapstructure:"complements" json:"complements"`
 }
 
 func (s *Sites) Equal(other Sites) bool {
index 142087da9589ee941030dba355ead67e0396892b..a2c743d18b58420887d9de22de97c07350bd906f 100644 (file)
@@ -206,6 +206,6 @@ func DecodeConfig(defaultContentVersion string, m map[string]any) (*config.Confi
                if err := versions.init(defaultContentVersion); err != nil {
                        return versions, nil, err
                }
-               return versions, nil, nil
+               return versions, versions.versionConfigs, nil
        })
 }
index db708c3acc2883dd4ecb7f38e04aee8eeafe4e79..b6bc0ffead028fe103df41a605aa3ddd6c2d4327 100644 (file)
@@ -216,7 +216,7 @@ func DecodeConfig(defaultContentLanguage string, disabledLanguages []string, m m
                if defaultContentLanguage, err = languages.init(defaultContentLanguage, disabledLanguages); err != nil {
                        return languages, nil, err
                }
-               return languages, nil, nil
+               return languages, languages.LanguageConfigs, nil
        })
 
        return v, defaultContentLanguage, err
index a3e8256fe5d61f0c4bef96f8b385f30d6b1d443c..adc330902128d3647d8422645329b9ddda53831a 100644 (file)
@@ -418,7 +418,8 @@ type Mount struct {
        Target string
 
        // Any file in this mount will be associated with this language.
-       Lang string
+       // Deprecated, use Sites instead.
+       Lang string `json:"-"`
 
        // Sites defines which sites this mount applies to.
        Sites sitesmatrix.Sites
@@ -429,11 +430,11 @@ type Mount struct {
 
        // Include only files matching the given Glob patterns (string or slice).
        // Deprecated, use Files instead.
-       IncludeFiles any
+       IncludeFiles any `json:"-"`
 
        // Exclude all files matching the given Glob patterns (string or slice).
        // Deprecated, use Files instead.
-       ExcludeFiles any
+       ExcludeFiles any `json:"-"`
 
        // Disable watching in watch mode for this mount.
        DisableWatch bool