commands: Correctly handle destination and i18n-warnings
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 14 Apr 2018 07:17:30 +0000 (09:17 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 14 Apr 2018 09:32:25 +0000 (11:32 +0200)
And add some more CLI tests.

See #4607

commands/commands_test.go
commands/hugo.go

index 6fabbbb0bcc8f86d93f9d1e8725690f58084d6dd..5173e740942407869bc9fb0aed4a547c92c29224 100644 (file)
@@ -21,6 +21,7 @@ import (
        "testing"
 
        "github.com/spf13/cobra"
+       "github.com/spf13/viper"
 
        "github.com/stretchr/testify/require"
 )
@@ -53,7 +54,24 @@ func TestCommandsPersistentFlags(t *testing.T) {
        tests := []struct {
                args  []string
                check func(command []cmder)
-       }{{[]string{"server", "--config=myconfig.toml", "-b=https://example.com/b/", "--source=mysource"}, func(commands []cmder) {
+       }{{[]string{"server",
+               "--config=myconfig.toml",
+               "--contentDir=mycontent",
+               "--layoutDir=mylayouts",
+               "--theme=mytheme",
+               "--themesDir=mythemes",
+               "--cleanDestinationDir",
+               "--navigateToChanged",
+               "--disableLiveReload",
+               "--noHTTPCache",
+               "--i18n-warnings",
+               "--destination=/tmp/mydestination",
+               "-b=https://example.com/b/",
+               "--port=1366",
+               "--renderToDisk",
+               "--source=mysource",
+               "--uglyURLs"}, func(commands []cmder) {
+               var sc *serverCmd
                for _, command := range commands {
                        if b, ok := command.(commandsBuilderGetter); ok {
                                v := b.getCmmandsBuilder().hugoBuilderCommon
@@ -61,7 +79,32 @@ func TestCommandsPersistentFlags(t *testing.T) {
                                assert.Equal("mysource", v.source)
                                assert.Equal("https://example.com/b/", v.baseURL)
                        }
+
+                       if srvCmd, ok := command.(*serverCmd); ok {
+                               sc = srvCmd
+                       }
                }
+
+               assert.NotNil(sc)
+               assert.True(sc.navigateToChanged)
+               assert.True(sc.disableLiveReload)
+               assert.True(sc.noHTTPCache)
+               assert.True(sc.renderToDisk)
+               assert.Equal(1366, sc.serverPort)
+
+               cfg := viper.New()
+               sc.flagsToConfig(cfg)
+               assert.Equal("/tmp/mydestination", cfg.GetString("publishDir"))
+               assert.Equal("mycontent", cfg.GetString("contentDir"))
+               assert.Equal("mylayouts", cfg.GetString("layoutDir"))
+               assert.Equal("mytheme", cfg.GetString("theme"))
+               assert.Equal("mythemes", cfg.GetString("themesDir"))
+
+               assert.True(cfg.GetBool("uglyURLs"))
+
+               // The flag is named i18n-warnings
+               assert.True(cfg.GetBool("logI18nWarnings"))
+
        }}}
 
        for _, test := range tests {
index 84e265cf24b185a13d5ad9e4852949f8c8444fc6..5c301c7fbfba2797a8ee2ce7dc0747bb96f6b31c 100644 (file)
@@ -200,7 +200,7 @@ func initializeFlags(cmd *cobra.Command, cfg config.Provider) {
                "gc",
                "layoutDir",
                "logFile",
-               "logI18nWarnings",
+               "i18n-warnings",
                "quiet",
                "renderToMemory",
                "source",
@@ -211,12 +211,16 @@ func initializeFlags(cmd *cobra.Command, cfg config.Provider) {
        }
 
        for _, key := range persFlagKeys {
-               setValueFromFlag(cmd.PersistentFlags(), key, cfg)
+               setValueFromFlag(cmd.PersistentFlags(), key, cfg, "")
        }
        for _, key := range flagKeys {
-               setValueFromFlag(cmd.Flags(), key, cfg)
+               setValueFromFlag(cmd.Flags(), key, cfg, "")
        }
 
+       // Set some "config aliases"
+       setValueFromFlag(cmd.Flags(), "destination", cfg, "publishDir")
+       setValueFromFlag(cmd.Flags(), "i18n-warnings", cfg, "logI18nWarnings")
+
 }
 
 var deprecatedFlags = map[string]bool{
@@ -226,7 +230,7 @@ var deprecatedFlags = map[string]bool{
        strings.ToLower("canonifyURLs"):          true,
 }
 
-func setValueFromFlag(flags *flag.FlagSet, key string, cfg config.Provider) {
+func setValueFromFlag(flags *flag.FlagSet, key string, cfg config.Provider, targetKey string) {
        if flags.Changed(key) {
                if _, deprecated := deprecatedFlags[strings.ToLower(key)]; deprecated {
                        msg := fmt.Sprintf(`Set "%s = true" in your config.toml.
@@ -235,7 +239,11 @@ If you need to set this configuration value from the command line, set it via an
                        helpers.Deprecated("hugo", "--"+key+" flag", msg, true)
                }
                f := flags.Lookup(key)
-               cfg.Set(key, f.Value.String())
+               configKey := key
+               if targetKey != "" {
+                       configKey = targetKey
+               }
+               cfg.Set(configKey, f.Value.String())
        }
 }