hugolib: Fix output formats override when no outputs definition given
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 17 May 2017 15:04:07 +0000 (18:04 +0300)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 17 May 2017 16:00:15 +0000 (19:00 +0300)
A common use case for this is to redefine the built-in output format `RSS` to give it a different URL.

Before this commit, that was not possible without also providing an `outputs` definition.

Fixes #3447

hugolib/site_output.go
hugolib/site_output_test.go

index 684ff2e73d1f7dc2932d2ce90e857ca6585f4f4c..6b72ea9b64e3b3a67bbdd24b22fbd5998c1c71e3 100644 (file)
@@ -26,7 +26,7 @@ import (
 
 func createSiteOutputFormats(allFormats output.Formats, cfg config.Provider) (map[string]output.Formats, error) {
        if !cfg.IsSet("outputs") {
-               return createDefaultOutputFormats(cfg)
+               return createDefaultOutputFormats(allFormats, cfg)
        }
 
        outFormats := make(map[string]output.Formats)
@@ -64,20 +64,22 @@ func createSiteOutputFormats(allFormats output.Formats, cfg config.Provider) (ma
 
 }
 
-func createDefaultOutputFormats(cfg config.Provider) (map[string]output.Formats, error) {
+func createDefaultOutputFormats(allFormats output.Formats, cfg config.Provider) (map[string]output.Formats, error) {
        outFormats := make(map[string]output.Formats)
+       rssOut, _ := allFormats.GetByName(output.RSSFormat.Name)
+       htmlOut, _ := allFormats.GetByName(output.HTMLFormat.Name)
+
        for _, kind := range allKinds {
                var formats output.Formats
                // All have HTML
-               formats = append(formats, output.HTMLFormat)
+               formats = append(formats, htmlOut)
 
                // All but page have RSS
                if kind != KindPage {
-                       rssType := output.RSSFormat
 
                        rssBase := cfg.GetString("rssURI")
                        if rssBase == "" || rssBase == "index.xml" {
-                               rssBase = rssType.BaseName
+                               rssBase = rssOut.BaseName
                        } else {
                                // Remove in Hugo 0.22.
                                helpers.Deprecated("Site config", "rssURI", "Set baseName in outputFormats.RSS", false)
@@ -85,8 +87,8 @@ func createDefaultOutputFormats(cfg config.Provider) (map[string]output.Formats,
                                rssBase = strings.TrimSuffix(rssBase, path.Ext(rssBase))
                        }
 
-                       rssType.BaseName = rssBase
-                       formats = append(formats, rssType)
+                       rssOut.BaseName = rssBase
+                       formats = append(formats, rssOut)
 
                }
 
index 2935f32576166815f0ca6d2208c1620f2a380d54..d57173630e57b89dd2f8f049b3106b626421ac80 100644 (file)
@@ -31,7 +31,7 @@ import (
 
 func TestDefaultOutputFormats(t *testing.T) {
        t.Parallel()
-       defs, err := createDefaultOutputFormats(viper.New())
+       defs, err := createDefaultOutputFormats(output.DefaultFormats, viper.New())
 
        require.NoError(t, err)
 
@@ -53,6 +53,30 @@ func TestDefaultOutputFormats(t *testing.T) {
        }
 }
 
+func TestDefaultOutputFormatsWithOverrides(t *testing.T) {
+       t.Parallel()
+
+       htmlOut := output.HTMLFormat
+       htmlOut.BaseName = "htmlindex"
+       rssOut := output.RSSFormat
+       rssOut.BaseName = "feed"
+
+       defs, err := createDefaultOutputFormats(output.Formats{htmlOut, rssOut}, viper.New())
+
+       homeDefs := defs[KindHome]
+
+       rss, found := homeDefs.GetByName("RSS")
+       require.True(t, found)
+       require.Equal(t, rss.BaseName, "feed")
+
+       html, found := homeDefs.GetByName("HTML")
+       require.True(t, found)
+       require.Equal(t, html.BaseName, "htmlindex")
+
+       require.NoError(t, err)
+
+}
+
 func TestSiteWithPageOutputs(t *testing.T) {
        for _, outputs := range [][]string{{"html", "json", "calendar"}, {"json"}} {
                t.Run(fmt.Sprintf("%v", outputs), func(t *testing.T) {
@@ -231,3 +255,33 @@ Content: {{ .Content }}
        }
 
 }
+
+// Issue #3447
+func TestRedefineRSSOutputFormat(t *testing.T) {
+       siteConfig := `
+baseURL = "http://example.com/blog"
+
+paginate = 1
+defaultContentLanguage = "en"
+
+disableKinds = ["page", "section", "taxonomy", "taxonomyTerm", "sitemap", "robotsTXT", "404"]
+
+[outputFormats]
+[outputFormats.RSS]
+mediatype = "application/rss"
+baseName = "feed"
+
+`
+
+       mf := afero.NewMemMapFs()
+       writeToFs(t, mf, "content/foo.html", `foo`)
+
+       th, h := newTestSitesFromConfig(t, mf, siteConfig)
+
+       err := h.Build(BuildCfg{})
+
+       require.NoError(t, err)
+
+       th.assertFileContent("public/feed.xml", "Recent content on")
+
+}