diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index 059b0fe1e..2715e8977 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -168,7 +168,7 @@ func (h *HugoSites) assemble(config *BuildCfg) error { for _, s := range h.Sites { s.refreshPageCaches() - s.setupPrevNext() + s.setupSitePages() } if err := h.assignMissingTranslations(); err != nil { diff --git a/hugolib/site.go b/hugolib/site.go index 31a8606f9..a9a150f7e 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -821,7 +821,9 @@ func (s *Site) process(config BuildCfg) (err error) { } -func (s *Site) setupPrevNext() { +func (s *Site) setupSitePages() { + var siteLastChange time.Time + for i, page := range s.Pages { if i < len(s.Pages)-1 { page.Next = s.Pages[i+1] @@ -830,7 +832,18 @@ func (s *Site) setupPrevNext() { if i > 0 { page.Prev = s.Pages[i-1] } + + // Determine Site.Info.LastChange + // Note that the logic to determine which date to use for Lastmod + // is already applied, so this is *the* date to use. + // We cannot just pick the last page in the default sort, because + // that may not be ordered by date. + if page.Lastmod.After(siteLastChange) { + siteLastChange = page.Lastmod + } } + + s.Info.LastChange = siteLastChange } func (s *Site) render() (err error) { @@ -1371,8 +1384,6 @@ func (s *Site) buildSiteMeta() (err error) { s.assembleMenus() - s.Info.LastChange = s.Pages[0].Lastmod - return } diff --git a/hugolib/site_test.go b/hugolib/site_test.go index 9629f763a..7919ba377 100644 --- a/hugolib/site_test.go +++ b/hugolib/site_test.go @@ -184,6 +184,23 @@ func TestFutureExpirationRender(t *testing.T) { } } +func TestLastChange(t *testing.T) { + t.Parallel() + + cfg, fs := newTestCfg() + + writeSource(t, fs, filepath.Join("content", "sect/doc1.md"), "---\ntitle: doc1\nweight: 1\ndate: 2014-05-29\n---\n# doc1\n*some content*") + writeSource(t, fs, filepath.Join("content", "sect/doc2.md"), "---\ntitle: doc2\nweight: 2\ndate: 2015-05-29\n---\n# doc2\n*some content*") + writeSource(t, fs, filepath.Join("content", "sect/doc3.md"), "---\ntitle: doc3\nweight: 3\ndate: 2017-05-29\n---\n# doc3\n*some content*") + writeSource(t, fs, filepath.Join("content", "sect/doc4.md"), "---\ntitle: doc4\nweight: 4\ndate: 2016-05-29\n---\n# doc4\n*some content*") + writeSource(t, fs, filepath.Join("content", "sect/doc5.md"), "---\ntitle: doc5\nweight: 3\n---\n# doc5\n*some content*") + + s := buildSingleSite(t, deps.DepsCfg{Fs: fs, Cfg: cfg}, BuildCfg{SkipRender: true}) + + require.False(t, s.Info.LastChange.IsZero(), "Site.LastChange is zero") + require.Equal(t, 2017, s.Info.LastChange.Year(), "Site.LastChange should be set to the page with latest Lastmod (year 2017)") +} + // Issue #957 func TestCrossrefs(t *testing.T) { t.Parallel()