diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index 0a9063e23..e3b29f186 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -1428,7 +1428,7 @@ func (sa *sitePagesAssembler) applyAggregates() error { } if wasZeroDates { - pageBundle.m.pageConfig.Dates.UpdateDateAndLastmodIfAfter(sp.m.pageConfig.Dates) + pageBundle.m.pageConfig.Dates.UpdateDateAndLastmodAndPublishDateIfAfter(sp.m.pageConfig.Dates) } if pageBundle.IsHome() { @@ -1565,7 +1565,7 @@ func (sa *sitePagesAssembler) applyAggregatesToTaxonomiesAndTerms() error { return } - p.m.pageConfig.Dates.UpdateDateAndLastmodIfAfter(sp.m.pageConfig.Dates) + p.m.pageConfig.Dates.UpdateDateAndLastmodAndPublishDateIfAfter(sp.m.pageConfig.Dates) }) } diff --git a/hugolib/dates_test.go b/hugolib/dates_test.go index 784fc101c..1a88cfd7d 100644 --- a/hugolib/dates_test.go +++ b/hugolib/dates_test.go @@ -266,3 +266,86 @@ Home's Date should be equal mydata date: true Full time: 6:00:00 am UTC `) } + +func TestPublisDateRollupIssue12438(t *testing.T) { + t.Parallel() + + // To future Hugo maintainers, this test will start to fail in 2099. + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','sitemap'] +[taxonomies] +tag = 'tags' +-- layouts/_default/list.html -- +Date: {{ .Date.Format "2006-01-02" }} +PublishDate: {{ .PublishDate.Format "2006-01-02" }} +Lastmod: {{ .Lastmod.Format "2006-01-02" }} +-- layouts/_default/single.html -- +{{ .Title }} +-- content/s1/p1.md -- +--- +title: p1 +date: 2024-03-01 +lastmod: 2024-03-02 +tags: [t1] +--- +-- content/s1/p2.md -- +--- +title: p2 +date: 2024-04-03 +lastmod: 2024-04-04 +tags: [t1] +--- +-- content/s1/p3.md -- +--- +title: p3 +lastmod: 2099-05-06 +tags: [t1] +--- + +` + + // Test without publishDate in front matter. + b := Test(t, files) + + b.AssertFileContent("public/s1/index.html", ` + Date: 2099-05-06 + PublishDate: 2024-04-03 + Lastmod: 2099-05-06 + `) + + b.AssertFileContent("public/tags/index.html", ` + Date: 2024-04-03 + PublishDate: 2024-04-03 + Lastmod: 2024-04-04 + `) + + b.AssertFileContent("public/tags/t1/index.html", ` + Date: 2024-04-03 + PublishDate: 2024-04-03 + Lastmod: 2024-04-04 + `) + + // Test with publishDate in front matter. + files = strings.ReplaceAll(files, "lastmod", "publishDate") + + b = Test(t, files) + + b.AssertFileContent("public/s1/index.html", ` + Date: 2099-05-06 + PublishDate: 2024-04-04 + Lastmod: 2099-05-06 + `) + + b.AssertFileContent("public/tags/index.html", ` + Date: 2024-04-03 + PublishDate: 2024-04-04 + Lastmod: 2024-04-03 + `) + + b.AssertFileContent("public/tags/t1/index.html", ` + Date: 2024-04-03 + PublishDate: 2024-04-04 + Lastmod: 2024-04-03 + `) +} diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index c901ab57b..0e0650934 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -57,13 +57,17 @@ func (d Dates) IsDateOrLastModAfter(in Dates) bool { return d.Date.After(in.Date) || d.Lastmod.After(in.Lastmod) } -func (d *Dates) UpdateDateAndLastmodIfAfter(in Dates) { +func (d *Dates) UpdateDateAndLastmodAndPublishDateIfAfter(in Dates) { if in.Date.After(d.Date) { d.Date = in.Date } if in.Lastmod.After(d.Lastmod) { d.Lastmod = in.Lastmod } + + if in.PublishDate.After(d.PublishDate) && in.PublishDate.Before(htime.Now()) { + d.PublishDate = in.PublishDate + } } func (d Dates) IsAllDatesZero() bool {