Skip to content

Commit

Permalink
hugolib: Fix output formats override when no outputs definition given
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bep committed May 17, 2017
1 parent 94b5be6 commit 6e2f2dd
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 8 deletions.
16 changes: 9 additions & 7 deletions hugolib/site_output.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -64,29 +64,31 @@ 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)
// RSS has now a well defined media type, so strip any suffix provided
rssBase = strings.TrimSuffix(rssBase, path.Ext(rssBase))
}

rssType.BaseName = rssBase
formats = append(formats, rssType)
rssOut.BaseName = rssBase
formats = append(formats, rssOut)

}

Expand Down
56 changes: 55 additions & 1 deletion hugolib/site_output_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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) {
Expand Down Expand Up @@ -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")

}

0 comments on commit 6e2f2dd

Please sign in to comment.