From 4fc67fe44a3c65fc7faaed21d5fa5bb5f87edf2c Mon Sep 17 00:00:00 2001 From: Brendan Roy Date: Sat, 30 Sep 2017 20:00:19 +1000 Subject: [PATCH] tpl: Add errorf template function Add template function that will build a string from the given format string and arguments, then log it to ERROR. This has an intended side-effect of causing the build to fail, when executed. Resolves #3817 --- docs/content/functions/errorf.md | 26 ++++++++++++++++++++++++++ tpl/fmt/fmt.go | 9 ++++++++- tpl/fmt/init.go | 8 +++++++- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 docs/content/functions/errorf.md diff --git a/docs/content/functions/errorf.md b/docs/content/functions/errorf.md new file mode 100644 index 000000000..9105ff840 --- /dev/null +++ b/docs/content/functions/errorf.md @@ -0,0 +1,26 @@ +--- +title: errorf +linktitle: errorf +description: Evaluates a format string and logs it to ERROR. +date: 2017-09-30 +publishdate: 2017-09-30 +lastmod: 2017-09-30 +categories: [functions] +menu: + docs: + parent: "functions" +keywords: [strings, log, error] +signature: ["errorf FORMAT INPUT"] +workson: [] +hugoversion: +relatedfuncs: [printf] +deprecated: false +aliases: [] +--- + +`errorf` will evaluate a format string, then output the result to the ERROR log. +This will also cause the build to fail. + +``` +{{ errorf "Something went horribly wrong! %s" err }} +``` diff --git a/tpl/fmt/fmt.go b/tpl/fmt/fmt.go index 96695442e..96113a598 100644 --- a/tpl/fmt/fmt.go +++ b/tpl/fmt/fmt.go @@ -15,15 +15,17 @@ package fmt import ( _fmt "fmt" + "github.com/gohugoio/hugo/helpers" ) // New returns a new instance of the fmt-namespaced template functions. func New() *Namespace { - return &Namespace{} + return &Namespace{helpers.NewDistinctErrorLogger()} } // Namespace provides template functions for the "fmt" namespace. type Namespace struct { + errorLogger *helpers.DistinctLogger } // Print returns string representation of the passed arguments. @@ -41,3 +43,8 @@ func (ns *Namespace) Printf(format string, a ...interface{}) string { func (ns *Namespace) Println(a ...interface{}) string { return _fmt.Sprintln(a...) } + +func (ns *Namespace) Errorf(format string, a ...interface{}) string { + ns.errorLogger.Printf(format, a...) + return _fmt.Sprintf(format, a...) +} diff --git a/tpl/fmt/init.go b/tpl/fmt/init.go index a3398b862..76c68957a 100644 --- a/tpl/fmt/init.go +++ b/tpl/fmt/init.go @@ -50,8 +50,14 @@ func init() { }, ) - return ns + ns.AddMethodMapping(ctx.Errorf, + []string{"errorf"}, + [][2]string{ + {`{{ errorf "%s." "failed" }}`, `failed.`}, + }, + ) + return ns } internal.AddTemplateFuncsNamespace(f)