From 0637adb239b2803cdef431b6ead797d60073642d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 17 Dec 2025 18:18:03 +0100 Subject: [PATCH] Improve error messages for template failures --- .../cssjs/postcss_integration_test.go | 2 +- tpl/tplimpl/templatestore.go | 31 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/resources/resource_transformers/cssjs/postcss_integration_test.go b/resources/resource_transformers/cssjs/postcss_integration_test.go index 9e724271d..5ddae9070 100644 --- a/resources/resource_transformers/cssjs/postcss_integration_test.go +++ b/resources/resource_transformers/cssjs/postcss_integration_test.go @@ -164,7 +164,7 @@ func TestTransformPostCSSError(t *testing.T) { }).BuildE() ferrs := herrors.UnwrapFileErrors(err) - b.Assert(len(ferrs), qt.Equals, 1) + b.Assert(len(ferrs), qt.Equals, 2) b.Assert(err.Error(), qt.Contains, "a.css:4:2") } diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 1b6266fca..748944663 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -907,52 +907,57 @@ func (s *TemplateStore) addFileContext(ti *TemplInfo, what string, inerr error) identifiers := s.extractIdentifiers(inerr.Error()) - checkFilename := func(fi hugofs.FileMetaInfo, inErr error) (error, bool) { + checkFilename := func(fi hugofs.FileMetaInfo, inErr error) (int, error) { + var matchWeight int lineMatcher := func(m herrors.LineMatcher) int { if m.Position.LineNumber != m.LineNumber { return -1 } + matchWeight++ for _, id := range identifiers { if strings.Contains(m.Line, id) { // We found the line, but return a 0 to signal to // use the column from the error message. + matchWeight++ return 0 } } - return -1 + return 0 } f, err := fi.Meta().Open() if err != nil { - return inErr, false + return -1, inErr } defer f.Close() fe := herrors.NewFileErrorFromName(inErr, fi.Meta().Filename) fe.UpdateContent(f, lineMatcher) - return fe, fe.ErrorContext().Position.IsValid() + return matchWeight, fe } inerr = fmt.Errorf("%s: %w", what, inerr) var ( - currentErr error - ok bool + err1 error + weight1 int + err2 error + weight2 int ) - if currentErr, ok = checkFilename(ti.Fi, inerr); ok { - return currentErr - } + weight1, err1 = checkFilename(ti.Fi, inerr) if ti.base != nil { - if currentErr, ok = checkFilename(ti.base.Fi, inerr); ok { - return currentErr - } + weight2, err2 = checkFilename(ti.base.Fi, inerr) + } + + if err2 != nil && weight2 > weight1 { + return err2 } - return currentErr + return err1 } func (s *TemplateStore) extractIdentifiers(line string) []string { -- 2.39.5