diff --git a/pkg/yqlib/operator_traverse_path.go b/pkg/yqlib/operator_traverse_path.go index baaa4d27ec..b50aa3af84 100644 --- a/pkg/yqlib/operator_traverse_path.go +++ b/pkg/yqlib/operator_traverse_path.go @@ -309,6 +309,9 @@ func doTraverseMap(newMatches *orderedmap.OrderedMap, candidate *CandidateNode, func traverseMergeAnchor(newMatches *orderedmap.OrderedMap, originalCandidate *CandidateNode, value *yaml.Node, wantedKey string, prefs traversePreferences, splat bool) error { switch value.Kind { case yaml.AliasNode: + if value.Alias.Kind != yaml.MappingNode { + return fmt.Errorf("can only use merge anchors with maps (!!map), but got %v", value.Alias.Tag) + } candidateNode := originalCandidate.CreateReplacement(value.Alias) return doTraverseMap(newMatches, candidateNode, wantedKey, prefs, splat) case yaml.SequenceNode: diff --git a/pkg/yqlib/operator_traverse_path_test.go b/pkg/yqlib/operator_traverse_path_test.go index d0addbb615..464cbba557 100644 --- a/pkg/yqlib/operator_traverse_path_test.go +++ b/pkg/yqlib/operator_traverse_path_test.go @@ -26,6 +26,15 @@ foobar: thing: foobar_thing ` +// cannot use merge anchors with arrays +var badAliasSample = ` +_common: &common-docker-file + - FROM ubuntu:18.04 + +steps: + <<: *common-docker-file +` + var traversePathOperatorScenarios = []expressionScenario{ { skipDoc: true, @@ -529,6 +538,12 @@ var traversePathOperatorScenarios = []expressionScenario{ "D0, P[a 2], (!!str)::c\n", }, }, + { + skipDoc: true, + document: badAliasSample, + expression: ".steps[]", + expectedError: "can only use merge anchors with maps (!!map), but got !!seq", + }, } func TestTraversePathOperatorScenarios(t *testing.T) {