diff --git a/cmd/constant.go b/cmd/constant.go index efc0d1bd..98e20796 100644 --- a/cmd/constant.go +++ b/cmd/constant.go @@ -14,3 +14,5 @@ var noDocSeparators = false var nullInput = false var verbose = false var version = false + +var completedSuccessfully = false diff --git a/cmd/evaluate_all_command.go b/cmd/evaluate_all_command.go index 00daffda..ec4bf20a 100644 --- a/cmd/evaluate_all_command.go +++ b/cmd/evaluate_all_command.go @@ -45,15 +45,17 @@ func evaluateAll(cmd *cobra.Command, args []string) error { return fmt.Errorf("Write inplace flag only applicable when giving an expression and at least one file") } - completedSuccessfully := false - if writeInplace { + // only use colors if its forced + colorsEnabled = forceColor writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[1]) out, err = writeInPlaceHandler.CreateTempFile() if err != nil { return err } - defer writeInPlaceHandler.FinishWriteInPlace(completedSuccessfully) + // need to indirectly call the function so that completedSuccessfully is + // passed when we finish execution as opposed to now + defer func() { writeInPlaceHandler.FinishWriteInPlace(completedSuccessfully) }() } printer := yqlib.NewPrinter(out, outputToJSON, unwrapScalar, colorsEnabled, indent, !noDocSeparators) diff --git a/cmd/evalute_sequence_command.go b/cmd/evalute_sequence_command.go index 56125fbb..cdd70bd0 100644 --- a/cmd/evalute_sequence_command.go +++ b/cmd/evalute_sequence_command.go @@ -1,6 +1,7 @@ package cmd import ( + "fmt" "os" "github.com/mikefarah/yq/v4/pkg/yqlib" @@ -39,6 +40,24 @@ func evaluateSequence(cmd *cobra.Command, args []string) error { if forceColor || (!forceNoColor && (fileInfo.Mode()&os.ModeCharDevice) != 0) { colorsEnabled = true } + + if writeInplace && len(args) < 2 { + return fmt.Errorf("Write inplace flag only applicable when giving an expression and at least one file") + } + + if writeInplace { + // only use colors if its forced + colorsEnabled = forceColor + writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[1]) + out, err = writeInPlaceHandler.CreateTempFile() + if err != nil { + return err + } + // need to indirectly call the function so that completedSuccessfully is + // passed when we finish execution as opposed to now + defer func() { writeInPlaceHandler.FinishWriteInPlace(completedSuccessfully) }() + } + printer := yqlib.NewPrinter(out, outputToJSON, unwrapScalar, colorsEnabled, indent, !noDocSeparators) streamEvaluator := yqlib.NewStreamEvaluator() @@ -61,7 +80,7 @@ func evaluateSequence(cmd *cobra.Command, args []string) error { default: err = streamEvaluator.EvaluateFiles(args[0], args[1:], printer) } - + completedSuccessfully = err == nil cmd.SilenceUsage = true return err } diff --git a/pkg/yqlib/constants.go b/pkg/yqlib/constants.go deleted file mode 100644 index d8c4f7d6..00000000 --- a/pkg/yqlib/constants.go +++ /dev/null @@ -1,5 +0,0 @@ -package yqlib - -import "gopkg.in/op/go-logging.v1" - -var log = logging.MustGetLogger("yq-lib") diff --git a/pkg/yqlib/lib.go b/pkg/yqlib/lib.go index d6782658..e3693f06 100644 --- a/pkg/yqlib/lib.go +++ b/pkg/yqlib/lib.go @@ -9,6 +9,8 @@ import ( yaml "gopkg.in/yaml.v3" ) +var log = logging.MustGetLogger("yq-lib") + type OperationType struct { Type string NumArgs uint // number of arguments to the op diff --git a/pkg/yqlib/write_in_place_handler.go b/pkg/yqlib/write_in_place_handler.go index b282c044..a4fbb013 100644 --- a/pkg/yqlib/write_in_place_handler.go +++ b/pkg/yqlib/write_in_place_handler.go @@ -41,15 +41,19 @@ func (w *writeInPlaceHandler) CreateTempFile() (*os.File, error) { } err = os.Chmod(file.Name(), info.Mode()) + log.Debug("writing to tempfile: %v", file.Name()) w.tempFile = file return file, err } func (w *writeInPlaceHandler) FinishWriteInPlace(evaluatedSuccessfully bool) { + log.Debug("Going to write-inplace, evaluatedSuccessfully=%v, target=%v", evaluatedSuccessfully, w.inputFilename) safelyCloseFile(w.tempFile) if evaluatedSuccessfully { + log.Debug("moved temp file to target") safelyRenameFile(w.tempFile.Name(), w.inputFilename) } else { + log.Debug("removed temp file") os.Remove(w.tempFile.Name()) } }