@@ -92,22 +92,22 @@ func applyUpdateAction(root *yaml.Node, action Action) error {
9292 nodes := p .Query (root )
9393
9494 for _ , node := range nodes {
95- if err := updateNode (node , action .Update ); err != nil {
95+ if err := updateNode (node , & action .Update ); err != nil {
9696 return err
9797 }
9898 }
9999
100100 return nil
101101}
102102
103- func updateNode (node * yaml.Node , updateNode yaml.Node ) error {
103+ func updateNode (node * yaml.Node , updateNode * yaml.Node ) error {
104104 mergeNode (node , updateNode )
105105 return nil
106106}
107107
108- func mergeNode (node * yaml.Node , merge yaml.Node ) {
108+ func mergeNode (node * yaml.Node , merge * yaml.Node ) {
109109 if node .Kind != merge .Kind {
110- * node = merge
110+ * node = * clone ( merge )
111111 return
112112 }
113113 switch node .Kind {
@@ -122,7 +122,7 @@ func mergeNode(node *yaml.Node, merge yaml.Node) {
122122
123123// mergeMappingNode will perform a shallow merge of the merge node into the main
124124// node.
125- func mergeMappingNode (node * yaml.Node , merge yaml.Node ) {
125+ func mergeMappingNode (node * yaml.Node , merge * yaml.Node ) {
126126NextKey:
127127 for i := 0 ; i < len (merge .Content ); i += 2 {
128128 mergeKey := merge .Content [i ].Value
@@ -131,16 +131,39 @@ NextKey:
131131 for j := 0 ; j < len (node .Content ); j += 2 {
132132 nodeKey := node .Content [j ].Value
133133 if nodeKey == mergeKey {
134- mergeNode (node .Content [j + 1 ], * mergeValue )
134+ mergeNode (node .Content [j + 1 ], mergeValue )
135135 continue NextKey
136136 }
137137 }
138138
139- node .Content = append (node .Content , merge .Content [i ], mergeValue )
139+ node .Content = append (node .Content , merge .Content [i ], clone ( mergeValue ) )
140140 }
141141}
142142
143143// mergeSequenceNode will append the merge node's content to the original node.
144- func mergeSequenceNode (node * yaml.Node , merge yaml.Node ) {
145- node .Content = append (node .Content , merge .Content ... )
144+ func mergeSequenceNode (node * yaml.Node , merge * yaml.Node ) {
145+ node .Content = append (node .Content , clone (merge ).Content ... )
146+ }
147+
148+ func clone (node * yaml.Node ) * yaml.Node {
149+ newNode := & yaml.Node {
150+ Kind : node .Kind ,
151+ Style : node .Style ,
152+ Tag : node .Tag ,
153+ Value : node .Value ,
154+ Anchor : node .Anchor ,
155+ HeadComment : node .HeadComment ,
156+ LineComment : node .LineComment ,
157+ FootComment : node .FootComment ,
158+ }
159+ if node .Alias != nil {
160+ newNode .Alias = clone (node .Alias )
161+ }
162+ if node .Content != nil {
163+ newNode .Content = make ([]* yaml.Node , len (node .Content ))
164+ for i , child := range node .Content {
165+ newNode .Content [i ] = clone (child )
166+ }
167+ }
168+ return newNode
146169}
0 commit comments