Skip to content

Commit

Permalink
Fail on partials with return when given none or a zero argument
Browse files Browse the repository at this point in the history
We need to make a proper fix for this, but it is better with an error than just silently continue.

Fixes #7572
Updates #7528
  • Loading branch information
bep committed Aug 19, 2020
1 parent e627449 commit ae63c2b
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 29 deletions.
81 changes: 59 additions & 22 deletions hugolib/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))

})

}

Expand Down
15 changes: 8 additions & 7 deletions tpl/partials/partials.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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]
}

Expand All @@ -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.
Expand Down

0 comments on commit ae63c2b

Please sign in to comment.