hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 3e6cb2cb77e16be5b6ddd4ae55d5fc6bfba2d226
parent 8d898ad6672e0ccb62c5a29b6fccab24d980f104
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Fri, 31 May 2019 09:40:58 +0200

hugolib: Fix bundle path when slug is set

Fixes #4870

Diffstat:
Mhugolib/page__paths.go | 16++++++++++++++--
Mhugolib/pagebundler_test.go | 39++++++++++++++++++++++++++++++++++-----
Mhugolib/testhelpers_test.go | 4++++
Mresources/page/page_paths.go | 2++
4 files changed, 54 insertions(+), 7 deletions(-)
diff --git a/hugolib/page__paths.go b/hugolib/page__paths.go
@@ -15,6 +15,9 @@ package hugolib
 
 import (
 	"net/url"
+	"strings"
+
+	"github.com/gohugoio/hugo/helpers"
 
 	"github.com/gohugoio/hugo/resources/page"
 )
@@ -95,8 +98,9 @@ func (l pagePaths) OutputFormats() page.OutputFormats {
 
 func createTargetPathDescriptor(s *Site, p page.Page, pm *pageMeta) (page.TargetPathDescriptor, error) {
 	var (
-		dir      string
-		baseName string
+		dir             string
+		baseName        string
+		contentBaseName string
 	)
 
 	d := s.Deps
@@ -104,6 +108,14 @@ func createTargetPathDescriptor(s *Site, p page.Page, pm *pageMeta) (page.Target
 	if !p.File().IsZero() {
 		dir = p.File().Dir()
 		baseName = p.File().TranslationBaseName()
+		contentBaseName = p.File().ContentBaseName()
+	}
+
+	if baseName != contentBaseName {
+		// See https://github.com/gohugoio/hugo/issues/4870
+		// A leaf bundle
+		dir = strings.TrimSuffix(dir, contentBaseName+helpers.FilePathSeparator)
+		baseName = contentBaseName
 	}
 
 	alwaysInSubDir := p.Kind() == kindSitemap
diff --git a/hugolib/pagebundler_test.go b/hugolib/pagebundler_test.go
@@ -460,7 +460,7 @@ HEADLESS {{< myShort >}}
 	assert.Equal(1, len(s.headlessPages))
 
 	regular := s.getPage(page.KindPage, "a/index")
-	assert.Equal("/a/s1/", regular.RelPermalink())
+	assert.Equal("/s1/", regular.RelPermalink())
 
 	headless := s.getPage(page.KindPage, "b/index")
 	assert.NotNil(headless)
@@ -481,12 +481,12 @@ HEADLESS {{< myShort >}}
 
 	th := testHelper{s.Cfg, s.Fs, t}
 
-	th.assertFileContent(filepath.FromSlash(workDir+"/public/a/s1/index.html"), "TheContent")
-	th.assertFileContent(filepath.FromSlash(workDir+"/public/a/s1/l1.png"), "PNG")
+	th.assertFileContent(filepath.FromSlash(workDir+"/public/s1/index.html"), "TheContent")
+	th.assertFileContent(filepath.FromSlash(workDir+"/public/s1/l1.png"), "PNG")
 
-	th.assertFileNotExist(workDir + "/public/b/s2/index.html")
+	th.assertFileNotExist(workDir + "/public/s2/index.html")
 	// But the bundled resources needs to be published
-	th.assertFileContent(filepath.FromSlash(workDir+"/public/b/s2/l1.png"), "PNG")
+	th.assertFileContent(filepath.FromSlash(workDir+"/public/s2/l1.png"), "PNG")
 
 }
 
@@ -942,3 +942,32 @@ date: 2017-01-15
 	b.AssertFileContent("public/mybundle/data.json", "My changed data")
 
 }
+
+// https://github.com/gohugoio/hugo/issues/4870
+func TestBundleSlug(t *testing.T) {
+	t.Parallel()
+	assert := require.New(t)
+
+	const pageTemplate = `---
+title: Title
+slug: %s
+---
+`
+
+	b := newTestSitesBuilder(t)
+
+	b.WithTemplatesAdded("index.html", `{{ range .Site.RegularPages }}|{{ .RelPermalink }}{{ end }}|`)
+	b.WithSimpleConfigFile().
+		WithContent("about/services1/misc.md", fmt.Sprintf(pageTemplate, "this-is-the-slug")).
+		WithContent("about/services2/misc/index.md", fmt.Sprintf(pageTemplate, "this-is-another-slug"))
+
+	b.CreateSites().Build(BuildCfg{})
+
+	b.AssertHome(
+		"|/about/services1/this-is-the-slug/|/",
+		"|/about/services2/this-is-another-slug/|")
+
+	assert.True(b.CheckExists("public/about/services1/this-is-the-slug/index.html"))
+	assert.True(b.CheckExists("public/about/services2/this-is-another-slug/index.html"))
+
+}
diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go
@@ -549,6 +549,10 @@ func (s *sitesBuilder) AssertFileContentFn(filename string, f func(s string) boo
 	}
 }
 
+func (s *sitesBuilder) AssertHome(matches ...string) {
+	s.AssertFileContent("public/index.html", matches...)
+}
+
 func (s *sitesBuilder) AssertFileContent(filename string, matches ...string) {
 	content := s.FileContent(filename)
 	for _, match := range matches {
diff --git a/resources/page/page_paths.go b/resources/page/page_paths.go
@@ -221,6 +221,8 @@ func CreateTargetPaths(d TargetPathDescriptor) (tp TargetPaths) {
 
 		link = pagePath
 
+		// TODO(bep) this should not happen after the fix in https://github.com/gohugoio/hugo/issues/4870
+		// but we may need some more testing before we can remove it.
 		if baseNameSameAsType {
 			link = strings.TrimSuffix(link, d.BaseName)
 		}