shithub: hugo

Download patch

ref: 0fe4ff18751156fa072e1f83077e49a8597e7dcd
parent: 1f42e47e475c0cd684426dd230de411d4c385a3c
author: Bjørn Erik Pedersen <[email protected]>
date: Wed Oct 17 04:24:45 EDT 2018

tpl: Improve the Execute panic error message

See #5327

--- a/hugolib/hugo_sites_build_errors_test.go
+++ b/hugolib/hugo_sites_build_errors_test.go
@@ -109,6 +109,18 @@
 					a.assertLineNumber(2, err)
 				},
 			},*/
+
+		{
+			name:     "Panic in template Execute",
+			fileType: single,
+			fileFixer: func(content string) string {
+				return strings.Replace(content, ".Title", ".Parent.Parent.Parent", 1)
+			},
+			assertBuildError: func(a testSiteBuildErrorAsserter, err error) {
+				assert.Error(err)
+				assert.Contains(err.Error(), "layouts/_default/single.html")
+			},
+		},
 	}
 
 	for _, test := range tests {
--- a/tpl/template.go
+++ b/tpl/template.go
@@ -115,8 +115,9 @@
 func (t *TemplateAdapter) Execute(w io.Writer, data interface{}) (execErr error) {
 	defer func() {
 		// Panics in templates are a little bit too common (nil pointers etc.)
+		// See https://github.com/gohugoio/hugo/issues/5327
 		if r := recover(); r != nil {
-			execErr = t.addFileContext(t.Name(), fmt.Errorf("panic in Execute: %s", r))
+			execErr = t.addFileContext(t.Name(), fmt.Errorf(`panic in Execute: %s. See "https://github.com/gohugoio/hugo/issues/5327" for the reason why we cannot provide a better error message for this.`, r))
 		}
 	}()
 
@@ -152,7 +153,7 @@
 
 	master, hasMaster := t.NameBaseTemplateName[name]
 
-	ferr := errors.Wrapf(inerr, "execute of template %q failed", realFilename)
+	ferr1 := errors.Wrapf(inerr, "execute of template %q failed", realFilename)
 
 	// Since this can be a composite of multiple template files (single.html + baseof.html etc.)
 	// we potentially need to look in both -- and cannot rely on line number alone.
@@ -175,7 +176,7 @@
 	}
 
 	// TODO(bep) 2errors text vs HTML
-	fe, ok := herrors.WithFileContext(ferr, f, "go-html-template", lineMatcher)
+	fe, ok := herrors.WithFileContext(ferr1, f, "go-html-template", lineMatcher)
 	if ok || !hasMaster {
 		return fe
 	}
@@ -187,8 +188,14 @@
 	}
 	defer f.Close()
 
-	ferr = errors.Wrapf(inerr, "execute of template %q failed", realFilename)
-	fe, _ = herrors.WithFileContext(ferr, f, "go-html-template", lineMatcher)
+	ferr2 := errors.Wrapf(inerr, "execute of template %q failed", realFilename)
+	fe, ok = herrors.WithFileContext(ferr2, f, "go-html-template", lineMatcher)
+
+	if !ok {
+		// Return the most specific.
+		return ferr1
+
+	}
 	return fe
 
 }