hugolib: Fix bundle header clone logic
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 31 Jul 2019 10:31:31 +0000 (12:31 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 31 Jul 2019 12:20:24 +0000 (14:20 +0200)
Fixes #6136

hugolib/pagebundler_test.go
hugolib/pages_capture.go

index f5a6d9a84e3fd0d50b8c7ae6730f2110468524b4..5c21dc4725d8b164919cbae381e8c5940980f6fd 100644 (file)
@@ -1075,3 +1075,84 @@ slug: leaf
                filepath.FromSlash("section|sect1/sect2/_index.md|CurrentSection: sect1/sect2/_index.md"))
 
 }
+
+// Issue 6136
+func TestPageBundlerPartialTranslations(t *testing.T) {
+       config := `
+baseURL = "https://example.org"
+defaultContentLanguage = "en"
+defaultContentLanguageInSubDir = true
+disableKinds = ["taxonomyTerm", "taxonomy"]
+
+[languages]
+[languages.nn]
+languageName = "Nynorsk"
+weight = 2
+title = "Tittel på Nynorsk"
+
+[languages.en]
+title = "Title in English"
+languageName = "English"
+weight = 1
+
+`
+
+       pageContent := func(id string) string {
+               return fmt.Sprintf(`
+---
+title: %q
+---
+`, id)
+       }
+
+       dataContent := func(id string) string {
+               return id
+       }
+
+       b := newTestSitesBuilder(t).WithConfigFile("toml", config)
+
+       b.WithContent("blog/sect1/_index.nn.md", pageContent("s1.nn"))
+       b.WithContent("blog/sect1/data.json", dataContent("s1.data"))
+
+       b.WithContent("blog/sect1/b1/index.nn.md", pageContent("s1.b1.nn"))
+       b.WithContent("blog/sect1/b1/data.json", dataContent("s1.b1.data"))
+
+       b.WithContent("blog/sect2/_index.md", pageContent("s2"))
+       b.WithContent("blog/sect2/data.json", dataContent("s2.data"))
+
+       b.WithContent("blog/sect2/b1/index.md", pageContent("s2.b1"))
+       b.WithContent("blog/sect2/b1/data.json", dataContent("s2.b1.data"))
+
+       b.WithContent("blog/sect2/b2/index.md", pageContent("s2.b2"))
+       b.WithContent("blog/sect2/b2/bp.md", pageContent("s2.b2.bundlecontent"))
+
+       b.WithContent("blog/sect2/b3/index.md", pageContent("s2.b3"))
+       b.WithContent("blog/sect2/b3/bp.nn.md", pageContent("s2.b3.bundlecontent.nn"))
+
+       b.WithContent("blog/sect2/b4/index.nn.md", pageContent("s2.b4"))
+       b.WithContent("blog/sect2/b4/bp.nn.md", pageContent("s2.b4.bundlecontent.nn"))
+
+       b.WithTemplates("index.html", `
+Num Pages: {{ len .Site.Pages }}
+{{ range .Site.Pages }}
+{{ .Kind }}|{{ .RelPermalink }}|Content: {{ .Title }}|Resources: {{ range .Resources }}R: {{ .Title }}|{{ .Content }}|{{ end -}}
+{{ end }}
+`)
+
+       b.Build(BuildCfg{})
+
+       b.AssertFileContent("public/nn/index.html",
+               "Num Pages: 6",
+               "page|/nn/blog/sect1/b1/|Content: s1.b1.nn|Resources: R: data.json|s1.b1.data|",
+               "page|/nn/blog/sect2/b3/|Content: s2.b3|Resources: R: s2.b3.bundlecontent.nn|",
+               "page|/nn/blog/sect2/b4/|Content: s2.b4|Resources: R: s2.b4.bundlecontent.nn",
+       )
+
+       b.AssertFileContent("public/en/index.html",
+               "Num Pages: 6",
+               "section|/en/blog/sect2/|Content: s2|Resources: R: data.json|s2.data|",
+               "page|/en/blog/sect2/b1/|Content: s2.b1|Resources: R: data.json|s2.b1.data|",
+               "page|/en/blog/sect2/b2/|Content: s2.b2|Resources: R: s2.b2.bundlecontent|",
+       )
+
+}
index 09493379325749b06a7f4003b5e1920175a28b60..361b87e84c3933084bd8e85abec4c44af4eba456 100644 (file)
@@ -344,7 +344,7 @@ func (c *pagesCollector) addToBundle(info hugofs.FileMetaInfo, btyp bundleDirTyp
        }
 
        cloneBundle := func(lang string) *fileinfoBundle {
-               // Every bundled file needs a content file header.
+               // Every bundled content file needs a content file header.
                // Use the default content language if found, else just
                // pick one.
                var (
@@ -376,6 +376,7 @@ func (c *pagesCollector) addToBundle(info hugofs.FileMetaInfo, btyp bundleDirTyp
        bundle := getBundle(lang)
        isBundleHeader := c.isBundleHeader(info)
        classifier := info.Meta().Classifier()
+       isContent := classifier == files.ContentClassContent
        if bundle == nil {
                if isBundleHeader {
                        bundle = &fileinfoBundle{header: info}
@@ -384,28 +385,32 @@ func (c *pagesCollector) addToBundle(info hugofs.FileMetaInfo, btyp bundleDirTyp
                        if btyp == bundleBranch {
                                // No special logic for branch bundles.
                                // Every language needs its own _index.md file.
+                               // Also, we only clone bundle headers for lonsesome, bundled,
+                               // content files.
                                return c.handleFiles(info)
                        }
 
-                       bundle = cloneBundle(lang)
-                       bundles[lang] = bundle
+                       if isContent {
+                               bundle = cloneBundle(lang)
+                               bundles[lang] = bundle
+                       }
                }
        }
 
-       if !isBundleHeader {
+       if !isBundleHeader && bundle != nil {
                bundle.resources = append(bundle.resources, info)
        }
 
        if classifier == files.ContentClassFile {
                translations := info.Meta().Translations()
-               if len(translations) < len(bundles) {
-                       for lang, b := range bundles {
-                               if !stringSliceContains(lang, translations...) && !b.containsResource(info.Name()) {
-                                       // Clone and add it to the bundle.
-                                       clone := c.cloneFileInfo(info)
-                                       clone.Meta()["lang"] = lang
-                                       b.resources = append(b.resources, clone)
-                               }
+
+               for lang, b := range bundles {
+                       if !stringSliceContains(lang, translations...) && !b.containsResource(info.Name()) {
+
+                               // Clone and add it to the bundle.
+                               clone := c.cloneFileInfo(info)
+                               clone.Meta()["lang"] = lang
+                               b.resources = append(b.resources, clone)
                        }
                }
        }