Skip to content

Commit

Permalink
Fixes bug when using inplace with no expression and multiple files #1193
Browse files Browse the repository at this point in the history
  • Loading branch information
mikefarah committed Apr 26, 2022
1 parent ed5b811 commit 3ad5355
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 80 deletions.
34 changes: 34 additions & 0 deletions acceptance_tests/basic.sh
Expand Up @@ -188,6 +188,40 @@ EOL
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() {
echo "a: cat" > test.yml
X=$(./yq e '.z' test.yml)
Expand Down
34 changes: 4 additions & 30 deletions cmd/evaluate_all_command.go
Expand Up @@ -2,7 +2,6 @@ package cmd

import (
"errors"
"os"

"github.com/mikefarah/yq/v4/pkg/yqlib"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -47,36 +46,17 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) {

var err error

firstFileIndex, err := initCommand(cmd, args)
expression, args, err := initCommand(cmd, args)
if err != nil {
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()

if writeInplace {
// only use colors if its forced
colorsEnabled = forceColor
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[firstFileIndex])
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[0])
out, err = writeInPlaceHandler.CreateTempFile()
if err != nil {
return err
Expand Down Expand Up @@ -109,12 +89,12 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) {
printer := yqlib.NewPrinter(encoder, printerWriter)

if frontMatter != "" {
frontMatterHandler := yqlib.NewFrontMatterHandler(args[firstFileIndex])
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
err = frontMatterHandler.Split()
if err != nil {
return err
}
args[firstFileIndex] = frontMatterHandler.GetYamlFrontMatterFilename()
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()

if frontMatter == "process" {
reader := frontMatterHandler.GetContentReader()
Expand All @@ -126,12 +106,6 @@ func evaluateAll(cmd *cobra.Command, args []string) (cmdError error) {

allAtOnceEvaluator := yqlib.NewAllAtOnceEvaluator()

expression, args, err := processArgs(pipingStdIn, args)
if err != nil {
return err
}
yqlib.GetLogger().Debugf("processed args: %v", args)

switch len(args) {
case 0:
if nullInput {
Expand Down
42 changes: 7 additions & 35 deletions cmd/evalute_sequence_command.go
Expand Up @@ -3,7 +3,6 @@ package cmd
import (
"errors"
"fmt"
"os"

"github.com/mikefarah/yq/v4/pkg/yqlib"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -59,42 +58,19 @@ func evaluateSequence(cmd *cobra.Command, args []string) (cmdError error) {
// 1 arg, read file in sequence
// 2+ args, [0] = expression, file the rest

out := cmd.OutOrStdout()

var err error
firstFileIndex, err := initCommand(cmd, args)

expression, args, err := initCommand(cmd, args)
if err != nil {
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 {
// only use colors if its forced
colorsEnabled = forceColor
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[firstFileIndex])
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[0])
out, err = writeInPlaceHandler.CreateTempFile()
if err != nil {
return err
Expand Down Expand Up @@ -129,12 +105,12 @@ func evaluateSequence(cmd *cobra.Command, args []string) (cmdError error) {

if frontMatter != "" {
yqlib.GetLogger().Debug("using front matter handler")
frontMatterHandler := yqlib.NewFrontMatterHandler(args[firstFileIndex])
frontMatterHandler := yqlib.NewFrontMatterHandler(args[0])
err = frontMatterHandler.Split()
if err != nil {
return err
}
args[firstFileIndex] = frontMatterHandler.GetYamlFrontMatterFilename()
args[0] = frontMatterHandler.GetYamlFrontMatterFilename()

if frontMatter == "process" {
reader := frontMatterHandler.GetContentReader()
Expand All @@ -143,10 +119,6 @@ func evaluateSequence(cmd *cobra.Command, args []string) (cmdError error) {
}
defer frontMatterHandler.CleanUp()
}
expression, args, err := processArgs(pipingStdIn, args)
if err != nil {
return err
}

switch len(args) {
case 0:
Expand Down
35 changes: 20 additions & 15 deletions cmd/utils.go
Expand Up @@ -10,7 +10,7 @@ import (
"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

fileInfo, _ := os.Stdout.Stat()
Expand All @@ -19,31 +19,33 @@ func initCommand(cmd *cobra.Command, args []string) (firstFileIndex int, err err
colorsEnabled = true
}

firstFileIndex = -1
if !nullInput && len(args) == 1 {
firstFileIndex = 0
} else if len(args) > 1 {
firstFileIndex = 1
expression, args, err := processArgs(args)
if err != nil {
return "", nil, err
}

// backwards compatibility
if outputToJSON {
outputFormat = "json"
}

if writeInplace && (firstFileIndex == -1) {
return 0, fmt.Errorf("write inplace flag only applicable when giving an expression and at least one file")
if writeInplace && (len(args) == 0 || args[0] == "-") {
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 != "" {
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 {
return 0, fmt.Errorf("cannot pass files in when using null-input flag")
if nullInput && len(args) > 0 {
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) {
Expand Down Expand Up @@ -116,7 +118,10 @@ func maybeFile(str string) bool {
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
// read from stdin.
// this happens if there is more than one argument
Expand All @@ -137,7 +142,7 @@ func processStdInArgs(pipingStdin bool, args []string) []string {
return append(args, "-")
}

func processArgs(pipingStdin bool, originalArgs []string) (string, []string, error) {
func processArgs(originalArgs []string) (string, []string, error) {
expression := forceExpression
if expressionFile != "" {
expressionBytes, err := os.ReadFile(expressionFile)
Expand All @@ -147,7 +152,7 @@ func processArgs(pipingStdin bool, originalArgs []string) (string, []string, err
expression = string(expressionBytes)
}

args := processStdInArgs(pipingStdin, originalArgs)
args := processStdInArgs(originalArgs)
yqlib.GetLogger().Debugf("processed args: %v", args)
if expression == "" && len(args) > 0 && args[0] != "-" && !maybeFile(args[0]) {
yqlib.GetLogger().Debug("assuming expression is '%v'", args[0])
Expand Down

0 comments on commit 3ad5355

Please sign in to comment.