hugolib: Fix .Site.LastChange
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 19 Feb 2017 10:15:08 +0000 (11:15 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 19 Feb 2017 12:48:21 +0000 (13:48 +0100)
This commit makes sure that the `.Site.LastChange` is fetched from the latest page modification date.

Previously, this value was fetched from the last page in the default page sort, which may not be the last by date
if weight is set.

Fixes #2909
Closes #2910

hugolib/hugo_sites_build.go
hugolib/site.go
hugolib/site_test.go

index 059b0fe1e74c57e047d433d094b4d88da9768747..2715e8977eb0e028263a211021e9e09c9f90c4c6 100644 (file)
@@ -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 {
index 31a8606f9e2b1633ce82817669e6e2bbb9de971b..a9a150f7e328874188d2bf91c50c0d3247f408f3 100644 (file)
@@ -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
 }
 
index 9629f763a60aed2fc13fa1420cf0bc8eef161930..7919ba377b87ffcbca672316917c2dd09d87bf1f 100644 (file)
@@ -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()