]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Add --format to hugo config
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 22 May 2023 17:00:07 +0000 (19:00 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 22 May 2023 18:26:02 +0000 (20:26 +0200)
Now default to TOML.

commands/commandeer.go
commands/config.go
commands/new.go
testscripts/commands/config.txt

index 8e8522b28528edc1b6851abda74c35e57865fa4a..912a55780ec0121b181408da52b8c372981f3b30 100644 (file)
@@ -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
@@ -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})
@@ -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{})
index 80b869a287e17b01f86e62d5abfe77fd2fa4e085..ce3ad04fa748d34990b9771cd8b493de59a11f94 100644 (file)
 package commands
 
 import (
+       "bytes"
        "context"
        "encoding/json"
        "os"
+       "strings"
        "time"
 
        "github.com/bep/simplecobra"
@@ -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
 }
 
index 5a940a1cdc70b03137dfca8b302716376d67351d..c3ba091625c8b95b8010d4b90904477d19714802 100644 (file)
@@ -34,9 +34,8 @@ import (
 
 func newNewCommand() *newCommand {
        var (
-               configFormat string
-               force        bool
-               contentType  string
+               force       bool
+               contentType string
        )
 
        var c *newCommand
@@ -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")
@@ -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"),
@@ -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")
                                },
                        },
index 7f8fc49749533358fccc3e8d8ffd100c86159213..b1dba8d1173b167020b3cab4ee5b77deac48f3f2 100644 (file)
@@ -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