Repository: gohugoio/hugo (language: go)

Issue:
Check "term is empty" for unused terms
See https://discourse.gohugo.io/t/error-calling-data-term-is-empty-when-using-content-adapter-to-populate-tags/52457


Discussion / hints:

Fix patch:
diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go
index 8c9e4a31a2f..a336c848995 100644
--- a/hugolib/content_map_page.go
+++ b/hugolib/content_map_page.go
@@ -1595,6 +1595,10 @@ func (sa *sitePagesAssembler) applyAggregatesToTaxonomiesAndTerms() error {
 }
 
 func (sa *sitePagesAssembler) assembleTermsAndTranslations() error {
+	if sa.pageMap.cfg.taxonomyTermDisabled {
+		return nil
+	}
+
 	var (
 		pages   = sa.pageMap.treePages
 		entries = sa.pageMap.treeTaxonomyEntries
@@ -1612,10 +1616,6 @@ func (sa *sitePagesAssembler) assembleTermsAndTranslations() error {
 				return false, nil
 			}
 
-			if sa.pageMap.cfg.taxonomyTermDisabled {
-				return false, nil
-			}
-
 			for _, viewName := range views {
 				vals := types.ToStringSlicePreserveString(getParam(ps, viewName.plural, false))
 				if vals == nil {
@@ -1674,6 +1674,7 @@ func (sa *sitePagesAssembler) assembleTermsAndTranslations() error {
 					})
 				}
 			}
+
 			return false, nil
 		},
 	}
diff --git a/hugolib/page__new.go b/hugolib/page__new.go
index 91bfe5e3239..7d948ef5882 100644
--- a/hugolib/page__new.go
+++ b/hugolib/page__new.go
@@ -15,6 +15,7 @@ package hugolib
 
 import (
 	"fmt"
+	"strings"
 	"sync"
 	"sync/atomic"
 
@@ -140,6 +141,7 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) {
 			}
 		}
 
+		var tc viewName
 		// Identify Page Kind.
 		if m.pageConfig.Kind == "" {
 			m.pageConfig.Kind = kinds.KindSection
@@ -147,16 +149,13 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) {
 				m.pageConfig.Kind = kinds.KindHome
 			} else if m.pathInfo.IsBranchBundle() {
 				// A section, taxonomy or term.
-				tc := m.s.pageMap.cfg.getTaxonomyConfig(m.Path())
+				tc = m.s.pageMap.cfg.getTaxonomyConfig(m.Path())
 				if !tc.IsZero() {
 					// Either a taxonomy or a term.
 					if tc.pluralTreeKey == m.Path() {
 						m.pageConfig.Kind = kinds.KindTaxonomy
-						m.singular = tc.singular
 					} else {
 						m.pageConfig.Kind = kinds.KindTerm
-						m.term = m.pathInfo.Unnormalized().BaseNameNoIdentifier()
-						m.singular = tc.singular
 					}
 				}
 			} else if m.f != nil {
@@ -164,6 +163,19 @@ func (h *HugoSites) doNewPage(m *pageMeta) (*pageState, *paths.Path, error) {
 			}
 		}
 
+		if m.pageConfig.Kind == kinds.KindTerm || m.pageConfig.Kind == kinds.KindTaxonomy {
+			if tc.IsZero() {
+				tc = m.s.pageMap.cfg.getTaxonomyConfig(m.Path())
+			}
+			if tc.IsZero() {
+				return nil, fmt.Errorf("no taxonomy configuration found for %q", m.Path())
+			}
+			m.singular = tc.singular
+			if m.pageConfig.Kind == kinds.KindTerm {
+				m.term = paths.TrimLeading(strings.TrimPrefix(m.pathInfo.Unnormalized().Base(), tc.pluralTreeKey))
+			}
+		}
+
 		if m.pageConfig.Kind == kinds.KindPage && !m.s.conf.IsKindEnabled(m.pageConfig.Kind) {
 			return nil, nil
 		}


Test patch:
diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go
index a4cf4dcff24..b033aad2b65 100644
--- a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go
+++ b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go
@@ -678,3 +678,33 @@ summary: {{ .Summary }}|content: {{ .Content}}
 		"<p>aaa</p>|content: <p>aaa</p>\n<p>bbb</p>",
 	)
 }
+
+// Issue 13063.
+func TestPagesFromGoTmplTermIsEmpty(t *testing.T) {
+	t.Parallel()
+
+	files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+disableKinds = ['section', 'home', 'rss','sitemap']
+printPathWarnings = true
+[taxonomies]
+tag = "tags"
+-- content/mypost.md --
+---
+title: "My Post"
+tags: ["mytag"]
+---
+-- content/tags/_content.gotmpl --
+{{ .AddPage (dict "path" "mothertag" "title" "My title" "kind" "term") }}
+--
+-- layouts/_default/taxonomy.html --
+Terms: {{ range .Data.Terms.ByCount }}{{ .Name }}: {{ .Count }}|{{ end }}§s
+-- layouts/_default/single.html --
+Single.
+`
+
+	b := hugolib.Test(t, files, hugolib.TestOptWarn())
+
+	b.AssertFileContent("public/tags/index.html", "Terms: mytag: 1|§s")
+}