Fixed inplace errors clearing out original file

This commit is contained in:
Mike Farah 2020-04-15 11:48:11 +10:00
parent 55511de9af
commit 6f0a329331
2 changed files with 23 additions and 2 deletions

View File

@ -1927,6 +1927,22 @@ func TestWriteCmd_Inplace(t *testing.T) {
test.AssertResult(t, expectedOutput, strings.Trim(gotOutput, "\n ")) test.AssertResult(t, expectedOutput, strings.Trim(gotOutput, "\n "))
} }
func TestWriteCmd_InplaceError(t *testing.T) {
content := `b: cat
c: 3
`
filename := test.WriteTempYamlFile(content)
defer test.RemoveTempYamlFile(filename)
cmd := getRootCommand()
result := test.RunCmd(cmd, fmt.Sprintf("write -i %s b.c 7", filename))
if result.Error == nil {
t.Error("Expected Error to occur!")
}
gotOutput := test.ReadTempYamlFile(filename)
test.AssertResult(t, content, gotOutput)
}
func TestWriteCmd_Append(t *testing.T) { func TestWriteCmd_Append(t *testing.T) {
content := `b: content := `b:
- foo - foo

View File

@ -351,6 +351,7 @@ func updateDoc(inputFile string, updateCommands []yqlib.UpdateCommand, writer io
func readAndUpdate(stdOut io.Writer, inputFile string, updateData updateDataFn) error { func readAndUpdate(stdOut io.Writer, inputFile string, updateData updateDataFn) error {
var destination io.Writer var destination io.Writer
var destinationName string var destinationName string
var completedSuccessfully = false
if writeInplace { if writeInplace {
info, err := os.Stat(inputFile) info, err := os.Stat(inputFile)
if err != nil { if err != nil {
@ -368,7 +369,9 @@ func readAndUpdate(stdOut io.Writer, inputFile string, updateData updateDataFn)
destination = tempFile destination = tempFile
defer func() { defer func() {
safelyCloseFile(tempFile) safelyCloseFile(tempFile)
if completedSuccessfully {
safelyRenameFile(tempFile.Name(), inputFile) safelyRenameFile(tempFile.Name(), inputFile)
}
}() }()
} else { } else {
destination = stdOut destination = stdOut
@ -387,7 +390,9 @@ func readAndUpdate(stdOut io.Writer, inputFile string, updateData updateDataFn)
encoder = yqlib.NewYamlEncoder(bufferedWriter, indent, colorsEnabled) encoder = yqlib.NewYamlEncoder(bufferedWriter, indent, colorsEnabled)
} }
return readStream(inputFile, mapYamlDecoder(updateData, encoder)) var errorProcessing = readStream(inputFile, mapYamlDecoder(updateData, encoder))
completedSuccessfully = errorProcessing == nil
return errorProcessing
} }
type updateCommandParsed struct { type updateCommandParsed struct {