Skip to content

Commit

Permalink
Work
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed Apr 27, 2023
1 parent ed894c2 commit 102d98d
Show file tree
Hide file tree
Showing 4 changed files with 341 additions and 266 deletions.
278 changes: 18 additions & 260 deletions config/allconfig/allconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import (

"github.com/gohugoio/hugo/cache/filecache"
"github.com/gohugoio/hugo/common/maps"
"github.com/gohugoio/hugo/common/types"
"github.com/gohugoio/hugo/common/urls"
"github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/config/privacy"
Expand All @@ -45,9 +44,7 @@ import (
"github.com/gohugoio/hugo/resources/images"
"github.com/gohugoio/hugo/resources/page"
"github.com/gohugoio/hugo/resources/page/pagemeta"
"github.com/mitchellh/mapstructure"
"github.com/spf13/afero"
"github.com/spf13/cast"

xmaps "golang.org/x/exp/maps"
)
Expand Down Expand Up @@ -152,7 +149,11 @@ type Config struct {
UglyURLs any `mapstructure:"-"`
}

func (c *Config) Compile() error {
type configCompiler interface {
CompileConfig() error
}

func (c *Config) CompileConfig() error {
s := c.Timeout
if _, err := strconv.Atoi(s); err == nil {
// A number, assume seconds.
Expand Down Expand Up @@ -247,6 +248,14 @@ func (c *Config) Compile() error {
MainSections: c.MainSections,
}

for _, s := range allDecoderSetups {
if getCompiler := s.getCompiler; getCompiler != nil {
if err := getCompiler(c).CompileConfig(); err != nil {
return err
}
}
}

return nil
}

Expand Down Expand Up @@ -545,7 +554,7 @@ func FromLoadConfigResult(fs afero.Fs, res config.LoadConfigResult) (Configs, er
languagesConfig := maps.CleanConfigStringMap(root.GetStringMap("languages"))
var isMultiHost bool

if err := all.Compile(); err != nil {
if err := all.CompileConfig(); err != nil {
return Configs{}, err
}

Expand Down Expand Up @@ -596,7 +605,7 @@ func FromLoadConfigResult(fs afero.Fs, res config.LoadConfigResult) (Configs, er
if err := decodeConfigFromParams(fs, bcfg, mergedConfig, &clone, differentRootKeys); err != nil {
return Configs{}, fmt.Errorf("failed to decode config for language %q: %w", k, err)
}
if err := clone.Compile(); err != nil {
if err := clone.CompileConfig(); err != nil {
return Configs{}, err
}
perLanguage[k] = clone
Expand Down Expand Up @@ -650,259 +659,7 @@ func FromLoadConfigResult(fs afero.Fs, res config.LoadConfigResult) (Configs, er
return cm, nil
}

func decodeConfigFromParams(fs afero.Fs, bcfg config.BaseConfig, cfg maps.Params, all *Config, keys []string) error {
var err error

type decodeWeight struct {
key string
decode func(d decodeWeight) error
weight int
}

allDecoderSetups := map[string]decodeWeight{
"": {
key: "",
weight: -100, // Always first.
decode: func(d decodeWeight) error { return mapstructure.WeakDecode(cfg, &all.RootConfig) },
},
"imaging": {
key: "imaging",
decode: func(d decodeWeight) error {
var err error
all.Imaging, err = images.DecodeConfig(cfg.GetStringMap(d.key))
return err
},
},
"caches": {
key: "caches",
decode: func(d decodeWeight) error {
var err error
all.Caches, err = filecache.DecodeConfig(fs, bcfg, cfg.GetStringMap(d.key))
if all.IgnoreCache {
// Set MaxAge in all caches to 0.
for k, c := range all.Caches {
c.MaxAge = 0
all.Caches[k] = c
}
}
return err
},
},
"build": {
key: "build",
decode: func(d decodeWeight) error {
all.Build = config.DecodeBuildConfig(cfg)
return nil
},
},
"frontmatter": {
key: "frontmatter",
decode: func(d decodeWeight) error {
all.Frontmatter, err = pagemeta.DecodeFrontMatterConfig(cfg)
return err
},
},
"markup": {
key: "markup",
decode: func(d decodeWeight) error {
var err error
all.Markup, err = markup_config.Decode(cfg)
return err
},
},
"server": {
key: "server",
decode: func(d decodeWeight) error {
all.Server, err = config.DecodeServer(cfg)
return err
},
},
"minify": {
key: "minify",
decode: func(d decodeWeight) error {
all.Minify, err = minifiers.DecodeConfig(cfg.Get(d.key))
return err
},
},
"mediaTypes": {
key: "mediaTypes",
decode: func(d decodeWeight) error {
all.MediaTypes, err = media.DecodeTypes2(cfg.GetStringMap(d.key))
return err
},
},
"outputs": {
key: "outputs",
decode: func(d decodeWeight) error {
defaults := createDefaultOutputFormats(all.OutputFormats.Config)
m := cfg.GetStringMap("outputs")
all.Outputs = make(map[string][]string)
for k, v := range m {
s := types.ToStringSlicePreserveString(v)
for i, v := range s {
// TODO1 also do this with the output slice in frontmatter.
s[i] = strings.ToLower(v)
}
all.Outputs[k] = s
}
// Apply defaults.
for k, v := range defaults {
if _, found := all.Outputs[k]; !found {
all.Outputs[k] = v
}
}
return nil
},
},
"outputFormats": {
key: "outputFormats",
decode: func(d decodeWeight) error {
all.OutputFormats, err = output.DecodeConfig(all.MediaTypes.Config, cfg.Get(d.key))
return err
},
},
"params": {
key: "params",
decode: func(d decodeWeight) error {
all.Params = maps.CleanConfigStringMap(cfg.GetStringMap("params"))
if all.Params == nil {
all.Params = make(map[string]any)
}

// Before Hugo 0.112.0 this was configured via site Params.
if mainSections, found := all.Params["mainsections"]; found {
all.MainSections = types.ToStringSlicePreserveString(mainSections)
}

return nil
},
},
"module": {
key: "module",
decode: func(d decodeWeight) error {
all.Module, err = modules.DecodeConfig(cfg)
return err
},
},
"permalinks": {
key: "permalinks",
decode: func(d decodeWeight) error {
all.Permalinks = maps.CleanConfigStringMapString(cfg.GetStringMapString(d.key))
return nil
},
},
"sitemap": {
key: "sitemap",
decode: func(d decodeWeight) error {
var err error
all.Sitemap, err = config.DecodeSitemap(config.SitemapConfig{Priority: -1, Filename: "sitemap.xml"}, cfg.GetStringMap(d.key))
return err
},
},
"taxonomies": {
key: "taxonomies",
decode: func(d decodeWeight) error {
all.Taxonomies = maps.CleanConfigStringMapString(cfg.GetStringMapString(d.key))
return nil
},
},
"related": {
key: "related",
weight: 100, // This needs to be decoded after taxonomies.
decode: func(d decodeWeight) error {
if cfg.IsSet(d.key) {
all.Related, err = related.DecodeConfig(cfg.GetParams(d.key))
if err != nil {
return fmt.Errorf("failed to decode related config: %w", err)
}
} else {
all.Related = related.DefaultConfig
if _, found := all.Taxonomies["tag"]; found {
all.Related.Add(related.IndexConfig{Name: "tags", Weight: 80})
}
}
return nil
},
},
"languages": {
key: "languages",
decode: func(d decodeWeight) error {
all.Languages, err = langs.DecodeConfig(cfg.GetStringMap(d.key))
return err
},
},
"cascade": {
key: "cascade",
decode: func(d decodeWeight) error {
all.Cascade, err = page.DecodeCascadeConfig(cfg.Get(d.key))
return err
},
},
"menus": {
key: "menus",
decode: func(d decodeWeight) error {
all.Menus, err = navigation.DecodeConfig(cfg.Get(d.key))
return err
},
},
"privacy": {
key: "privacy",
decode: func(d decodeWeight) error {
all.Privacy, err = privacy.DecodeConfig(cfg)
return err
},
},
"security": {
key: "security",
decode: func(d decodeWeight) error {
all.Security, err = security.DecodeConfig(cfg)
return err
},
},
"services": {
key: "services",
decode: func(d decodeWeight) error {
all.Services, err = services.DecodeConfig(cfg)
return err
},
},
"author": {
key: "author",
decode: func(d decodeWeight) error {
all.Author = cfg.GetStringMap(d.key)
return nil
},
},
"social": {
key: "social",
decode: func(d decodeWeight) error {
all.Social = cfg.GetStringMapString(d.key)
return nil
},
},
"uglyurls": {
key: "uglyurls",
decode: func(d decodeWeight) error {
v := cfg.Get(d.key)
switch vv := v.(type) {
case bool:
all.UglyURLs = vv
case string:
all.UglyURLs = vv == "true"
default:
all.UglyURLs = cast.ToStringMapBool(v)
}
return nil
},
},
"internal": {
// TODO1 make sure this isn't set from the outside.
key: "internal",
decode: func(d decodeWeight) error {
return mapstructure.WeakDecode(cfg.GetStringMap(d.key), &all.Internal)
},
},
}
func decodeConfigFromParams(fs afero.Fs, bcfg config.BaseConfig, p maps.Params, foo *Config, keys []string) error {

var decoderSetups []decodeWeight

Expand Down Expand Up @@ -930,7 +687,8 @@ func decodeConfigFromParams(fs afero.Fs, bcfg config.BaseConfig, cfg maps.Params
})

for _, v := range decoderSetups {
if err := v.decode(v); err != nil {
p := decodeParams{p: p, c: foo, fs: fs, bcfg: bcfg}
if err := v.decode(v, p); err != nil {
return fmt.Errorf("failed to decode %q: %w", v.key, err)
}
}
Expand Down
Loading

0 comments on commit 102d98d

Please sign in to comment.