Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-01-17 00:01:13 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-01-17 11:50:48 +0300
commit2655739940d8148ef374248e867b44d87cd63edf (patch)
tree80feed083fac1525d8571dd0aa87c4d304b19c7a
parent348d300a719ae5528997758ebf552691842839b3 (diff)
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
-rw-r--r--hugolib/template_test.go19
-rw-r--r--tpl/collections/apply.go14
2 files changed, 29 insertions, 4 deletions
diff --git a/hugolib/template_test.go b/hugolib/template_test.go
index 2908fdf71..f9d54d8dc 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 86554def1..6eedb4b63 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
}