diff --git a/pkg/yqlib/matchKeyString_test.go b/pkg/yqlib/matchKeyString_test.go index 3cacb4a5..9fdd75a1 100644 --- a/pkg/yqlib/matchKeyString_test.go +++ b/pkg/yqlib/matchKeyString_test.go @@ -12,6 +12,7 @@ func TestDeepMatch(t *testing.T) { ok bool }{ {"", "", true}, + {"<<", "<<", true}, {"", "x", false}, {"x", "", false}, {"abc", "abc", true}, diff --git a/pkg/yqlib/operator_traverse_path.go b/pkg/yqlib/operator_traverse_path.go index 6bf3adf1..93a3fdb7 100644 --- a/pkg/yqlib/operator_traverse_path.go +++ b/pkg/yqlib/operator_traverse_path.go @@ -269,7 +269,7 @@ func doTraverseMap(newMatches *orderedmap.OrderedMap, node *CandidateNode, wante value := contents[index+1] //skip the 'merge' tag, find a direct match first - if key.Tag == "!!merge" && !prefs.DontFollowAlias { + if key.Tag == "!!merge" && !prefs.DontFollowAlias && wantedKey != "<<" { log.Debug("Merge anchor") err := traverseMergeAnchor(newMatches, value, wantedKey, prefs, splat) if err != nil { diff --git a/pkg/yqlib/operator_traverse_path_test.go b/pkg/yqlib/operator_traverse_path_test.go index 55887ee7..2bc78947 100644 --- a/pkg/yqlib/operator_traverse_path_test.go +++ b/pkg/yqlib/operator_traverse_path_test.go @@ -35,6 +35,15 @@ steps: ` var traversePathOperatorScenarios = []expressionScenario{ + { + skipDoc: true, + description: "access merge anchors", + document: "foo: &foo {x: y}\nbar:\n <<: *foo\n", + expression: `.bar["<<"] | alias`, + expected: []string{ + "D0, P[bar <<], (!!str)::foo\n", + }, + }, { skipDoc: true, description: "dynamically set parent and key",