Skip to content

Commit

Permalink
Add --format to hugo config
Browse files Browse the repository at this point in the history
Now default to TOML.
  • Loading branch information
bep committed May 22, 2023
1 parent b6e6438 commit 85b13c1
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 8 deletions.
10 changes: 10 additions & 0 deletions commands/commandeer.go
Expand Up @@ -108,6 +108,9 @@ type rootCommand struct {
buildWatch bool
environment string

// File format to read or write (TOML, YAML, JSON).
format string

// Common build flags.
baseURL string
gc bool
Expand Down Expand Up @@ -405,6 +408,12 @@ func (r *rootCommand) PreRun(cd, runner *simplecobra.Commandeer) error {
if err != nil {
return err
}
switch r.format {
case "json", "toml", "yaml":
// OK
default:
return fmt.Errorf("unsupported format %q; must be one of json, toml or yaml", r.format)
}

loggers.PanicOnWarning.Store(r.panicOnWarning)
r.commonConfigs = lazycache.New[int32, *commonConfig](lazycache.Options{MaxEntries: 5})
Expand Down Expand Up @@ -476,6 +485,7 @@ Complete documentation is available at https://gohugo.io/.`

// Configure persistent flags
cmd.PersistentFlags().StringVarP(&r.source, "source", "s", "", "filesystem path to read files relative from")
cmd.PersistentFlags().StringVar(&r.format, "format", "toml", "preferred file format (toml, yaml or json)")
cmd.PersistentFlags().SetAnnotation("source", cobra.BashCompSubdirsInDir, []string{})
cmd.PersistentFlags().StringP("destination", "d", "", "filesystem path to write files to")
cmd.PersistentFlags().SetAnnotation("destination", cobra.BashCompSubdirsInDir, []string{})
Expand Down
26 changes: 24 additions & 2 deletions commands/config.go
Expand Up @@ -14,9 +14,11 @@
package commands

import (
"bytes"
"context"
"encoding/json"
"os"
"strings"
"time"

"github.com/bep/simplecobra"
Expand Down Expand Up @@ -56,14 +58,34 @@ func (c *configCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, arg
}
config := conf.configs.Base

// Print it as JSON.
dec := json.NewEncoder(os.Stdout)
var buf bytes.Buffer
dec := json.NewEncoder(&buf)
dec.SetIndent("", " ")
dec.SetEscapeHTML(false)

if err := dec.Encode(parser.ReplacingJSONMarshaller{Value: config, KeysToLower: true, OmitEmpty: true}); err != nil {
return err
}

format := strings.ToLower(c.r.format)

switch format {
case "json":
os.Stdout.Write(buf.Bytes())
default:
// Decode the JSON to a map[string]interface{} and then unmarshal it again to the correct format.
var m map[string]interface{}
if err := json.Unmarshal(buf.Bytes(), &m); err != nil {
return err
}
switch format {
case "yaml":
return parser.InterfaceToConfig(m, metadecoders.YAML, os.Stdout)
case "toml":
return parser.InterfaceToConfig(m, metadecoders.TOML, os.Stdout)
}
}

return nil
}

Expand Down
10 changes: 4 additions & 6 deletions commands/new.go
Expand Up @@ -34,9 +34,8 @@ import (

func newNewCommand() *newCommand {
var (
configFormat string
force bool
contentType string
force bool
contentType string
)

var c *newCommand
Expand Down Expand Up @@ -119,7 +118,7 @@ Use ` + "`hugo new [contentPath]`" + ` to create new content.`,
return errors.New(createpath + " already exists and is not empty. See --force.")

case !isEmpty && force:
all := append(dirs, filepath.Join(createpath, "hugo."+configFormat))
all := append(dirs, filepath.Join(createpath, "hugo."+r.format))
for _, path := range all {
if exists, _ := helpers.Exists(path, sourceFs); exists {
return errors.New(path + " already exists")
Expand All @@ -134,7 +133,7 @@ Use ` + "`hugo new [contentPath]`" + ` to create new content.`,
}
}

c.newSiteCreateConfig(sourceFs, createpath, configFormat)
c.newSiteCreateConfig(sourceFs, createpath, r.format)

// Create a default archetype file.
helpers.SafeWriteToDisk(filepath.Join(archeTypePath, "default.md"),
Expand All @@ -146,7 +145,6 @@ Use ` + "`hugo new [contentPath]`" + ` to create new content.`,
return nil
},
withc: func(cmd *cobra.Command) {
cmd.Flags().StringVarP(&configFormat, "format", "f", "toml", "config file format")
cmd.Flags().BoolVar(&force, "force", false, "init inside non-empty directory")
},
},
Expand Down
2 changes: 2 additions & 0 deletions testscripts/commands/config.txt
Expand Up @@ -5,6 +5,8 @@ stdout 'Print the site configuration'


hugo config
stdout 'baseurl = .https://example.com/'
hugo config --format json
stdout '\"baseurl\": \"https://example.com/\",'

hugo config mounts -h
Expand Down

0 comments on commit 85b13c1

Please sign in to comment.