From f0ed91caba9ab962593479e745a0df1a5518c4bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 17 Jul 2024 11:10:46 +0200 Subject: [PATCH] Throw error if resources.PostProcess is used in a deferred template That just doesn't work. See #12655 --- tpl/templates/defer_integration_test.go | 20 ++++++++++++++++++++ tpl/tplimpl/template_ast_transformers.go | 8 +++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/tpl/templates/defer_integration_test.go b/tpl/templates/defer_integration_test.go index 2c2bf0d80c1..8b06e772242 100644 --- a/tpl/templates/defer_integration_test.go +++ b/tpl/templates/defer_integration_test.go @@ -200,3 +200,23 @@ func TestDeferFromContentAdapterShouldFail(t *testing.T) { b.Assert(err, qt.Not(qt.IsNil)) b.Assert(err.Error(), qt.Contains, "error calling Defer: this method cannot be called before the site is fully initialized") } + +func TestDeferPostProcessShouldThrowAnError(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- assets/mytext.txt -- +ABCD. +-- layouts/index.html -- +Home +{{ with (templates.Defer (dict "key" "foo")) }} +{{ $mytext := resources.Get "mytext.txt" | minify | resources.PostProcess }} +{{ end }} + +` + b, err := hugolib.TestE(t, files) + + b.Assert(err, qt.Not(qt.IsNil)) + b.Assert(err.Error(), qt.Contains, "resources.PostProcess cannot be used in a deferred template") +} diff --git a/tpl/tplimpl/template_ast_transformers.go b/tpl/tplimpl/template_ast_transformers.go index ab6cf7b0738..57730f82e6d 100644 --- a/tpl/tplimpl/template_ast_transformers.go +++ b/tpl/tplimpl/template_ast_transformers.go @@ -16,6 +16,7 @@ package tplimpl import ( "errors" "fmt" + "strings" "github.com/gohugoio/hugo/helpers" htmltemplate "github.com/gohugoio/hugo/tpl/internal/go_templates/htmltemplate" @@ -248,7 +249,12 @@ func (c *templateContext) handleDefer(withNode *parse.WithNode) { n := l.Nodes[0].(*parse.ActionNode) inner := withNode.List.CopyList() - innerHash := helpers.MD5String(inner.String()) + s := inner.String() + if strings.Contains(s, "resources.PostProcess") { + c.err = errors.New("resources.PostProcess cannot be used in a deferred template") + return + } + innerHash := helpers.MD5String(s) deferredID := tpl.HugoDeferredTemplatePrefix + innerHash c.deferNodes[deferredID] = inner