]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Fix rebuilds on cascade deletes/renames
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 1 May 2024 08:01:25 +0000 (10:01 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 1 May 2024 15:18:30 +0000 (17:18 +0200)
And also avoid reading sub directories on simple changes to branch `_index.md` files.

Fixes #12449

hugolib/cascade_test.go
hugolib/hugo_sites_build.go
hugolib/page__meta.go
hugolib/pages_capture.go
hugolib/rebuild_test.go

index 8075f190f4e3782b241b203f240f88ff654f7e6a..7a4b6e6be687b553ee2b89142e00f614b6737910 100644 (file)
@@ -329,7 +329,7 @@ cascade:
 
                counters := &buildCounters{}
                b.Build(BuildCfg{testCounters: counters})
-               b.Assert(int(counters.contentRenderCounter.Load()), qt.Equals, 2)
+               b.Assert(int(counters.contentRenderCounter.Load()), qt.Equals, 1)
 
                b.AssertFileContent("public/post/index.html", `Banner: post.jpg|Layout: postlayout|Type: posttype|Content: <p>content edit</p>`)
                b.AssertFileContent("public/post/dir/p1/index.html", `Banner: post.jpg|Layout: postlayout|`)
@@ -672,6 +672,55 @@ S1|p1:|p2:p2|
        })
 }
 
