From: Bjørn Erik Pedersen Date: Wed, 19 Aug 2020 07:15:14 +0000 (+0200) Subject: Fail on partials with return when given none or a zero argument X-Git-Tag: v0.75.0~64 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=ae63c2b5c94f68fbabd5dbd821630e747e8959a4;p=brevno-suite%2Fhugo Fail on partials with return when given none or a zero argument We need to make a proper fix for this, but it is better with an error than just silently continue. Fixes #7572 Updates #7528 --- diff --git a/hugolib/template_test.go b/hugolib/template_test.go index a215f09d..6f37b416 100644 --- a/hugolib/template_test.go +++ b/hugolib/template_test.go @@ -424,42 +424,79 @@ Hugo: {{ hugo.Generator }} func TestPartialWithReturn(t *testing.T) { - b := newTestSitesBuilder(t).WithSimpleConfigFile() - - b.WithTemplatesAdded( - "index.html", ` -Test Partials With Return Values: + c := qt.New(t) -add42: 50: {{ partial "add42.tpl" 8 }} -dollarContext: 60: {{ partial "dollarContext.tpl" 18 }} -adder: 70: {{ partial "dict.tpl" (dict "adder" 28) }} -complex: 80: {{ partial "complex.tpl" 38 }} -`, - "partials/add42.tpl", ` + newBuilder := func(t testing.TB) *sitesBuilder { + b := newTestSitesBuilder(t).WithSimpleConfigFile() + b.WithTemplatesAdded( + "partials/add42.tpl", ` {{ $v := add . 42 }} {{ return $v }} `, - "partials/dollarContext.tpl", ` + "partials/dollarContext.tpl", ` {{ $v := add $ 42 }} {{ return $v }} `, - "partials/dict.tpl", ` + "partials/dict.tpl", ` {{ $v := add $.adder 42 }} {{ return $v }} `, - "partials/complex.tpl", ` + "partials/complex.tpl", ` {{ return add . 42 }} +`, "partials/hello.tpl", ` + {{ $v := printf "hello %s" . }} + {{ return $v }} + `, + ) + + return b + + } + + c.Run("Return", func(c *qt.C) { + b := newBuilder(c) + + b.WithTemplatesAdded( + "index.html", ` +Test Partials With Return Values: + +add42: 50: {{ partial "add42.tpl" 8 }} +hello world: {{ partial "hello.tpl" "world" }} +dollarContext: 60: {{ partial "dollarContext.tpl" 18 }} +adder: 70: {{ partial "dict.tpl" (dict "adder" 28) }} +complex: 80: {{ partial "complex.tpl" 38 }} `, - ) + ) - b.CreateSites().Build(BuildCfg{}) + b.CreateSites().Build(BuildCfg{}) - b.AssertFileContent("public/index.html", - "add42: 50: 50", - "dollarContext: 60: 60", - "adder: 70: 70", - "complex: 80: 80", - ) + b.AssertFileContent("public/index.html", ` +add42: 50: 50 +hello world: hello world +dollarContext: 60: 60 +adder: 70: 70 +complex: 80: 80 +`, + ) + + }) + + c.Run("Zero argument", func(c *qt.C) { + b := newBuilder(c) + + b.WithTemplatesAdded( + "index.html", ` +Test Partials With Return Values: + +add42: fail: {{ partial "add42.tpl" 0 }} + +`, + ) + + e := b.CreateSites().BuildE(BuildCfg{}) + b.Assert(e, qt.Not(qt.IsNil)) + + }) } diff --git a/tpl/partials/partials.go b/tpl/partials/partials.go index e03bf471..648a9368 100644 --- a/tpl/partials/partials.go +++ b/tpl/partials/partials.go @@ -25,6 +25,7 @@ import ( "strings" "sync" + "github.com/gohugoio/hugo/common/hreflect" texttemplate "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate" "github.com/gohugoio/hugo/helpers" @@ -93,14 +94,10 @@ func (c *contextWrapper) Set(in interface{}) string { // Else, the rendered output will be returned: // A string if the partial is a text/template, or template.HTML when html/template. func (ns *Namespace) Include(name string, contextList ...interface{}) (interface{}, error) { - if strings.HasPrefix(name, "partials/") { - name = name[8:] - } - var context interface{} + name = strings.TrimPrefix(name, "partials/") - if len(contextList) == 0 { - context = nil - } else { + var context interface{} + if len(contextList) > 0 { context = contextList[0] } @@ -124,6 +121,10 @@ func (ns *Namespace) Include(name string, contextList ...interface{}) (interface var w io.Writer if info.HasReturn { + if !hreflect.IsTruthful(context) { + // TODO(bep) we need to fix this, but it is non-trivial. + return nil, errors.New("partials that returns a value needs a non-zero argument.") + } // Wrap the context sent to the template to capture the return value. // Note that the template is rewritten to make sure that the dot (".") // and the $ variable points to Arg.