From 2d7709d15584e4c11138cd7fe92717a2a58e4585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 24 Oct 2018 13:32:46 +0200 Subject: [PATCH] tpl: Handle truncated identifiers in Go template errors Long identifiers will give errors on the format: ```bash _default/single.html:5:14: executing "main" at <.ThisIsAVeryLongTitl...>: can't evaluate field ThisIsAVeryLongTitle ``` Hugo use this value to match the "base template or not", so we need to strip the "...". Fixes #5346 --- hugolib/hugo_sites_build_errors_test.go | 15 +++++++++++++++ tpl/template.go | 4 +++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/hugolib/hugo_sites_build_errors_test.go b/hugolib/hugo_sites_build_errors_test.go index 8e913f061..8c5016225 100644 --- a/hugolib/hugo_sites_build_errors_test.go +++ b/hugolib/hugo_sites_build_errors_test.go @@ -107,6 +107,21 @@ func TestSiteBuildErrors(t *testing.T) { }, }, + { + name: "Single template execute failed, long keyword", + fileType: single, + fileFixer: func(content string) string { + return strings.Replace(content, ".Title", ".ThisIsAVeryLongTitle", 1) + }, + assertBuildError: func(a testSiteBuildErrorAsserter, err error) { + fe := a.getFileError(err) + assert.Equal(5, fe.LineNumber) + assert.Equal(14, fe.ColumnNumber) + assert.Equal("go-html-template", fe.ChromaLexer) + a.assertErrorMessage("\"layouts/_default/single.html:5:14\": execute of template failed", fe.Error()) + + }, + }, { name: "Shortcode parse failed", fileType: shortcode, diff --git a/tpl/template.go b/tpl/template.go index 968705493..913b20ed2 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -133,7 +133,9 @@ func (t *TemplateAdapter) Execute(w io.Writer, data interface{}) (execErr error) return } -var identifiersRe = regexp.MustCompile("at \\<(.*?)\\>:") +// The identifiers may be truncated in the log, e.g. +// "executing "main" at <$scaled.SRelPermalin...>: can't evaluate field SRelPermalink in type *resource.Image" +var identifiersRe = regexp.MustCompile("at \\<(.*?)(\\.{3})?\\>:") func (t *TemplateAdapter) extractIdentifiers(line string) []string { m := identifiersRe.FindAllStringSubmatch(line, -1)