Fixes bug when using inplace with no expression and multiple files #1193

This commit is contained in:
Mike Farah 2022-04-27 09:08:50 +10:00
parent ed5b811f37
commit 3ad5355777
4 changed files with 65 additions and 80 deletions

View File

@ -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)

View File

@ -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 {

View File

@ -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:

View File

@ -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])