From 83c13ce392339a6e3c59626d42663c4c7397008c Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Thu, 13 Feb 2020 14:56:54 +1100 Subject: [PATCH] Fixed empty merge problem - need to visit empty arrays and objects --- cmd/commands_test.go | 22 ++++++++++++++++++++++ pkg/yqlib/data_navigator.go | 6 +++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/cmd/commands_test.go b/cmd/commands_test.go index c1c962e1..4230e6da 100644 --- a/cmd/commands_test.go +++ b/cmd/commands_test.go @@ -575,6 +575,28 @@ func TestReadEmptyContentCmd(t *testing.T) { test.AssertResult(t, expectedOutput, result.Output) } +func TestReadEmptyNodesPrintPathCmd(t *testing.T) { + content := `map: + that: {} +array: + great: [] +null: + indeed: ~` + filename := test.WriteTempYamlFile(content) + defer test.RemoveTempYamlFile(filename) + + cmd := getRootCommand() + result := test.RunCmd(cmd, fmt.Sprintf("read %s -ppv **", filename)) + if result.Error != nil { + t.Error(result.Error) + } + expectedOutput := `map.that: {} +array.great: [] +null.indeed: ~ +` + test.AssertResult(t, expectedOutput, result.Output) +} + func TestReadEmptyContentWithDefaultValueCmd(t *testing.T) { content := `` filename := test.WriteTempYamlFile(content) diff --git a/pkg/yqlib/data_navigator.go b/pkg/yqlib/data_navigator.go index 8f4d52f9..a05d10ba 100644 --- a/pkg/yqlib/data_navigator.go +++ b/pkg/yqlib/data_navigator.go @@ -84,6 +84,8 @@ func (n *navigator) recurse(value *yaml.Node, head interface{}, tail []interface if head == "+" { return n.appendArray(value, head, tail, pathStack) + } else if len(value.Content) == 0 && head == "**" { + return n.navigationStrategy.Visit(NewNodeContext(value, head, tail, pathStack)) } return n.splatArray(value, head, tail, pathStack) } @@ -126,7 +128,9 @@ func (n *navigator) recurseMap(value *yaml.Node, head string, tail []interface{} return errorVisiting } - if traversedEntry || n.navigationStrategy.GetPathParser().IsPathExpression(head) || !n.navigationStrategy.AutoCreateMap(NewNodeContext(value, head, tail, pathStack)) { + if len(value.Content) == 0 && head == "**" { + return n.navigationStrategy.Visit(NewNodeContext(value, head, tail, pathStack)) + } else if traversedEntry || n.navigationStrategy.GetPathParser().IsPathExpression(head) || !n.navigationStrategy.AutoCreateMap(NewNodeContext(value, head, tail, pathStack)) { return nil }