mirror of
https://github.com/mikefarah/yq.git
synced 2024-11-12 13:48:06 +00:00
Fixed bug when splatting empty array #1613
This commit is contained in:
parent
496035c75a
commit
a389bb64b8
@ -27,6 +27,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
|
|||||||
log.Debugf("-- collectOperation")
|
log.Debugf("-- collectOperation")
|
||||||
|
|
||||||
if context.MatchingNodes.Len() == 0 {
|
if context.MatchingNodes.Len() == 0 {
|
||||||
|
log.Debugf("nothing to collect")
|
||||||
node := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq", Value: "[]"}
|
node := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq", Value: "[]"}
|
||||||
candidate := &CandidateNode{Node: node}
|
candidate := &CandidateNode{Node: node}
|
||||||
return context.SingleChildContext(candidate), nil
|
return context.SingleChildContext(candidate), nil
|
||||||
@ -41,6 +42,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
|
|||||||
}
|
}
|
||||||
|
|
||||||
if evaluateAllTogether {
|
if evaluateAllTogether {
|
||||||
|
log.Debugf("collect together")
|
||||||
collectedNode, err := collectTogether(d, context, expressionNode.RHS)
|
collectedNode, err := collectTogether(d, context, expressionNode.RHS)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Context{}, err
|
return Context{}, err
|
||||||
@ -56,6 +58,8 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
|
|||||||
collectedNode := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq"}
|
collectedNode := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq"}
|
||||||
collectCandidate := candidate.CreateReplacement(collectedNode)
|
collectCandidate := candidate.CreateReplacement(collectedNode)
|
||||||
|
|
||||||
|
log.Debugf("collect rhs: %v", expressionNode.RHS.Operation.toString())
|
||||||
|
|
||||||
collectExpResults, err := d.GetMatchingNodes(context.SingleChildContext(candidate), expressionNode.RHS)
|
collectExpResults, err := d.GetMatchingNodes(context.SingleChildContext(candidate), expressionNode.RHS)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Context{}, err
|
return Context{}, err
|
||||||
@ -66,6 +70,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
|
|||||||
log.Debugf("found this: %v", NodeToString(resultC))
|
log.Debugf("found this: %v", NodeToString(resultC))
|
||||||
collectedNode.Content = append(collectedNode.Content, unwrapDoc(resultC.Node))
|
collectedNode.Content = append(collectedNode.Content, unwrapDoc(resultC.Node))
|
||||||
}
|
}
|
||||||
|
log.Debugf("done collect rhs: %v", expressionNode.RHS.Operation.toString())
|
||||||
|
|
||||||
results.PushBack(collectCandidate)
|
results.PushBack(collectCandidate)
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,8 @@ func traverseArrayOperator(d *dataTreeNavigator, context Context, expressionNode
|
|||||||
// BUT we still return the original context back (see jq)
|
// BUT we still return the original context back (see jq)
|
||||||
// https://stedolan.github.io/jq/manual/#Variable/SymbolicBindingOperator:...as$identifier|...
|
// https://stedolan.github.io/jq/manual/#Variable/SymbolicBindingOperator:...as$identifier|...
|
||||||
|
|
||||||
|
log.Debugf("--traverseArrayOperator")
|
||||||
|
|
||||||
if expressionNode.RHS != nil && expressionNode.RHS.RHS != nil && expressionNode.RHS.RHS.Operation.OperationType == createMapOpType {
|
if expressionNode.RHS != nil && expressionNode.RHS.RHS != nil && expressionNode.RHS.RHS.Operation.OperationType == createMapOpType {
|
||||||
return sliceArrayOperator(d, context, expressionNode.RHS.RHS)
|
return sliceArrayOperator(d, context, expressionNode.RHS.RHS)
|
||||||
}
|
}
|
||||||
@ -103,6 +105,8 @@ func traverseArrayOperator(d *dataTreeNavigator, context Context, expressionNode
|
|||||||
}
|
}
|
||||||
var indicesToTraverse = rhs.MatchingNodes.Front().Value.(*CandidateNode).Node.Content
|
var indicesToTraverse = rhs.MatchingNodes.Front().Value.(*CandidateNode).Node.Content
|
||||||
|
|
||||||
|
log.Debugf("indicesToTraverse %v", len(indicesToTraverse))
|
||||||
|
|
||||||
//now we traverse the result of the lhs against the indices we found
|
//now we traverse the result of the lhs against the indices we found
|
||||||
result, err := traverseNodesWithArrayIndices(lhs, indicesToTraverse, prefs)
|
result, err := traverseNodesWithArrayIndices(lhs, indicesToTraverse, prefs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -231,7 +235,8 @@ func traverseMap(context Context, matchingNode *CandidateNode, keyNode *yaml.Nod
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !prefs.DontAutoCreate && !context.DontAutoCreate && newMatches.Len() == 0 {
|
if !splat && !prefs.DontAutoCreate && !context.DontAutoCreate && newMatches.Len() == 0 {
|
||||||
|
log.Debugf("no matches, creating one")
|
||||||
//no matches, create one automagically
|
//no matches, create one automagically
|
||||||
valueNode := &yaml.Node{Tag: "!!null", Kind: yaml.ScalarNode, Value: "null"}
|
valueNode := &yaml.Node{Tag: "!!null", Kind: yaml.ScalarNode, Value: "null"}
|
||||||
|
|
||||||
|
@ -35,6 +35,13 @@ steps:
|
|||||||
`
|
`
|
||||||
|
|
||||||
var traversePathOperatorScenarios = []expressionScenario{
|
var traversePathOperatorScenarios = []expressionScenario{
|
||||||
|
{
|
||||||
|
skipDoc: true,
|
||||||
|
description: "splat empty map",
|
||||||
|
document: "{}",
|
||||||
|
expression: ".[]",
|
||||||
|
expected: []string{},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
skipDoc: true,
|
skipDoc: true,
|
||||||
document: `[[1]]`,
|
document: `[[1]]`,
|
||||||
|
Loading…
Reference in New Issue
Block a user