mirror of
https://github.com/mikefarah/yq.git
synced 2025-01-12 11:05:37 +00:00
Fixes bug when using inplace with no expression and multiple files #1193
This commit is contained in:
parent
ed5b811f37
commit
3ad5355777
@ -188,6 +188,40 @@ EOL
|
|||||||
assertEquals "10" "$X"
|
assertEquals "10" "$X"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testBasicUpdateInPlaceMultipleFilesNoExpressionEval() {
|
||||||
|
cat >test.yml <<EOL
|
||||||
|
a: 0
|
||||||
|
EOL
|
||||||
|
cat >test2.yml <<EOL
|
||||||
|
a: 1
|
||||||
|
EOL
|
||||||
|
read -r -d '' expected << EOM
|
||||||
|
0
|
||||||
|
---
|
||||||
|
1
|
||||||
|
EOM
|
||||||
|
./yq -i test.yml test2.yml
|
||||||
|
X=$(./yq e '.a' test.yml)
|
||||||
|
assertEquals "$expected" "$X"
|
||||||
|
}
|
||||||
|
|
||||||
|
testBasicUpdateInPlaceMultipleFilesNoExpressionEvalAll() {
|
||||||
|
cat >test.yml <<EOL
|
||||||
|
a: 0
|
||||||
|
EOL
|
||||||
|
cat >test2.yml <<EOL
|
||||||
|
a: 1
|
||||||
|
EOL
|
||||||
|
read -r -d '' expected << EOM
|
||||||
|
0
|
||||||
|
---
|
||||||
|
1
|
||||||
|
EOM
|
||||||
|
./yq -i ea test.yml test2.yml
|
||||||
|
X=$(./yq e '.a' test.yml)
|
||||||
|
assertEquals "$expected" "$X"
|
||||||
|
}
|
||||||
|
|
||||||
testBasicNoExitStatus() {
|
testBasicNoExitStatus() {
|
||||||
echo "a: cat" > test.yml
|
echo "a: cat" > test.yml
|
||||||
X=$(./yq e '.z' test.yml)
|
X=$(./yq e '.z' test.yml)
|
||||||
|
@ -2,7 +2,6 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/mikefarah/yq/v4/pkg/yqlib"
|
"github.com/mikefarah/yq/v4/pkg/yqlib"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -47,36 +46,17 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) {
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
firstFileIndex, err := initCommand(cmd, args)
|
expression, args, err := initCommand(cmd, args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
stat, _ := os.Stdin.Stat()
|
|
||||||
pipingStdIn := (stat.Mode() & os.ModeCharDevice) == 0
|
|
||||||
yqlib.GetLogger().Debug("pipingStdIn: %v", pipingStdIn)
|
|
||||||
|
|
||||||
yqlib.GetLogger().Debug("stat.Mode(): %v", stat.Mode())
|
|
||||||
yqlib.GetLogger().Debug("ModeDir: %v", stat.Mode()&os.ModeDir)
|
|
||||||
yqlib.GetLogger().Debug("ModeAppend: %v", stat.Mode()&os.ModeAppend)
|
|
||||||
yqlib.GetLogger().Debug("ModeExclusive: %v", stat.Mode()&os.ModeExclusive)
|
|
||||||
yqlib.GetLogger().Debug("ModeTemporary: %v", stat.Mode()&os.ModeTemporary)
|
|
||||||
yqlib.GetLogger().Debug("ModeSymlink: %v", stat.Mode()&os.ModeSymlink)
|
|
||||||
yqlib.GetLogger().Debug("ModeDevice: %v", stat.Mode()&os.ModeDevice)
|
|
||||||
yqlib.GetLogger().Debug("ModeNamedPipe: %v", stat.Mode()&os.ModeNamedPipe)
|
|
||||||
yqlib.GetLogger().Debug("ModeSocket: %v", stat.Mode()&os.ModeSocket)
|
|
||||||
yqlib.GetLogger().Debug("ModeSetuid: %v", stat.Mode()&os.ModeSetuid)
|
|
||||||
yqlib.GetLogger().Debug("ModeSetgid: %v", stat.Mode()&os.ModeSetgid)
|
|
||||||
yqlib.GetLogger().Debug("ModeCharDevice: %v", stat.Mode()&os.ModeCharDevice)
|
|
||||||
yqlib.GetLogger().Debug("ModeSticky: %v", stat.Mode()&os.ModeSticky)
|
|
||||||
yqlib.GetLogger().Debug("ModeIrregular: %v", stat.Mode()&os.ModeIrregular)
|
|
||||||
|
|
||||||
out := cmd.OutOrStdout()
|
out := cmd.OutOrStdout()
|
||||||
|
|
||||||
if writeInplace {
|
if writeInplace {
|
||||||
// only use colors if its forced
|
// only use colors if its forced
|
||||||
colorsEnabled = forceColor
|
colorsEnabled = forceColor
|
||||||
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[firstFileIndex])
|
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[0])
|
||||||
out, err = writeInPlaceHandler.CreateTempFile()
|
out, err = writeInPlaceHandler.CreateTempFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -109,12 +89,12 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) {
|
|||||||
printer := yqlib.NewPrinter(encoder, printerWriter)
|
printer := yqlib.NewPrinter(encoder, printerWriter)
|
||||||
|
|
||||||
if frontMatter != "" {
|
if frontMatter != "" {
|
||||||
frontMatterHandler := yqlib.NewFrontMatterHandler(args[firstFileIndex])
|
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
|
||||||
err = frontMatterHandler.Split()
|
err = frontMatterHandler.Split()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
args[firstFileIndex] = frontMatterHandler.GetYamlFrontMatterFilename()
|
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()
|
||||||
|
|
||||||
if frontMatter == "process" {
|
if frontMatter == "process" {
|
||||||
reader := frontMatterHandler.GetContentReader()
|
reader := frontMatterHandler.GetContentReader()
|
||||||
@ -126,12 +106,6 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) {
|
|||||||
|
|
||||||
allAtOnceEvaluator := yqlib.NewAllAtOnceEvaluator()
|
allAtOnceEvaluator := yqlib.NewAllAtOnceEvaluator()
|
||||||
|
|
||||||
expression, args, err := processArgs(pipingStdIn, args)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
yqlib.GetLogger().Debugf("processed args: %v", args)
|
|
||||||
|
|
||||||
switch len(args) {
|
switch len(args) {
|
||||||
case 0:
|
case 0:
|
||||||
if nullInput {
|
if nullInput {
|
||||||
|
@ -3,7 +3,6 @@ package cmd
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/mikefarah/yq/v4/pkg/yqlib"
|
"github.com/mikefarah/yq/v4/pkg/yqlib"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -59,42 +58,19 @@ func evaluateSequence(cmd *cobra.Command, args []string) (cmdError error) {
|
|||||||
// 1 arg, read file in sequence
|
// 1 arg, read file in sequence
|
||||||
// 2+ args, [0] = expression, file the rest
|
// 2+ args, [0] = expression, file the rest
|
||||||
|
|
||||||
|
out := cmd.OutOrStdout()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
firstFileIndex, err := initCommand(cmd, args)
|
|
||||||
|
expression, args, err := initCommand(cmd, args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
stat, _ := os.Stdin.Stat()
|
|
||||||
pipingStdIn := (stat.Mode() & os.ModeCharDevice) == 0
|
|
||||||
yqlib.GetLogger().Debug("pipingStdIn: %v", pipingStdIn)
|
|
||||||
|
|
||||||
yqlib.GetLogger().Debug("stat.Mode(): %v", stat.Mode())
|
|
||||||
yqlib.GetLogger().Debug("ModeDir: %v", stat.Mode()&os.ModeDir)
|
|
||||||
yqlib.GetLogger().Debug("ModeAppend: %v", stat.Mode()&os.ModeAppend)
|
|
||||||
yqlib.GetLogger().Debug("ModeExclusive: %v", stat.Mode()&os.ModeExclusive)
|
|
||||||
yqlib.GetLogger().Debug("ModeTemporary: %v", stat.Mode()&os.ModeTemporary)
|
|
||||||
yqlib.GetLogger().Debug("ModeSymlink: %v", stat.Mode()&os.ModeSymlink)
|
|
||||||
yqlib.GetLogger().Debug("ModeDevice: %v", stat.Mode()&os.ModeDevice)
|
|
||||||
yqlib.GetLogger().Debug("ModeNamedPipe: %v", stat.Mode()&os.ModeNamedPipe)
|
|
||||||
yqlib.GetLogger().Debug("ModeSocket: %v", stat.Mode()&os.ModeSocket)
|
|
||||||
yqlib.GetLogger().Debug("ModeSetuid: %v", stat.Mode()&os.ModeSetuid)
|
|
||||||
yqlib.GetLogger().Debug("ModeSetgid: %v", stat.Mode()&os.ModeSetgid)
|
|
||||||
yqlib.GetLogger().Debug("ModeCharDevice: %v", stat.Mode()&os.ModeCharDevice)
|
|
||||||
yqlib.GetLogger().Debug("ModeSticky: %v", stat.Mode()&os.ModeSticky)
|
|
||||||
yqlib.GetLogger().Debug("ModeIrregular: %v", stat.Mode()&os.ModeIrregular)
|
|
||||||
|
|
||||||
// Mask for the type bits. For regular files, none will be set.
|
|
||||||
yqlib.GetLogger().Debug("ModeType: %v", stat.Mode()&os.ModeType)
|
|
||||||
|
|
||||||
yqlib.GetLogger().Debug("ModePerm: %v", stat.Mode()&os.ModePerm)
|
|
||||||
|
|
||||||
out := cmd.OutOrStdout()
|
|
||||||
|
|
||||||
if writeInplace {
|
if writeInplace {
|
||||||
// only use colors if its forced
|
// only use colors if its forced
|
||||||
colorsEnabled = forceColor
|
colorsEnabled = forceColor
|
||||||
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[firstFileIndex])
|
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[0])
|
||||||
out, err = writeInPlaceHandler.CreateTempFile()
|
out, err = writeInPlaceHandler.CreateTempFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -129,12 +105,12 @@ 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")
|
||||||
frontMatterHandler := yqlib.NewFrontMatterHandler(args[firstFileIndex])
|
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
|
||||||
err = frontMatterHandler.Split()
|
err = frontMatterHandler.Split()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
args[firstFileIndex] = frontMatterHandler.GetYamlFrontMatterFilename()
|
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()
|
||||||
|
|
||||||
if frontMatter == "process" {
|
if frontMatter == "process" {
|
||||||
reader := frontMatterHandler.GetContentReader()
|
reader := frontMatterHandler.GetContentReader()
|
||||||
@ -143,10 +119,6 @@ func evaluateSequence(cmd *cobra.Command, args []string) (cmdError error) {
|
|||||||
}
|
}
|
||||||
defer frontMatterHandler.CleanUp()
|
defer frontMatterHandler.CleanUp()
|
||||||
}
|
}
|
||||||
expression, args, err := processArgs(pipingStdIn, args)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
switch len(args) {
|
switch len(args) {
|
||||||
case 0:
|
case 0:
|
||||||
|
35
cmd/utils.go
35
cmd/utils.go
@ -10,7 +10,7 @@ import (
|
|||||||
"gopkg.in/op/go-logging.v1"
|
"gopkg.in/op/go-logging.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func initCommand(cmd *cobra.Command, args []string) (firstFileIndex int, err error) {
|
func initCommand(cmd *cobra.Command, args []string) (string, []string, error) {
|
||||||
cmd.SilenceUsage = true
|
cmd.SilenceUsage = true
|
||||||
|
|
||||||
fileInfo, _ := os.Stdout.Stat()
|
fileInfo, _ := os.Stdout.Stat()
|
||||||
@ -19,11 +19,9 @@ func initCommand(cmd *cobra.Command, args []string) (firstFileIndex int, err err
|
|||||||
colorsEnabled = true
|
colorsEnabled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
firstFileIndex = -1
|
expression, args, err := processArgs(args)
|
||||||
if !nullInput && len(args) == 1 {
|
if err != nil {
|
||||||
firstFileIndex = 0
|
return "", nil, err
|
||||||
} else if len(args) > 1 {
|
|
||||||
firstFileIndex = 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// backwards compatibility
|
// backwards compatibility
|
||||||
@ -31,19 +29,23 @@ func initCommand(cmd *cobra.Command, args []string) (firstFileIndex int, err err
|
|||||||
outputFormat = "json"
|
outputFormat = "json"
|
||||||
}
|
}
|
||||||
|
|
||||||
if writeInplace && (firstFileIndex == -1) {
|
if writeInplace && (len(args) == 0 || args[0] == "-") {
|
||||||
return 0, fmt.Errorf("write inplace flag only applicable when giving an expression and at least one file")
|
return "", nil, fmt.Errorf("write inplace flag only applicable when giving an expression and at least one file")
|
||||||
|
}
|
||||||
|
|
||||||
|
if frontMatter != "" && len(args) == 0 {
|
||||||
|
return "", nil, fmt.Errorf("front matter flag only applicable when giving an expression and at least one file")
|
||||||
}
|
}
|
||||||
|
|
||||||
if writeInplace && splitFileExp != "" {
|
if writeInplace && splitFileExp != "" {
|
||||||
return 0, fmt.Errorf("write inplace cannot be used with split file")
|
return "", nil, fmt.Errorf("write inplace cannot be used with split file")
|
||||||
}
|
}
|
||||||
|
|
||||||
if nullInput && len(args) > 1 {
|
if nullInput && len(args) > 0 {
|
||||||
return 0, fmt.Errorf("cannot pass files in when using null-input flag")
|
return "", nil, fmt.Errorf("cannot pass files in when using null-input flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
return firstFileIndex, nil
|
return expression, args, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureDecoder() (yqlib.Decoder, error) {
|
func configureDecoder() (yqlib.Decoder, error) {
|
||||||
@ -116,7 +118,10 @@ func maybeFile(str string) bool {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func processStdInArgs(pipingStdin bool, args []string) []string {
|
func processStdInArgs(args []string) []string {
|
||||||
|
stat, _ := os.Stdin.Stat()
|
||||||
|
pipingStdin := (stat.Mode() & os.ModeCharDevice) == 0
|
||||||
|
|
||||||
// if we've been given a file, don't automatically
|
// if we've been given a file, don't automatically
|
||||||
// read from stdin.
|
// read from stdin.
|
||||||
// this happens if there is more than one argument
|
// this happens if there is more than one argument
|
||||||
@ -137,7 +142,7 @@ func processStdInArgs(pipingStdin bool, args []string) []string {
|
|||||||
return append(args, "-")
|
return append(args, "-")
|
||||||
}
|
}
|
||||||
|
|
||||||
func processArgs(pipingStdin bool, originalArgs []string) (string, []string, error) {
|
func processArgs(originalArgs []string) (string, []string, error) {
|
||||||
expression := forceExpression
|
expression := forceExpression
|
||||||
if expressionFile != "" {
|
if expressionFile != "" {
|
||||||
expressionBytes, err := os.ReadFile(expressionFile)
|
expressionBytes, err := os.ReadFile(expressionFile)
|
||||||
@ -147,7 +152,7 @@ func processArgs(pipingStdin bool, originalArgs []string) (string, []string, err
|
|||||||
expression = string(expressionBytes)
|
expression = string(expressionBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
args := processStdInArgs(pipingStdin, originalArgs)
|
args := processStdInArgs(originalArgs)
|
||||||
yqlib.GetLogger().Debugf("processed args: %v", args)
|
yqlib.GetLogger().Debugf("processed args: %v", args)
|
||||||
if expression == "" && len(args) > 0 && args[0] != "-" && !maybeFile(args[0]) {
|
if expression == "" && len(args) > 0 && args[0] != "-" && !maybeFile(args[0]) {
|
||||||
yqlib.GetLogger().Debug("assuming expression is '%v'", args[0])
|
yqlib.GetLogger().Debug("assuming expression is '%v'", args[0])
|
||||||
|
Loading…
Reference in New Issue
Block a user