From 6e2f2dd8d3ca61c92a2ee8824fbf05cadef08425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 17 May 2017 18:04:07 +0300 Subject: [PATCH] hugolib: Fix output formats override when no outputs definition given 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 | 16 ++++++----- hugolib/site_output_test.go | 56 ++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/hugolib/site_output.go b/hugolib/site_output.go index 684ff2e73..6b72ea9b6 100644 --- a/hugolib/site_output.go +++ b/hugolib/site_output.go @@ -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) } diff --git a/hugolib/site_output_test.go b/hugolib/site_output_test.go index 2935f3257..d57173630 100644 --- a/hugolib/site_output_test.go +++ b/hugolib/site_output_test.go @@ -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") + +}