@@ -92,22 +92,22 @@ func applyUpdateAction(root *yaml.Node, action Action) error {
92
92
nodes := p .Query (root )
93
93
94
94
for _ , node := range nodes {
95
- if err := updateNode (node , action .Update ); err != nil {
95
+ if err := updateNode (node , & action .Update ); err != nil {
96
96
return err
97
97
}
98
98
}
99
99
100
100
return nil
101
101
}
102
102
103
- func updateNode (node * yaml.Node , updateNode yaml.Node ) error {
103
+ func updateNode (node * yaml.Node , updateNode * yaml.Node ) error {
104
104
mergeNode (node , updateNode )
105
105
return nil
106
106
}
107
107
108
- func mergeNode (node * yaml.Node , merge yaml.Node ) {
108
+ func mergeNode (node * yaml.Node , merge * yaml.Node ) {
109
109
if node .Kind != merge .Kind {
110
- * node = merge
110
+ * node = * clone ( merge )
111
111
return
112
112
}
113
113
switch node .Kind {
@@ -122,7 +122,7 @@ func mergeNode(node *yaml.Node, merge yaml.Node) {
122
122
123
123
// mergeMappingNode will perform a shallow merge of the merge node into the main
124
124
// node.
125
- func mergeMappingNode (node * yaml.Node , merge yaml.Node ) {
125
+ func mergeMappingNode (node * yaml.Node , merge * yaml.Node ) {
126
126
NextKey:
127
127
for i := 0 ; i < len (merge .Content ); i += 2 {
128
128
mergeKey := merge .Content [i ].Value
@@ -131,16 +131,39 @@ NextKey:
131
131
for j := 0 ; j < len (node .Content ); j += 2 {
132
132
nodeKey := node .Content [j ].Value
133
133
if nodeKey == mergeKey {
134
- mergeNode (node .Content [j + 1 ], * mergeValue )
134
+ mergeNode (node .Content [j + 1 ], mergeValue )
135
135
continue NextKey
136
136
}
137
137
}
138
138
139
- node .Content = append (node .Content , merge .Content [i ], mergeValue )
139
+ node .Content = append (node .Content , merge .Content [i ], clone ( mergeValue ) )
140
140
}
141
141
}
142
142
143
143
// 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
146
169
}
0 commit comments