mirror of
https://github.com/mikefarah/yq.git
synced 2024-12-19 20:19:04 +00:00
Fixed deep splatting merge anchors - dont visit twice
This commit is contained in:
parent
6f0538173b
commit
02258fbaae
@ -247,6 +247,32 @@ func TestReadAnchorsWithKeyAndValueCmd(t *testing.T) {
|
|||||||
test.AssertResult(t, "foobar.a: 1\n", result.Output)
|
test.AssertResult(t, "foobar.a: 1\n", result.Output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReadAllAnchorsWithKeyAndValueCmd(t *testing.T) {
|
||||||
|
cmd := getRootCommand()
|
||||||
|
result := test.RunCmd(cmd, "read -p pv ../examples/merge-anchor.yaml **")
|
||||||
|
if result.Error != nil {
|
||||||
|
t.Error(result.Error)
|
||||||
|
}
|
||||||
|
expectedOutput := `foo.a: original
|
||||||
|
foo.thing: coolasdf
|
||||||
|
foo.thirsty: yep
|
||||||
|
bar.b: 2
|
||||||
|
bar.thing: coconut
|
||||||
|
bar.c: oldbar
|
||||||
|
foobarList.c: newbar
|
||||||
|
foobarList.b: 2
|
||||||
|
foobarList.thing: coconut
|
||||||
|
foobarList.a: original
|
||||||
|
foobarList.thirsty: yep
|
||||||
|
foobar.thirty: well beyond
|
||||||
|
foobar.thing: ice
|
||||||
|
foobar.c: 3
|
||||||
|
foobar.a: original
|
||||||
|
foobar.thirsty: yep
|
||||||
|
`
|
||||||
|
test.AssertResult(t, expectedOutput, result.Output)
|
||||||
|
}
|
||||||
|
|
||||||
func TestReadMergeAnchorsOriginalCmd(t *testing.T) {
|
func TestReadMergeAnchorsOriginalCmd(t *testing.T) {
|
||||||
cmd := getRootCommand()
|
cmd := getRootCommand()
|
||||||
result := test.RunCmd(cmd, "read ../examples/merge-anchor.yaml foobar.a")
|
result := test.RunCmd(cmd, "read ../examples/merge-anchor.yaml foobar.a")
|
||||||
|
@ -35,7 +35,9 @@ func (n *navigator) doTraverse(value *yaml.Node, head string, tail []string, pat
|
|||||||
DebugNode(value)
|
DebugNode(value)
|
||||||
var errorDeepSplatting error
|
var errorDeepSplatting error
|
||||||
if head == "**" && value.Kind != yaml.ScalarNode {
|
if head == "**" && value.Kind != yaml.ScalarNode {
|
||||||
|
if len(pathStack) == 0 || pathStack[len(pathStack)-1] != "<<" {
|
||||||
errorDeepSplatting = n.recurse(value, head, tail, pathStack)
|
errorDeepSplatting = n.recurse(value, head, tail, pathStack)
|
||||||
|
}
|
||||||
// ignore errors here, we are deep splatting so we may accidently give a string key
|
// ignore errors here, we are deep splatting so we may accidently give a string key
|
||||||
// to an array sequence
|
// to an array sequence
|
||||||
if len(tail) > 0 {
|
if len(tail) > 0 {
|
||||||
@ -93,10 +95,9 @@ func (n *navigator) recurse(value *yaml.Node, head string, tail []string, pathSt
|
|||||||
func (n *navigator) recurseMap(value *yaml.Node, head string, tail []string, pathStack []interface{}) error {
|
func (n *navigator) recurseMap(value *yaml.Node, head string, tail []string, pathStack []interface{}) error {
|
||||||
traversedEntry := false
|
traversedEntry := false
|
||||||
errorVisiting := n.visitMatchingEntries(value, head, tail, pathStack, func(contents []*yaml.Node, indexInMap int) error {
|
errorVisiting := n.visitMatchingEntries(value, head, tail, pathStack, func(contents []*yaml.Node, indexInMap int) error {
|
||||||
log.Debug("recurseMap: visitMatchingEntries")
|
log.Debug("recurseMap: visitMatchingEntries for %v", contents[indexInMap].Value)
|
||||||
n.navigationStrategy.DebugVisitedNodes()
|
n.navigationStrategy.DebugVisitedNodes()
|
||||||
newPathStack := append(pathStack, contents[indexInMap].Value)
|
newPathStack := append(pathStack, contents[indexInMap].Value)
|
||||||
log.Debug("appended %v", contents[indexInMap].Value)
|
|
||||||
n.navigationStrategy.DebugVisitedNodes()
|
n.navigationStrategy.DebugVisitedNodes()
|
||||||
log.Debug("should I traverse? head: %v, path: %v", head, pathStackToString(newPathStack))
|
log.Debug("should I traverse? head: %v, path: %v", head, pathStackToString(newPathStack))
|
||||||
DebugNode(value)
|
DebugNode(value)
|
||||||
|
Loading…
Reference in New Issue
Block a user