+func TestCascadeEditIssue12449(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+disableKinds = ['sitemap','rss', 'home', 'taxonomy','term']
+disableLiveReload = true
+-- layouts/_default/list.html --
+Title: {{ .Title }}|{{ .Content }}|cascadeparam: {{ .Params.cascadeparam }}|
+-- layouts/_default/single.html --
+Title: {{ .Title }}|{{ .Content }}|cascadeparam: {{ .Params.cascadeparam }}|
+-- content/mysect/_index.md --
+---
+title: mysect
+cascade:
+  description: descriptionvalue
+  params:
+    cascadeparam: cascadeparamvalue
+---
+mysect-content|
+-- content/mysect/p1/index.md --
+---
+slug: p1
+---
+p1-content|
+-- content/mysect/subsect/_index.md --
+---
+slug: subsect
+---
+subsect-content|
+`
+
+       b := TestRunning(t, files)
+
+       // Make the cascade set the title.
+       b.EditFileReplaceAll("content/mysect/_index.md", "description: descriptionvalue", "title: cascadetitle").Build()
+       b.AssertFileContent("public/mysect/subsect/index.html", "Title: cascadetitle|")
+
+       // Edit cascade title.
+       b.EditFileReplaceAll("content/mysect/_index.md", "title: cascadetitle", "title: cascadetitle-edit").Build()
+       b.AssertFileContent("public/mysect/subsect/index.html", "Title: cascadetitle-edit|")
+
+       // Revert title change.
+       // The step below failed in #12449.
+       b.EditFileReplaceAll("content/mysect/_index.md", "title: cascadetitle-edit", "description: descriptionvalue").Build()
+       b.AssertFileContent("public/mysect/subsect/index.html", "Title: |")
+}
+
 // Issue 11977.
 func TestCascadeExtensionInPath(t *testing.T) {
        t.Parallel()
index a4546ff44925215557135e97c47089b29fd99385..c96629cd6fdb98337a0c455e986953295e5f17af 100644 (file)
@@ -277,7 +277,7 @@ func (h *HugoSites) assemble(ctx context.Context, l logg.LevelLogger, bcfg *Buil
 
        changes := assembleChanges.Changes()
 
-       // Changes from the assemble step (e.g. lastMod, cascase) needs a re-calculation
+       // Changes from the assemble step (e.g. lastMod, cascade) needs a re-calculation
        // of what needs to be re-built.
        if len(changes) > 0 {
                if err := h.resolveAndClearStateForIdentities(ctx, l, nil, changes); err != nil {
@@ -598,6 +598,10 @@ type pathChange struct {
        isDir bool
 }
 
+func (p pathChange) isStructuralChange() bool {
+       return p.delete || p.isDir
+}
+
 // processPartial prepares the Sites' sources for a partial rebuild.
 func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, config *BuildCfg, init func(config *BuildCfg) error, events []fsnotify.Event) error {
        h.Log.Trace(logg.StringFunc(func() string {
index d8203fe751ff3f82833b5e8c79ce035ae343a080..a88fe528d836e9e81dca825f480f21c9bbe2f3d3 100644 (file)
@@ -74,7 +74,9 @@ type pageMeta struct {
 // Prepare for a rebuild of the data passed in from front matter.
 func (m *pageMeta) setMetaPostPrepareRebuild() {
        params := xmaps.Clone[map[string]any](m.paramsOriginal)
-       m.pageMetaParams.pageConfig.Params = params
+       m.pageMetaParams.pageConfig = &pagemeta.PageConfig{
+               Params: params,
+       }
        m.pageMetaFrontMatter = pageMetaFrontMatter{}
 }
 
@@ -275,6 +277,7 @@ func (p *pageMeta) Weight() int {
 
 func (p *pageMeta) setMetaPre(pi *contentParseInfo, logger loggers.Logger, conf config.AllProvider) error {
        frontmatter := pi.frontMatter
+
        if frontmatter != nil {
                pcfg := p.pageConfig
                if pcfg == nil {
@@ -362,6 +365,7 @@ func (ps *pageState) setMetaPost(cascade map[page.PageMatcher]maps.Params) error
        if ps.m.setMetaPostCount > 1 {
                ps.m.setMetaPostCascadeChanged = cascadeHashPre != identity.HashUint64(ps.m.pageConfig.Cascade)
                if !ps.m.setMetaPostCascadeChanged {
+
                        // No changes, restore any value that may be changed by aggregation.
                        ps.m.pageConfig.Dates = ps.m.datesOriginal
                        return nil
index 231c2efad1545142739aea4d0891bafa11ec4132..1633feb3ed2cae1f0c206afd7515c22d52ca030f 100644 (file)
@@ -147,7 +147,7 @@ func (c *pagesCollector) Collect() (collectErr error) {
                                        false,
                                        func(fim hugofs.FileMetaInfo) bool {
                                                if fim.IsDir() {
-                                                       return true
+                                                       return id.isStructuralChange()
                                                }
                                                fimp := fim.Meta().PathInfo
                                                if fimp == nil {
@@ -160,7 +160,7 @@ func (c *pagesCollector) Collect() (collectErr error) {
                        } else {
                                // We always start from a directory.
                                collectErr = c.collectDir(id.p, id.isDir, func(fim hugofs.FileMetaInfo) bool {
-                                       if id.delete || id.isDir {
+                                       if id.isStructuralChange() {
                                                if id.isDir && fim.Meta().PathInfo.IsLeafBundle() {
                                                        return strings.HasPrefix(fim.Meta().PathInfo.Path(), paths.AddTrailingSlash(id.p.Path()))
                                                }
index a847af3afc95bc0034bd177fe16cdb70a0800f5e..542810b64f6a8cfafafe55d03a2e7c79b10500e0 100644 (file)
@@ -1614,9 +1614,11 @@ p1-content|
 
        b.AssertFileContent("public/index.html", "home-content|")
        b.AssertFileContent("public/p1/index.html", "p1-content|")
+       b.AssertRenderCountPage(3)
 
        b.EditFileReplaceAll("content/_index.md", "home-content", "home-content-foo").Build()
        b.AssertFileContent("public/index.html", "home-content-foo")
+       b.AssertRenderCountPage(2) // Home page rss + html
 
        b.EditFileReplaceAll("content/p1/index.md", "p1-content", "p1-content-foo").Build()
        b.AssertFileContent("public/p1/index.html", "p1-content-foo")