From c7ef94603155dee1f1a73c20f2350a989b726bd9 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Tue, 14 Nov 2023 13:00:30 +1100 Subject: [PATCH] Fixed multi doc anchor bug #1861 --- pkg/yqlib/decoder_yaml.go | 6 +++++- pkg/yqlib/yaml_test.go | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/yqlib/decoder_yaml.go b/pkg/yqlib/decoder_yaml.go index 57eb3eee..f6a6f3d9 100644 --- a/pkg/yqlib/decoder_yaml.go +++ b/pkg/yqlib/decoder_yaml.go @@ -20,6 +20,9 @@ type yamlDecoder struct { leadingContent string bufferRead bytes.Buffer + // anchor map persists over multiple documents for convenience. + anchorMap map[string]*CandidateNode + readAnything bool firstFile bool documentIndex uint @@ -95,6 +98,7 @@ func (dec *yamlDecoder) Init(reader io.Reader) error { dec.decoder = *yaml.NewDecoder(readerToUse) dec.firstFile = false dec.documentIndex = 0 + dec.anchorMap = make(map[string]*CandidateNode) return nil } @@ -121,7 +125,7 @@ func (dec *yamlDecoder) Decode() (*CandidateNode, error) { candidateNode := CandidateNode{document: dec.documentIndex} // don't bother with the DocumentNode - err = candidateNode.UnmarshalYAML(yamlNode.Content[0], make(map[string]*CandidateNode)) + err = candidateNode.UnmarshalYAML(yamlNode.Content[0], dec.anchorMap) if err != nil { return nil, err } diff --git a/pkg/yqlib/yaml_test.go b/pkg/yqlib/yaml_test.go index 0d75433f..6306dc77 100644 --- a/pkg/yqlib/yaml_test.go +++ b/pkg/yqlib/yaml_test.go @@ -32,6 +32,13 @@ var yamlFormatScenarios = []formatScenario{ input: "[null]", expected: "[null]\n", }, + { + description: "multi document anchor map", + skipDoc: true, + input: "a: &remember mike\n---\nb: *remember", + expression: "explode(.)", + expected: "a: mike\n---\nb: mike\n", + }, { description: "basic - [~]", skipDoc: true,