hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 6c70e1f22f365322d5f754302e110c9ed716b215
parent 4d221ce468a1209ee9dd6cbece9d1273dad6a29b
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Sun,  1 Aug 2021 12:50:37 +0200

Fix error handling for the time func alias

Fixes #8835

Diffstat:
Mhugolib/dates_test.go | 11+++++++++++
Mtpl/cast/init.go | 2+-
Mtpl/cast/init_test.go | 4+++-
Mtpl/collections/init.go | 2+-
Mtpl/collections/init_test.go | 4+++-
Mtpl/compare/init.go | 2+-
Mtpl/compare/init_test.go | 4+++-
Mtpl/crypto/init.go | 2+-
Mtpl/crypto/init_test.go | 4+++-
Mtpl/data/init.go | 2+-
Mtpl/data/init_test.go | 4+++-
Mtpl/debug/init.go | 2+-
Mtpl/debug/init_test.go | 4+++-
Mtpl/encoding/init.go | 2+-
Mtpl/encoding/init_test.go | 4+++-
Mtpl/fmt/init.go | 2+-
Mtpl/fmt/init_test.go | 4+++-
Mtpl/hugo/init.go | 2+-
Mtpl/hugo/init_test.go | 4+++-
Mtpl/images/init.go | 2+-
Mtpl/images/init_test.go | 4+++-
Mtpl/inflect/init.go | 2+-
Mtpl/inflect/init_test.go | 4+++-
Mtpl/internal/templatefuncsRegistry.go | 7+++++--
Mtpl/js/init.go | 2+-
Mtpl/lang/init.go | 2+-
Mtpl/lang/init_test.go | 4+++-
Mtpl/math/init.go | 2+-
Mtpl/math/init_test.go | 4+++-
Mtpl/openapi/openapi3/init.go | 2+-
Mtpl/os/init.go | 2+-
Mtpl/os/init_test.go | 4+++-
Mtpl/partials/init.go | 2+-
Mtpl/partials/init_test.go | 4+++-
Mtpl/path/init.go | 2+-
Mtpl/path/init_test.go | 4+++-
Mtpl/reflect/init.go | 2+-
Mtpl/reflect/init_test.go | 4+++-
Mtpl/resources/init.go | 2+-
Mtpl/safe/init.go | 2+-
Mtpl/safe/init_test.go | 4+++-
Mtpl/site/init.go | 2+-
Mtpl/site/init_test.go | 4+++-
Mtpl/strings/init.go | 2+-
Mtpl/strings/init_test.go | 4+++-
Mtpl/templates/init.go | 2+-
Mtpl/templates/init_test.go | 4+++-
Mtpl/time/init.go | 20+++++++-------------
Mtpl/time/init_test.go | 4+++-
Mtpl/transform/init.go | 2+-
Mtpl/transform/init_test.go | 4+++-
Mtpl/urls/init.go | 2+-
Mtpl/urls/init_test.go | 5++++-
53 files changed, 122 insertions(+), 65 deletions(-)
diff --git a/hugolib/dates_test.go b/hugolib/dates_test.go
@@ -203,3 +203,14 @@ timeZone = "America/LosAngeles"   # Should be America/Los_Angeles
 	b.Assert(err, qt.Not(qt.IsNil))
 	b.Assert(err.Error(), qt.Contains, `failed to load config: invalid timeZone for language "en": unknown time zone America/LosAngeles`)
 }
