mirror of
https://github.com/mikefarah/yq.git
synced 2026-07-07 14:25:38 +00:00
Compare commits
1 Commits
202bfe8d7e
...
5702cdb6d5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5702cdb6d5 |
@ -2,26 +2,13 @@ package yqlib
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/dimchansky/utfbom"
|
||||||
)
|
)
|
||||||
|
|
||||||
var utf8BOM = []byte{0xEF, 0xBB, 0xBF}
|
|
||||||
|
|
||||||
// stripUTF8BOM returns a reader that skips a leading UTF-8 BOM, if present.
|
|
||||||
func stripUTF8BOM(r io.Reader) io.Reader {
|
|
||||||
br := bufio.NewReader(r)
|
|
||||||
|
|
||||||
peek, err := br.Peek(3)
|
|
||||||
if err == nil && bytes.Equal(peek, utf8BOM) {
|
|
||||||
_, _ = br.Discard(3)
|
|
||||||
}
|
|
||||||
|
|
||||||
return br
|
|
||||||
}
|
|
||||||
|
|
||||||
type frontMatterHandler interface {
|
type frontMatterHandler interface {
|
||||||
Split() error
|
Split() error
|
||||||
GetYamlFrontMatterFilename() string
|
GetYamlFrontMatterFilename() string
|
||||||
@ -58,13 +45,15 @@ func (f *frontMatterHandlerImpl) Split() error {
|
|||||||
var reader *bufio.Reader
|
var reader *bufio.Reader
|
||||||
var err error
|
var err error
|
||||||
if f.originalFilename == "-" {
|
if f.originalFilename == "-" {
|
||||||
reader = bufio.NewReader(stripUTF8BOM(os.Stdin))
|
cleanReader, _ := utfbom.Skip(os.Stdin)
|
||||||
|
reader = bufio.NewReader(cleanReader)
|
||||||
} else {
|
} else {
|
||||||
file, err := os.Open(f.originalFilename) // #nosec
|
file, err := os.Open(f.originalFilename) // #nosec
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
reader = bufio.NewReader(stripUTF8BOM(file))
|
cleanReader, _ := utfbom.Skip(file)
|
||||||
|
reader = bufio.NewReader(cleanReader)
|
||||||
}
|
}
|
||||||
f.contentReader = reader
|
f.contentReader = reader
|
||||||
|
|
||||||
|
|||||||
@ -193,56 +193,6 @@ yaml: doc
|
|||||||
fmHandler.CleanUp()
|
fmHandler.CleanUp()
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFrontMatterSplitWithBOMFromStdin(t *testing.T) {
|
|
||||||
// Regression test for https://github.com/mikefarah/yq/issues/2496
|
|
||||||
// A UTF-8 BOM must also be skipped when reading front matter from stdin.
|
|
||||||
originalStdin := os.Stdin
|
|
||||||
defer func() { os.Stdin = originalStdin }()
|
|
||||||
|
|
||||||
r, w, err := os.Pipe()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
os.Stdin = r
|
|
||||||
defer safelyCloseFile(r)
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
_, writeErr := w.WriteString("\ufeff---\na: apple\nb: banana\n---\nnot a\nyaml: doc\n")
|
|
||||||
if writeErr != nil {
|
|
||||||
t.Errorf("failed to write front matter to the stdin pipe: %v", writeErr)
|
|
||||||
}
|
|
||||||
safelyCloseFile(w)
|
|
||||||
}()
|
|
||||||
|
|
||||||
expectedYamlFm := `---
|
|
||||||
a: apple
|
|
||||||
b: banana
|
|
||||||
`
|
|
||||||
|
|
||||||
expectedContent := `---
|
|
||||||
not a
|
|
||||||
yaml: doc
|
|
||||||
`
|
|
||||||
|
|
||||||
fmHandler := NewFrontMatterHandler("-")
|
|
||||||
err = fmHandler.Split()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
yamlFm := readFile(fmHandler.GetYamlFrontMatterFilename())
|
|
||||||
|
|
||||||
test.AssertResult(t, expectedYamlFm, yamlFm)
|
|
||||||
|
|
||||||
contentBytes, err := io.ReadAll(fmHandler.GetContentReader())
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
test.AssertResult(t, expectedContent, string(contentBytes))
|
|
||||||
|
|
||||||
fmHandler.CleanUp()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFrontMatterSplitWithArray(t *testing.T) {
|
func TestFrontMatterSplitWithArray(t *testing.T) {
|
||||||
file := createTestFile(`[1,2,3]
|
file := createTestFile(`[1,2,3]
|
||||||
---
|
---
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user