mirror of
https://github.com/mikefarah/yq.git
synced 2026-06-27 15:37:47 +00:00
When using --front-matter, yq creates a temporary file for the extracted YAML content but replaces the original filename in args with the temp file path. This caused the 'filename' operator to return the temp file path instead of the original filename. Added a filename alias mechanism: when front matter processing replaces the file path, it registers the original filename as an alias. The readDocuments and stream evaluator functions resolve aliases before setting candidateNode.filename. Fixes #2538 Co-authored-by: cobyfrombrooklyn-bot <cobyfrombrooklyn@gmail.com>
92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
package yqlib
|
|
|
|
import (
|
|
"bufio"
|
|
"container/list"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
// filenameAliases maps real file paths to display names.
|
|
// Used by front matter handling to preserve original filenames
|
|
// when the actual content is read from temporary files.
|
|
var filenameAliases = map[string]string{}
|
|
|
|
// SetFilenameAlias registers a display name for a file path so that
|
|
// the filename operator returns the original name instead of a temp path.
|
|
func SetFilenameAlias(realPath string, displayName string) {
|
|
filenameAliases[realPath] = displayName
|
|
}
|
|
|
|
// ClearFilenameAliases removes all filename aliases.
|
|
func ClearFilenameAliases() {
|
|
filenameAliases = map[string]string{}
|
|
}
|
|
|
|
func resolveFilename(filename string) string {
|
|
if alias, ok := filenameAliases[filename]; ok {
|
|
return alias
|
|
}
|
|
return filename
|
|
}
|
|
|
|
func readStream(filename string) (io.Reader, error) {
|
|
var reader *bufio.Reader
|
|
if filename == "-" {
|
|
reader = bufio.NewReader(os.Stdin)
|
|
} else {
|
|
// ignore CWE-22 gosec issue - that's more targeted for http based apps that run in a public directory,
|
|
// and ensuring that it's not possible to give a path to a file outside that directory.
|
|
file, err := os.Open(filename) // #nosec
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
reader = bufio.NewReader(file)
|
|
}
|
|
return reader, nil
|
|
|
|
}
|
|
|
|
func writeString(writer io.Writer, txt string) error {
|
|
_, errorWriting := writer.Write([]byte(txt))
|
|
return errorWriting
|
|
}
|
|
|
|
func ReadDocuments(reader io.Reader, decoder Decoder) (*list.List, error) {
|
|
return readDocuments(reader, "", 0, decoder)
|
|
}
|
|
|
|
func readDocuments(reader io.Reader, filename string, fileIndex int, decoder Decoder) (*list.List, error) {
|
|
filename = resolveFilename(filename)
|
|
err := decoder.Init(reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
inputList := list.New()
|
|
var currentIndex uint
|
|
|
|
for {
|
|
candidateNode, errorReading := decoder.Decode()
|
|
|
|
if errors.Is(errorReading, io.EOF) {
|
|
switch reader := reader.(type) {
|
|
case *os.File:
|
|
safelyCloseFile(reader)
|
|
}
|
|
return inputList, nil
|
|
} else if errorReading != nil {
|
|
return nil, fmt.Errorf("bad file '%v': %w", filename, errorReading)
|
|
}
|
|
candidateNode.document = currentIndex
|
|
candidateNode.filename = filename
|
|
candidateNode.fileIndex = fileIndex
|
|
candidateNode.EvaluateTogether = true
|
|
|
|
inputList.PushBack(candidateNode)
|
|
|
|
currentIndex = currentIndex + 1
|
|
}
|
|
}
|