@@ -250,33 +250,54 @@ func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFie
250
250
}
251
251
managedAtVersion [managerSet .APIVersion ()] = managedAtVersion [managerSet .APIVersion ()].Union (managerSet .Set ())
252
252
}
253
- for version , managed := range managedAtVersion {
254
- merged , err = s .Converter .Convert (merged , version )
253
+ // Add back owned items at pruned version first to avoid conversion failure
254
+ // caused by pruned fields which are required for conversion.
255
+ prunedVersion := fieldpath .APIVersion (* pruned .TypeRef ().NamedType )
256
+ if managed , ok := managedAtVersion [prunedVersion ]; ok {
257
+ merged , pruned , err = s .addBackOwnedItemsForVersion (merged , pruned , prunedVersion , managed )
255
258
if err != nil {
256
- if s .Converter .IsMissingVersionError (err ) {
257
- continue
258
- }
259
- return nil , fmt .Errorf ("failed to convert merged object at version %v: %v" , version , err )
259
+ return nil , err
260
260
}
261
- pruned , err = s .Converter .Convert (pruned , version )
261
+ delete (managedAtVersion , prunedVersion )
262
+ }
263
+ for version , managed := range managedAtVersion {
264
+ merged , pruned , err = s .addBackOwnedItemsForVersion (merged , pruned , version , managed )
262
265
if err != nil {
263
- if s .Converter .IsMissingVersionError (err ) {
264
- continue
265
- }
266
- return nil , fmt .Errorf ("failed to convert pruned object at version %v: %v" , version , err )
266
+ return nil , err
267
267
}
268
- mergedSet , err := merged .ToFieldSet ()
269
- if err != nil {
270
- return nil , fmt .Errorf ("failed to create field set from merged object at version %v: %v" , version , err )
268
+ }
269
+ return pruned , nil
270
+ }
271
+
272
+ // addBackOwnedItemsForVersion adds back any fields, list and map items that were removed by prune with specific managed field path at a version.
273
+ // It is an extracted sub-function from addBackOwnedItems for code reuse.
274
+ func (s * Updater ) addBackOwnedItemsForVersion (merged , pruned * typed.TypedValue , version fieldpath.APIVersion , managed * fieldpath.Set ) (* typed.TypedValue , * typed.TypedValue , error ) {
275
+ var err error
276
+ merged , err = s .Converter .Convert (merged , version )
277
+ if err != nil {
278
+ if s .Converter .IsMissingVersionError (err ) {
279
+ return merged , pruned , nil
271
280
}
272
- prunedSet , err := pruned .ToFieldSet ()
273
- if err != nil {
274
- return nil , fmt .Errorf ("failed to create field set from pruned object at version %v: %v" , version , err )
281
+ return nil , nil , fmt .Errorf ("failed to convert merged object at version %v: %v" , version , err )
282
+ }
283
+ pruned , err = s .Converter .Convert (pruned , version )
284
+ if err != nil {
285
+ if s .Converter .IsMissingVersionError (err ) {
286
+ return merged , pruned , nil
275
287
}
276
- sc , tr := merged .Schema (), merged .TypeRef ()
277
- pruned = merged .RemoveItems (mergedSet .EnsureNamedFieldsAreMembers (sc , tr ).Difference (prunedSet .EnsureNamedFieldsAreMembers (sc , tr ).Union (managed .EnsureNamedFieldsAreMembers (sc , tr ))))
288
+ return nil , nil , fmt .Errorf ("failed to convert pruned object at version %v: %v" , version , err )
278
289
}
279
- return pruned , nil
290
+ mergedSet , err := merged .ToFieldSet ()
291
+ if err != nil {
292
+ return nil , nil , fmt .Errorf ("failed to create field set from merged object at version %v: %v" , version , err )
293
+ }
294
+ prunedSet , err := pruned .ToFieldSet ()
295
+ if err != nil {
296
+ return nil , nil , fmt .Errorf ("failed to create field set from pruned object at version %v: %v" , version , err )
297
+ }
298
+ sc , tr := merged .Schema (), merged .TypeRef ()
299
+ pruned = merged .RemoveItems (mergedSet .EnsureNamedFieldsAreMembers (sc , tr ).Difference (prunedSet .EnsureNamedFieldsAreMembers (sc , tr ).Union (managed .EnsureNamedFieldsAreMembers (sc , tr ))))
300
+ return merged , pruned , nil
280
301
}
281
302
282
303
// addBackDanglingItems makes sure that the fields list and map items removed by prune were
0 commit comments