+
+// Issue 8835
+func TestTimeOnError(t *testing.T) {
+	b := newTestSitesBuilder(t)
+
+	b.WithTemplates("index.html", `time: {{ time "2020-10-20" "invalid-timezone" }}`)
+	b.WithContent("p1.md", "")
+
+	b.Assert(b.BuildE(BuildCfg{}), qt.Not(qt.IsNil))
+
+}
diff --git a/tpl/cast/init.go b/tpl/cast/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.ToInt,
diff --git a/tpl/cast/init_test.go b/tpl/cast/init_test.go
@@ -37,5 +37,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/collections/init.go b/tpl/collections/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.After,
diff --git a/tpl/collections/init_test.go b/tpl/collections/init_test.go
@@ -37,5 +37,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/compare/init.go b/tpl/compare/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Default,
diff --git a/tpl/compare/init_test.go b/tpl/compare/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/crypto/init.go b/tpl/crypto/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.MD5,
diff --git a/tpl/crypto/init_test.go b/tpl/crypto/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/data/init.go b/tpl/data/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.GetCSV,
diff --git a/tpl/data/init_test.go b/tpl/data/init_test.go
@@ -41,5 +41,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/debug/init.go b/tpl/debug/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Dump,
diff --git a/tpl/debug/init_test.go b/tpl/debug/init_test.go
@@ -38,5 +38,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/encoding/init.go b/tpl/encoding/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Base64Decode,
diff --git a/tpl/encoding/init_test.go b/tpl/encoding/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/fmt/init.go b/tpl/fmt/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Print,
diff --git a/tpl/fmt/init_test.go b/tpl/fmt/init_test.go
@@ -38,5 +38,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/hugo/init.go b/tpl/hugo/init.go
@@ -27,7 +27,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return h },
+			Context: func(args ...interface{}) (interface{}, error) { return h, nil },
 		}
 
 		// We just add the Hugo struct as the namespace here. No method mappings.
diff --git a/tpl/hugo/init_test.go b/tpl/hugo/init_test.go
@@ -43,5 +43,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, s.Hugo())
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, s.Hugo())
 }
diff --git a/tpl/images/init.go b/tpl/images/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Config,
diff --git a/tpl/images/init_test.go b/tpl/images/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/inflect/init.go b/tpl/inflect/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Humanize,
diff --git a/tpl/inflect/init_test.go b/tpl/inflect/init_test.go
@@ -37,5 +37,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/internal/templatefuncsRegistry.go b/tpl/internal/templatefuncsRegistry.go
@@ -49,7 +49,7 @@ type TemplateFuncsNamespace struct {
 	Name string
 
 	// This is the method receiver.
-	Context func(v ...interface{}) interface{}
+	Context func(v ...interface{}) (interface{}, error)
 
 	// Additional info, aliases and examples, per method name.
 	MethodMappings map[string]TemplateFuncMethodMapping
@@ -172,7 +172,10 @@ func (t *TemplateFuncsNamespace) toJSON() ([]byte, error) {
 
 	buf.WriteString(fmt.Sprintf(`%q: {`, t.Name))
 
-	ctx := t.Context()
+	ctx, err := t.Context()
+	if err != nil {
+		return nil, err
+	}
 	ctxType := reflect.TypeOf(ctx)
 	for i := 0; i < ctxType.NumMethod(); i++ {
 		method := ctxType.Method(i)
diff --git a/tpl/js/init.go b/tpl/js/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		return ns
diff --git a/tpl/lang/init.go b/tpl/lang/init.go
@@ -27,7 +27,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Translate,
diff --git a/tpl/lang/init_test.go b/tpl/lang/init_test.go
@@ -42,5 +42,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/math/init.go b/tpl/math/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Add,
diff --git a/tpl/math/init_test.go b/tpl/math/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/openapi/openapi3/init.go b/tpl/openapi/openapi3/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Unmarshal,
diff --git a/tpl/os/init.go b/tpl/os/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Getenv,
diff --git a/tpl/os/init_test.go b/tpl/os/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/partials/init.go b/tpl/partials/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Include,
diff --git a/tpl/partials/init_test.go b/tpl/partials/init_test.go
@@ -40,5 +40,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/path/init.go b/tpl/path/init.go
@@ -29,7 +29,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Split,
diff --git a/tpl/path/init_test.go b/tpl/path/init_test.go
@@ -37,5 +37,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/reflect/init.go b/tpl/reflect/init.go
@@ -27,7 +27,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.IsMap,
diff --git a/tpl/reflect/init_test.go b/tpl/reflect/init_test.go
@@ -37,5 +37,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/resources/init.go b/tpl/resources/init.go
@@ -30,7 +30,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Get,
diff --git a/tpl/safe/init.go b/tpl/safe/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.CSS,
diff --git a/tpl/safe/init_test.go b/tpl/safe/init_test.go
@@ -37,5 +37,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/site/init.go b/tpl/site/init.go
@@ -27,7 +27,7 @@ func init() {
 		s := d.Site
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return s },
+			Context: func(args ...interface{}) (interface{}, error) { return s, nil },
 		}
 
 		if s == nil {
diff --git a/tpl/site/init_test.go b/tpl/site/init_test.go
@@ -43,5 +43,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, s)
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, s)
 }
