summaryrefslogtreecommitdiffstats
path: root/hugolib
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-10-22 20:20:48 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-10-23 08:09:41 +0200
commited7b3e261909fe425ef64216f12806840c45b205 (patch)
treec082a1f0b2f0ac4cbb95faa1779fdbaa2845b5a7 /hugolib
parent2bf686ee217808186385bfcf6156f15bbdb33651 (diff)
commands, hugolib: Get file context in "config parse failed" errors
Fixes #5325
Diffstat (limited to 'hugolib')
-rw-r--r--hugolib/config.go18
-rw-r--r--hugolib/hugo_sites_build_errors_test.go15
-rw-r--r--hugolib/page_bundler_test.go2
-rw-r--r--hugolib/page_test.go2
-rw-r--r--hugolib/shortcode_test.go12
5 files changed, 33 insertions, 16 deletions
diff --git a/hugolib/config.go b/hugolib/config.go
index b21981304..32fa2dfca 100644
--- a/hugolib/config.go
+++ b/hugolib/config.go
@@ -16,10 +16,11 @@ package hugolib
import (
"errors"
"fmt"
-
"io"
"strings"
+ "github.com/gohugoio/hugo/common/herrors"
+
"github.com/gohugoio/hugo/hugolib/paths"
_errors "github.com/pkg/errors"
@@ -106,12 +107,23 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
v.SetConfigFile(configFilenames[0])
v.AddConfigPath(d.Path)
+ applyFileContext := func(filename string, err error) error {
+ err, _ = herrors.WithFileContextForFile(
+ err,
+ filename,
+ filename,
+ fs,
+ herrors.SimpleLineMatcher)
+
+ return err
+ }
+
var configFileErr error
err := v.ReadInConfig()
if err != nil {
if _, ok := err.(viper.ConfigParseError); ok {
- return nil, configFiles, err
+ return nil, configFiles, applyFileContext(v.ConfigFileUsed(), err)
}
configFileErr = ErrNoConfigFile
}
@@ -129,7 +141,7 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
return nil, configFiles, fmt.Errorf("Unable to open Config file.\n (%s)\n", err)
}
if err = v.MergeConfig(r); err != nil {
- return nil, configFiles, fmt.Errorf("Unable to parse/merge Config file (%s).\n (%s)\n", configFile, err)
+ return nil, configFiles, applyFileContext(configFile, err)
}
configFiles = append(configFiles, configFile)
}
diff --git a/hugolib/hugo_sites_build_errors_test.go b/hugolib/hugo_sites_build_errors_test.go
index 2e8eb99ea..f290022e0 100644
--- a/hugolib/hugo_sites_build_errors_test.go
+++ b/hugolib/hugo_sites_build_errors_test.go
@@ -30,7 +30,7 @@ func (t testSiteBuildErrorAsserter) assertLineNumber(lineNumber int, err error)
func (t testSiteBuildErrorAsserter) assertErrorMessage(e1, e2 string) {
// The error message will contain filenames with OS slashes. Normalize before compare.
e1, e2 = filepath.ToSlash(e1), filepath.ToSlash(e2)
- t.assert.Equal(e1, e2, trace())
+ t.assert.Contains(e2, e1, trace())
}
@@ -102,8 +102,8 @@ func TestSiteBuildErrors(t *testing.T) {
fe := a.getFileError(err)
assert.Equal(5, fe.LineNumber)
assert.Equal(14, fe.ColumnNumber)
- assert.Equal("md", fe.ChromaLexer)
- a.assertErrorMessage("asdfadf", fe.Error())
+ assert.Equal("go-html-template", fe.ChromaLexer)
+ a.assertErrorMessage("\"layouts/_default/single.html:5:14\": execute of template failed", fe.Error())
},
},
@@ -124,7 +124,12 @@ func TestSiteBuildErrors(t *testing.T) {
return strings.Replace(content, ".Title", ".Titles", 1)
},
assertBuildError: func(a testSiteBuildErrorAsserter, err error) {
- a.assertLineNumber(4, err)
+ fe := a.getFileError(err)
+ assert.Equal(7, fe.LineNumber)
+ assert.Equal("md", fe.ChromaLexer)
+ // Make sure that it contains both the content file and template
+ a.assertErrorMessage(`content/myyaml.md:7:10": failed to render shortcode "sc"`, fe.Error())
+ a.assertErrorMessage(`shortcodes/sc.html:4:22: executing "shortcodes/sc.html" at <.Page.Titles>: can't evaluate`, fe.Error())
},
},
{
@@ -173,7 +178,7 @@ func TestSiteBuildErrors(t *testing.T) {
},
assertBuildError: func(a testSiteBuildErrorAsserter, err error) {
assert.Error(err)
- assert.Contains(err.Error(), "single.html")
+ assert.Contains(err.Error(), `"content/mytoml.md": render of "page" failed: execute of template failed: panic in Execute`)
},
},
}
diff --git a/hugolib/page_bundler_test.go b/hugolib/page_bundler_test.go
index 39de49663..1eb5aacdd 100644
--- a/hugolib/page_bundler_test.go
+++ b/hugolib/page_bundler_test.go
@@ -132,7 +132,7 @@ func TestPageBundlerSiteRegular(t *testing.T) {
assert.Len(pageResources, 2)
firstPage := pageResources[0].(*Page)
secondPage := pageResources[1].(*Page)
- assert.Equal(filepath.FromSlash("base/b/my-bundle/1.md"), firstPage.pathOrTitle(), secondPage.pathOrTitle())
+ assert.Equal(filepath.FromSlash("/work/base/b/my-bundle/1.md"), firstPage.pathOrTitle(), secondPage.pathOrTitle())
assert.Contains(firstPage.content(), "TheContent")
assert.Equal(6, len(leafBundle1.Resources))
diff --git a/hugolib/page_test.go b/hugolib/page_test.go
index 7359140fc..ced7e78d8 100644
--- a/hugolib/page_test.go
+++ b/hugolib/page_test.go
@@ -1145,7 +1145,7 @@ func TestDegenerateInvalidFrontMatterShortDelim(t *testing.T) {
r string
err string
}{
- {invalidFrontmatterShortDelimEnding, ":2: EOF looking for end YAML front matter delimiter"},
+ {invalidFrontmatterShortDelimEnding, "EOF looking for end YAML front matter delimiter"},
}
for _, test := range tests {
s := newTestSite(t)
diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go
index 6e250ed21..0d397f9ee 100644
--- a/hugolib/shortcode_test.go
+++ b/hugolib/shortcode_test.go
@@ -368,11 +368,11 @@ func TestExtractShortcodes(t *testing.T) {
expectErrorMsg string
}{
{"text", "Some text.", "map[]", "Some text.", ""},
- {"invalid right delim", "{{< tag }}", "", false, ":5:.*unrecognized character.*}"},
- {"invalid close", "\n{{< /tag >}}", "", false, ":6:.*got closing shortcode, but none is open"},
- {"invalid close2", "\n\n{{< tag >}}{{< /anotherTag >}}", "", false, ":7: closing tag for shortcode 'anotherTag' does not match start tag"},
- {"unterminated quote 1", `{{< figure src="im caption="S" >}}`, "", false, ":5:.got pos.*"},
- {"unterminated quote 1", `{{< figure src="im" caption="S >}}`, "", false, ":5:.*unterm.*}"},
+ {"invalid right delim", "{{< tag }}", "", false, "unrecognized character"},
+ {"invalid close", "\n{{< /tag >}}", "", false, "got closing shortcode, but none is open"},
+ {"invalid close2", "\n\n{{< tag >}}{{< /anotherTag >}}", "", false, "closing tag for shortcode 'anotherTag' does not match start tag"},
+ {"unterminated quote 1", `{{< figure src="im caption="S" >}}`, "", false, "got pos"},
+ {"unterminated quote 1", `{{< figure src="im" caption="S >}}`, "", false, "unterm"},
{"one shortcode, no markup", "{{< tag >}}", "", testScPlaceholderRegexp, ""},
{"one shortcode, markup", "{{% tag %}}", "", testScPlaceholderRegexp, ""},
{"one pos param", "{{% tag param1 %}}", `tag([\"param1\"], true){[]}"]`, testScPlaceholderRegexp, ""},
@@ -430,7 +430,7 @@ func TestExtractShortcodes(t *testing.T) {
if err == nil {
t.Fatalf("[%d] %s: ExtractShortcodes didn't return an expected error", i, this.name)
} else {
- r, _ := regexp.Compile(this.expectErrorMsg)
+ r := regexp.MustCompile(this.expectErrorMsg)
if !r.MatchString(err.Error()) {
t.Fatalf("[%d] %s: ExtractShortcodes didn't return an expected error message, got\n%s but expected\n%s",
i, this.name, err.Error(), this.expectErrorMsg)