Skip to content

Commit 3379b09

Browse files
committed
Use NestedSet to also remove structs owned by no-one
1 parent 9d98b03 commit 3379b09

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

merge/update.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ 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+
pruned := convertedMerged.RemoveItems(lastSet.Set().NestedSet())
230230
pruned, err = s.addBackOwnedItems(convertedMerged, pruned, managers, applyingManager)
231231
if err != nil {
232232
return nil, fmt.Errorf("failed add back owned items: %v", err)
@@ -247,7 +247,11 @@ func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFie
247247
if _, ok := managedAtVersion[managerSet.APIVersion()]; !ok {
248248
managedAtVersion[managerSet.APIVersion()] = fieldpath.NewSet()
249249
}
250-
managedAtVersion[managerSet.APIVersion()] = managedAtVersion[managerSet.APIVersion()].Union(managerSet.Set())
250+
managed := managerSet.Set()
251+
if managerSet.Applied() {
252+
managed = managed.NestedSet()
253+
}
254+
managedAtVersion[managerSet.APIVersion()] = managedAtVersion[managerSet.APIVersion()].Union(managed)
251255
}
252256
for version, managed := range managedAtVersion {
253257
merged, err = s.Converter.Convert(merged, version)
@@ -272,7 +276,7 @@ func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFie
272276
if err != nil {
273277
return nil, fmt.Errorf("failed to create field set from pruned object at version %v: %v", version, err)
274278
}
275-
pruned = merged.RemoveItems(mergedSet.Difference(prunedSet.Union(managed)))
279+
pruned = merged.RemoveItems(mergedSet.NestedSet().Difference(prunedSet.NestedSet().Union(managed)))
276280
}
277281
return pruned, nil
278282
}
@@ -296,7 +300,7 @@ func (s *Updater) addBackDanglingItems(merged, pruned *typed.TypedValue, lastSet
296300
if err != nil {
297301
return nil, fmt.Errorf("failed to create field set from merged object in last applied version: %v", err)
298302
}
299-
return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(lastSet.Set())), nil
303+
return merged.RemoveItems(mergedSet.NestedSet().Difference(prunedSet.NestedSet()).Intersection(lastSet.Set().NestedSet())), nil
300304
}
301305

302306
// 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)