mirror of
https://github.com/gohugoio/hugo.git
synced 2025-09-08 23:40:40 +02:00
herrors: Improve handling of JSON errors
`*json.UnmarshalTypeError` and `*json.SyntaxError` has a byte `Offset`, so use that. This commit also reworks/simplifies the errror line matching logic. This also makes the file reading unbuffered, but that should be fine in this error case. See #5324
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// Copyright 2016-present The Hugo Authors. All rights reserved.
|
||||
// Copyright 2018 The Hugo Authors. All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
|
@@ -150,8 +150,7 @@ func TestSiteBuildErrors(t *testing.T) {
|
||||
name: "Invalid YAML front matter",
|
||||
fileType: yamlcontent,
|
||||
fileFixer: func(content string) string {
|
||||
// TODO(bep) 2errors YAML line numbers seems to be off by one for > 1 line.
|
||||
return strings.Replace(content, "title:", "title", 1)
|
||||
return strings.Replace(content, "title:", "title: %foo", 1)
|
||||
},
|
||||
assertBuildError: func(a testSiteBuildErrorAsserter, err error) {
|
||||
a.assertLineNumber(2, err)
|
||||
@@ -170,6 +169,20 @@ func TestSiteBuildErrors(t *testing.T) {
|
||||
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Invalid JSON front matter",
|
||||
fileType: tomlcontent,
|
||||
fileFixer: func(content string) string {
|
||||
return strings.Replace(content, "\"description\":", "\"description\"", 1)
|
||||
},
|
||||
assertBuildError: func(a testSiteBuildErrorAsserter, err error) {
|
||||
fe := a.getFileError(err)
|
||||
|
||||
assert.Equal(3, fe.LineNumber)
|
||||
assert.Equal("json", fe.ErrorContext.ChromaLexer)
|
||||
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Panic in template Execute",
|
||||
fileType: single,
|
||||
@@ -246,6 +259,16 @@ description = "Descriptioon"
|
||||
Some content.
|
||||
|
||||
|
||||
`))
|
||||
|
||||
b.WithContent("myjson.md", f(tomlcontent, `{
|
||||
"title": "This is a title",
|
||||
"description": "This is a description."
|
||||
}
|
||||
|
||||
Some content.
|
||||
|
||||
|
||||
`))
|
||||
|
||||
createErr := b.CreateSitesE()
|
||||
|
@@ -89,7 +89,11 @@ Loop:
|
||||
f := metadecoders.FormatFromFrontMatterType(it.Type)
|
||||
m, err := metadecoders.UnmarshalToMap(it.Val, f)
|
||||
if err != nil {
|
||||
return herrors.ToFileErrorWithOffset(string(f), err, iter.LineNumber()-1)
|
||||
if fe, ok := err.(herrors.FileError); ok {
|
||||
return herrors.ToFileErrorWithOffset(fe, iter.LineNumber()-1)
|
||||
} else {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := p.updateMetaData(m); err != nil {
|
||||
return err
|
||||
@@ -192,6 +196,6 @@ func parseError(err error, input []byte, pos int) error {
|
||||
input = input[:pos]
|
||||
lineNumber := bytes.Count(input, lf) + 1
|
||||
endOfLastLine := bytes.LastIndex(input, lf)
|
||||
return herrors.NewFileError("md", lineNumber, pos-endOfLastLine, err)
|
||||
return herrors.NewFileError("md", -1, lineNumber, pos-endOfLastLine, err)
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user