Skip to content

Commit 5e01923

Browse files
committed
add back owned items at pruned version first
this is to avoid conversion failure caused by pruned fields which are required for conversion
1 parent 0f3c884 commit 5e01923

File tree

1 file changed

+41
-20
lines changed

1 file changed

+41
-20
lines changed

merge/update.go

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -250,33 +250,54 @@ func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFie
250250
}
251251
managedAtVersion[managerSet.APIVersion()] = managedAtVersion[managerSet.APIVersion()].Union(managerSet.Set())
252252
}
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)
255258
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
260260
}
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)
262265
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
267267
}
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
271280
}
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
275287
}
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)
278289
}
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
280301
}
281302

282303
// addBackDanglingItems makes sure that the fields list and map items removed by prune were

0 commit comments

Comments
 (0)