@@ -17,8 +17,6 @@ limitations under the License.
17
17
package typed
18
18
19
19
import (
20
- "math"
21
-
22
20
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
23
21
"sigs.k8s.io/structured-merge-diff/v4/schema"
24
22
"sigs.k8s.io/structured-merge-diff/v4/value"
@@ -170,7 +168,11 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err
170
168
if lhs != nil {
171
169
lLen = lhs .Length ()
172
170
}
173
- out := make ([]interface {}, 0 , int (math .Max (float64 (rLen ), float64 (lLen ))))
171
+ outLen := lLen
172
+ if outLen < rLen {
173
+ outLen = rLen
174
+ }
175
+ out := make ([]interface {}, 0 , outLen )
174
176
175
177
createPathElementsValues := func (name string , list value.List ) ([]fieldpath.PathElement , fieldpath.PathElementValueMap , ValidationErrors ) {
176
178
var errs ValidationErrors
@@ -190,11 +192,11 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err
190
192
// this element.
191
193
continue
192
194
}
193
- if _ , _ , found := observed .Get (pe ); found {
195
+ if _ , found := observed .Get (pe ); found {
194
196
errs = append (errs , errorf ("%s: duplicate entries for key %v" , name , pe .String ())... )
195
197
continue
196
198
}
197
- observed .Insert (pe , child , i )
199
+ observed .Insert (pe , child )
198
200
pes = append (pes , pe )
199
201
}
200
202
return pes , observed , errs
@@ -204,6 +206,7 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err
204
206
errs = append (errs , lhsErrs ... )
205
207
rhsOrder , observedRHS , rhsErrs := createPathElementsValues ("rhs" , rhs )
206
208
errs = append (errs , rhsErrs ... )
209
+ seen := fieldpath .MakePathElementSet (outLen )
207
210
208
211
lLen , rLen = len (lhsOrder ), len (rhsOrder )
209
212
for lI , rI := 0 , 0 ; lI < lLen || rI < rLen ; {
@@ -216,26 +219,27 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err
216
219
out = append (out , * w2 .out )
217
220
}
218
221
w .finishDescent (w2 )
222
+ seen .Insert (pe )
219
223
}
220
224
if lI < lLen && rI < rLen && lhsOrder [lI ].Equals (rhsOrder [rI ]) {
221
225
// merge LHS & RHS items
222
226
pe := lhsOrder [lI ]
223
- lChild , _ , _ := observedLHS .Get (pe )
224
- rChild , _ , _ := observedRHS .Get (pe )
227
+ lChild , _ := observedLHS .Get (pe )
228
+ rChild , _ := observedRHS .Get (pe )
225
229
merge (pe , lChild , rChild )
226
230
lI ++
227
231
rI ++
228
232
continue
229
233
}
230
234
if lI < lLen {
231
- if _ , index , ok := observedRHS .Get (lhsOrder [lI ]); ok && index < rI {
235
+ pe := lhsOrder [lI ]
236
+ if ok := seen .Has (pe ); ok {
232
237
// Skip the LHS item because it has already appeared
233
238
lI ++
234
239
continue
235
- } else if ! ok {
240
+ } else if _ , ok := observedRHS . Get ( pe ); ! ok {
236
241
// Take the LHS item, without a matching RHS item to merge with
237
- pe := lhsOrder [lI ]
238
- lChild , _ , _ := observedLHS .Get (pe )
242
+ lChild , _ := observedLHS .Get (pe )
239
243
merge (pe , lChild , nil )
240
244
lI ++
241
245
continue
@@ -244,8 +248,8 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err
244
248
if rI < rLen {
245
249
// Take the RHS item, merge with matching LHS item if possible
246
250
pe := rhsOrder [rI ]
247
- rChild , _ , _ := observedRHS .Get (pe )
248
- lChild , _ , _ := observedLHS .Get (pe ) // may be nil
251
+ rChild , _ := observedRHS .Get (pe )
252
+ lChild , _ := observedLHS .Get (pe ) // may be nil
249
253
merge (pe , lChild , rChild )
250
254
rI ++
251
255
}
0 commit comments