Skip to content

Commit 2e74c28

Browse files
committed
Use NestedSet to also remove structs owned by no-one
1 parent 2996888 commit 2e74c28

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

merge/update.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,8 @@ func (s *Updater) prune(merged *typed.TypedValue, managers fieldpath.ManagedFiel
226226
return nil, fmt.Errorf("failed to convert merged object to last applied version: %v", err)
227227
}
228228

229-
pruned := convertedMerged.RemoveItems(lastSet.Set())
229+
sc, tr := convertedMerged.Schema(), convertedMerged.TypeRef()
230+
pruned := convertedMerged.RemoveItems(lastSet.Set().EnsureNamedFieldsAreMembers(sc, tr))
230231
pruned, err = s.addBackOwnedItems(convertedMerged, pruned, managers, applyingManager)
231232
if err != nil {
232233
return nil, fmt.Errorf("failed add back owned items: %v", err)
@@ -272,7 +273,8 @@ func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFie
272273
if err != nil {
273274
return nil, fmt.Errorf("failed to create field set from pruned object at version %v: %v", version, err)
274275
}
275-
pruned = merged.RemoveItems(mergedSet.Difference(prunedSet.Union(managed)))
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))))
276278
}
277279
return pruned, nil
278280
}
@@ -296,7 +298,11 @@ func (s *Updater) addBackDanglingItems(merged, pruned *typed.TypedValue, lastSet
296298
if err != nil {
297299
return nil, fmt.Errorf("failed to create field set from merged object in last applied version: %v", err)
298300
}
299-
return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(lastSet.Set())), nil
301+
sc, tr := merged.Schema(), merged.TypeRef()
302+
prunedSet = prunedSet.EnsureNamedFieldsAreMembers(sc, tr)
303+
mergedSet = mergedSet.EnsureNamedFieldsAreMembers(sc, tr)
304+
last := lastSet.Set().EnsureNamedFieldsAreMembers(sc, tr)
305+
return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(last)), nil
300306
}
301307

302308
// reconcileManagedFieldsWithSchemaChanges reconciles the managed fields with any changes to the

typed/tofieldset.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,9 @@ func (v *toFieldSetWalker) visitMapItems(t *schema.Map, m value.Map) (errs Valid
137137
v2 := v.prepareDescent(pe, tr)
138138
v2.value = val
139139
errs = append(errs, v2.toFieldSet()...)
140-
if _, ok := t.FindField(key); !ok {
140+
if val.IsNull() || (val.IsMap() && val.AsMap().Length() == 0) {
141+
v2.set.Insert(v2.path)
142+
} else if _, ok := t.FindField(key); !ok {
141143
v2.set.Insert(v2.path)
142144
}
143145
v.finishDescent(v2)

0 commit comments

Comments
 (0)