From 2655739940d8148ef374248e867b44d87cd63edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 16 Jan 2022 22:01:13 +0100 Subject: [PATCH] tpl/collections: Fix apply with namespaced template funcs We changed the signature to `func(...interface{}) (interface{}, error)` some time ago, but sadly we had no test for this for `apply`. Now we do. Fixes #9393 --- hugolib/template_test.go | 19 +++++++++++++++++-- tpl/collections/apply.go | 14 ++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/hugolib/template_test.go b/hugolib/template_test.go index 2908fdf71a1..f9d54d8dc04 100644 --- a/hugolib/template_test.go +++ b/hugolib/template_test.go @@ -460,7 +460,6 @@ complex: 80: 80 // Issue 7528 func TestPartialWithZeroedArgs(t *testing.T) { - b := newTestSitesBuilder(t) b.WithTemplatesAdded("index.html", ` @@ -483,7 +482,6 @@ X123X X123X X123X `) - } func TestPartialCached(t *testing.T) { @@ -757,3 +755,20 @@ This is single main `, ) } + +// Issue 9393. +func TestApplyWithNamespace(t *testing.T) { + b := newTestSitesBuilder(t) + + b.WithTemplates( + "index.html", ` +{{ $b := slice " a " " b " " c" }} +{{ $a := apply $b "strings.Trim" "." " " }} +a: {{ $a }} +`, + ).WithContent("p1.md", "") + + b.Build(BuildCfg{}) + + b.AssertFileContent("public/index.html", `a: [a b c]`) +} diff --git a/tpl/collections/apply.go b/tpl/collections/apply.go index 86554def1c1..6eedb4b6351 100644 --- a/tpl/collections/apply.go +++ b/tpl/collections/apply.go @@ -111,15 +111,25 @@ func (ns *Namespace) lookupFunc(fname string) (reflect.Value, bool) { ss := strings.SplitN(fname, ".", 2) - // namespace + // Namespace nv, found := ns.lookupFunc(ss[0]) if !found { return reflect.Value{}, false } + fn, ok := nv.Interface().(func(...interface{}) (interface{}, error)) + if !ok { + return reflect.Value{}, false + } + v, err := fn() + if err != nil { + panic(err) + } + nv = reflect.ValueOf(v) + // method m := nv.MethodByName(ss[1]) - // if reflect.DeepEqual(m, reflect.Value{}) { + if m.Kind() == reflect.Invalid { return reflect.Value{}, false }