mirror of
https://github.com/mikefarah/yq.git
synced 2026-07-07 14:25:38 +00:00
Compare commits
7 Commits
52e06881a8
...
808c9fe089
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
808c9fe089 | ||
|
|
5db3dcf394 | ||
|
|
4c148178e2 | ||
|
|
4df6e46f95 | ||
|
|
6a965bc39a | ||
|
|
34d3a29308 | ||
|
|
79a2130107 |
2
.github/workflows/docker-release.yml
vendored
2
.github/workflows/docker-release.yml
vendored
@ -23,7 +23,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
id: buildx
|
id: buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v4
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: latest
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
FROM golang:1.26.0 AS builder
|
FROM golang:1.26.1 AS builder
|
||||||
|
|
||||||
WORKDIR /go/src/mikefarah/yq
|
WORKDIR /go/src/mikefarah/yq
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
FROM golang:1.26.0
|
FROM golang:1.26.1
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y npm && \
|
apt-get install -y npm && \
|
||||||
|
|||||||
@ -101,12 +101,15 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if frontMatter != "" {
|
if frontMatter != "" {
|
||||||
|
originalFilename := args[0]
|
||||||
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
|
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
|
||||||
err = frontMatterHandler.Split()
|
err = frontMatterHandler.Split()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()
|
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()
|
||||||
|
yqlib.SetFilenameAlias(args[0], originalFilename)
|
||||||
|
defer yqlib.ClearFilenameAliases()
|
||||||
|
|
||||||
if frontMatter == "process" {
|
if frontMatter == "process" {
|
||||||
reader := frontMatterHandler.GetContentReader()
|
reader := frontMatterHandler.GetContentReader()
|
||||||
|
|||||||
@ -122,12 +122,15 @@ func evaluateSequence(cmd *cobra.Command, args []string) (cmdError error) {
|
|||||||
|
|
||||||
if frontMatter != "" {
|
if frontMatter != "" {
|
||||||
yqlib.GetLogger().Debug("using front matter handler")
|
yqlib.GetLogger().Debug("using front matter handler")
|
||||||
|
originalFilename := args[0]
|
||||||
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
|
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
|
||||||
err = frontMatterHandler.Split()
|
err = frontMatterHandler.Split()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()
|
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()
|
||||||
|
yqlib.SetFilenameAlias(args[0], originalFilename)
|
||||||
|
defer yqlib.ClearFilenameAliases()
|
||||||
|
|
||||||
if frontMatter == "process" {
|
if frontMatter == "process" {
|
||||||
reader := frontMatterHandler.GetContentReader()
|
reader := frontMatterHandler.GetContentReader()
|
||||||
|
|||||||
@ -911,7 +911,7 @@ func stringsEqual(a, b []string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
for i := range a {
|
for i := range a {
|
||||||
if a[i] != b[i] {
|
if a[i] != b[i] { //nolint:gosec // G602 false positive: b length equality is checked above
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
go.mod
10
go.mod
@ -22,7 +22,7 @@ require (
|
|||||||
go.yaml.in/yaml/v4 v4.0.0-rc.3
|
go.yaml.in/yaml/v4 v4.0.0-rc.3
|
||||||
golang.org/x/mod v0.33.0
|
golang.org/x/mod v0.33.0
|
||||||
golang.org/x/net v0.50.0
|
golang.org/x/net v0.50.0
|
||||||
golang.org/x/text v0.34.0
|
golang.org/x/text v0.35.0
|
||||||
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473
|
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,11 +34,9 @@ require (
|
|||||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
|
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
|
||||||
golang.org/x/sync v0.19.0 // indirect
|
golang.org/x/sync v0.20.0 // indirect
|
||||||
golang.org/x/sys v0.41.0 // indirect
|
golang.org/x/sys v0.41.0 // indirect
|
||||||
golang.org/x/tools v0.41.0 // indirect
|
golang.org/x/tools v0.42.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
go 1.24.0
|
go 1.25.0
|
||||||
|
|
||||||
toolchain go1.24.1
|
|
||||||
|
|||||||
12
go.sum
12
go.sum
@ -74,15 +74,15 @@ golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8=
|
|||||||
golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w=
|
golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w=
|
||||||
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
|
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
|
||||||
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
|
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
|
||||||
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
|
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
||||||
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
|
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
|
||||||
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
|
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
|
||||||
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
|
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
|
||||||
golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
|
golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k=
|
||||||
golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
|
golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE=
|
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE=
|
||||||
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog=
|
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog=
|
||||||
|
|||||||
@ -280,7 +280,7 @@ func (n *CandidateNode) AddChild(rawChild *CandidateNode) {
|
|||||||
|
|
||||||
func (n *CandidateNode) AddChildren(children []*CandidateNode) {
|
func (n *CandidateNode) AddChildren(children []*CandidateNode) {
|
||||||
if n.Kind == MappingNode {
|
if n.Kind == MappingNode {
|
||||||
for i := 0; i < len(children); i += 2 {
|
for i := 0; i < len(children)-1; i += 2 {
|
||||||
key := children[i]
|
key := children[i]
|
||||||
value := children[i+1]
|
value := children[i+1]
|
||||||
n.AddKeyValueChild(key, value)
|
n.AddKeyValueChild(key, value)
|
||||||
|
|||||||
@ -108,6 +108,55 @@ yaml: doc
|
|||||||
fmHandler.CleanUp()
|
fmHandler.CleanUp()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFrontMatterFilenamePreserved(t *testing.T) {
|
||||||
|
// Regression test for https://github.com/mikefarah/yq/issues/2538
|
||||||
|
// When using --front-matter, the filename operator should return
|
||||||
|
// the original filename, not the path to the temporary file.
|
||||||
|
file := createTestFile(`---
|
||||||
|
name: john
|
||||||
|
---
|
||||||
|
Some content
|
||||||
|
`)
|
||||||
|
originalFilename := "/path/to/original/file.md"
|
||||||
|
|
||||||
|
fmHandler := NewFrontMatterHandler(file)
|
||||||
|
err := fmHandler.Split()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
tempFilename := fmHandler.GetYamlFrontMatterFilename()
|
||||||
|
|
||||||
|
// Register the alias (as the command code does)
|
||||||
|
SetFilenameAlias(tempFilename, originalFilename)
|
||||||
|
defer ClearFilenameAliases()
|
||||||
|
|
||||||
|
// Verify resolveFilename returns the original name
|
||||||
|
resolved := resolveFilename(tempFilename)
|
||||||
|
test.AssertResult(t, originalFilename, resolved)
|
||||||
|
|
||||||
|
// Read documents using the temp file, verify they get the original filename
|
||||||
|
reader, err := readStream(tempFilename)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
decoder := NewYamlDecoder(ConfiguredYamlPreferences)
|
||||||
|
docs, err := readDocuments(reader, tempFilename, 0, decoder)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if docs.Len() == 0 {
|
||||||
|
t.Fatal("expected at least one document")
|
||||||
|
}
|
||||||
|
|
||||||
|
firstDoc := docs.Front().Value.(*CandidateNode)
|
||||||
|
test.AssertResult(t, originalFilename, firstDoc.filename)
|
||||||
|
|
||||||
|
tryRemoveTempFile(file)
|
||||||
|
fmHandler.CleanUp()
|
||||||
|
}
|
||||||
|
|
||||||
func TestFrontMatterSplitWithArray(t *testing.T) {
|
func TestFrontMatterSplitWithArray(t *testing.T) {
|
||||||
file := createTestFile(`[1,2,3]
|
file := createTestFile(`[1,2,3]
|
||||||
---
|
---
|
||||||
|
|||||||
@ -29,7 +29,7 @@ func GetLogger() *logging.Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getContentValueByKey(content []*CandidateNode, key string) *CandidateNode {
|
func getContentValueByKey(content []*CandidateNode, key string) *CandidateNode {
|
||||||
for index := 0; index < len(content); index = index + 2 {
|
for index := 0; index < len(content)-1; index = index + 2 {
|
||||||
keyNode := content[index]
|
keyNode := content[index]
|
||||||
valueNode := content[index+1]
|
valueNode := content[index+1]
|
||||||
if keyNode.Value == key {
|
if keyNode.Value == key {
|
||||||
|
|||||||
@ -76,6 +76,7 @@ func (s *streamEvaluator) EvaluateFiles(expression string, filenames []string, p
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *streamEvaluator) Evaluate(filename string, reader io.Reader, node *ExpressionNode, printer Printer, decoder Decoder) (uint, error) {
|
func (s *streamEvaluator) Evaluate(filename string, reader io.Reader, node *ExpressionNode, printer Printer, decoder Decoder) (uint, error) {
|
||||||
|
filename = resolveFilename(filename)
|
||||||
|
|
||||||
var currentIndex uint
|
var currentIndex uint
|
||||||
err := decoder.Init(reader)
|
err := decoder.Init(reader)
|
||||||
|
|||||||
@ -9,6 +9,29 @@ import (
|
|||||||
"os"
|
"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) {
|
func readStream(filename string) (io.Reader, error) {
|
||||||
var reader *bufio.Reader
|
var reader *bufio.Reader
|
||||||
if filename == "-" {
|
if filename == "-" {
|
||||||
@ -36,6 +59,7 @@ func ReadDocuments(reader io.Reader, decoder Decoder) (*list.List, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func readDocuments(reader io.Reader, filename string, fileIndex int, decoder Decoder) (*list.List, error) {
|
func readDocuments(reader io.Reader, filename string, fileIndex int, decoder Decoder) (*list.List, error) {
|
||||||
|
filename = resolveFilename(filename)
|
||||||
err := decoder.Init(reader)
|
err := decoder.Init(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@ -3,8 +3,6 @@
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
# TODO: Check if the found golangci-lint version matches the expected version (e.g., v1.62.0), especially if falling back to PATH version.
|
|
||||||
|
|
||||||
GOPATH_LINT="$(go env GOPATH)/bin/golangci-lint"
|
GOPATH_LINT="$(go env GOPATH)/bin/golangci-lint"
|
||||||
BIN_LINT="./bin/golangci-lint"
|
BIN_LINT="./bin/golangci-lint"
|
||||||
LINT_CMD=""
|
LINT_CMD=""
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -ex
|
set -ex
|
||||||
go mod download golang.org/x/tools@latest
|
go mod download golang.org/x/tools@latest
|
||||||
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.5
|
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.11.3
|
||||||
curl -sSfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s v2.22.11
|
curl -sSfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s v2.22.11
|
||||||
Loading…
Reference in New Issue
Block a user