diff --git a/tpl/strings/init.go b/tpl/strings/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Chomp,
diff --git a/tpl/strings/init_test.go b/tpl/strings/init_test.go
@@ -39,5 +39,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/templates/init.go b/tpl/templates/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Exists,
diff --git a/tpl/templates/init_test.go b/tpl/templates/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/time/init.go b/tpl/time/init.go
@@ -14,6 +14,8 @@
 package time
 
 import (
+	"errors"
+
 	"github.com/gohugoio/hugo/deps"
 	"github.com/gohugoio/hugo/langs"
 	"github.com/gohugoio/hugo/tpl/internal"
@@ -30,7 +32,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name: name,
-			Context: func(args ...interface{}) interface{} {
+			Context: func(args ...interface{}) (interface{}, error) {
 				// Handle overlapping "time" namespace and func.
 				//
 				// If no args are passed to `time`, assume namespace usage and
@@ -40,23 +42,15 @@ func init() {
 
 				switch len(args) {
 				case 0:
-					return ctx
+					return ctx, nil
 				case 1:
-					t, err := ctx.AsTime(args[0])
-					if err != nil {
-						return err
-					}
-					return t
+					return ctx.AsTime(args[0])
 				case 2:
-					t, err := ctx.AsTime(args[0], args[1])
-					if err != nil {
-						return err
-					}
-					return t
+					return ctx.AsTime(args[0], args[1])
 
 				// 3 or more arguments. Currently not supported.
 				default:
-					return "Invalid arguments supplied to `time`. Refer to time documentation: https://gohugo.io/functions/time/"
+					return nil, errors.New("Invalid arguments supplied to `time`. Refer to time documentation: https://gohugo.io/functions/time/")
 				}
 			},
 		}
diff --git a/tpl/time/init_test.go b/tpl/time/init_test.go
@@ -42,5 +42,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/transform/init.go b/tpl/transform/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.Emojify,
diff --git a/tpl/transform/init_test.go b/tpl/transform/init_test.go
@@ -36,5 +36,7 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
 }
diff --git a/tpl/urls/init.go b/tpl/urls/init.go
@@ -26,7 +26,7 @@ func init() {
 
 		ns := &internal.TemplateFuncsNamespace{
 			Name:    name,
-			Context: func(args ...interface{}) interface{} { return ctx },
+			Context: func(args ...interface{}) (interface{}, error) { return ctx, nil },
 		}
 
 		ns.AddMethodMapping(ctx.AbsURL,
diff --git a/tpl/urls/init_test.go b/tpl/urls/init_test.go
@@ -38,5 +38,8 @@ func TestInit(t *testing.T) {
 	}
 
 	c.Assert(found, qt.Equals, true)
-	c.Assert(ns.Context(), hqt.IsSameType, &Namespace{})
+	ctx, err := ns.Context()
+	c.Assert(err, qt.IsNil)
+	c.Assert(ctx, hqt.IsSameType, &Namespace{})
+
 }