Skip to content

Commit b24263b

Browse files
author
jennybuckley
committed
Simplify logic
1 parent 9f6585c commit b24263b

File tree

1 file changed

+26
-32
lines changed

1 file changed

+26
-32
lines changed

merge/update.go

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ type Updater struct {
3434
}
3535

3636
func (s *Updater) update(oldObject, newObject typed.TypedValue, version fieldpath.APIVersion, managers fieldpath.ManagedFields, workflow string, force bool) (fieldpath.ManagedFields, error) {
37-
if managers == nil {
38-
managers = fieldpath.ManagedFields{}
39-
}
4037
conflicts := fieldpath.ManagedFields{}
4138
removed := fieldpath.ManagedFields{}
4239
type Versioned struct {
@@ -124,6 +121,7 @@ func (s *Updater) update(oldObject, newObject typed.TypedValue, version fieldpat
124121
// this is a CREATE call).
125122
func (s *Updater) Update(liveObject, newObject typed.TypedValue, version fieldpath.APIVersion, managers fieldpath.ManagedFields, manager string) (fieldpath.ManagedFields, error) {
126123
var err error
124+
managers = shallowCopyManagers(managers)
127125
managers, err = s.update(liveObject, newObject, version, managers, manager, true)
128126
if err != nil {
129127
return fieldpath.ManagedFields{}, err
@@ -149,36 +147,41 @@ func (s *Updater) Update(liveObject, newObject typed.TypedValue, version fieldpa
149147
// well as the configuration that is applied. This will merge the object
150148
// and return it.
151149
func (s *Updater) Apply(liveObject, configObject typed.TypedValue, version fieldpath.APIVersion, managers fieldpath.ManagedFields, manager string, force bool) (typed.TypedValue, fieldpath.ManagedFields, error) {
150+
managers = shallowCopyManagers(managers)
152151
newObject, err := liveObject.Merge(configObject)
153152
if err != nil {
154153
return nil, fieldpath.ManagedFields{}, fmt.Errorf("failed to merge config: %v", err)
155154
}
155+
lastSet := managers[manager]
156156
set, err := configObject.ToFieldSet()
157157
if err != nil {
158158
return nil, fieldpath.ManagedFields{}, fmt.Errorf("failed to get field set: %v", err)
159159
}
160-
appliedSet := &fieldpath.VersionedSet{
160+
managers[manager] = &fieldpath.VersionedSet{
161161
Set: set,
162162
APIVersion: version,
163163
Applied: true,
164164
}
165-
newObject, err = s.prune(newObject, managers, manager, appliedSet)
165+
newObject, err = s.prune(newObject, managers, manager, lastSet)
166166
if err != nil {
167167
return nil, fieldpath.ManagedFields{}, fmt.Errorf("failed to prune fields: %v", err)
168168
}
169169
managers, err = s.update(liveObject, newObject, version, managers, manager, force)
170170
if err != nil {
171171
return nil, fieldpath.ManagedFields{}, err
172172
}
173-
managers[manager] = appliedSet
174-
if managers[manager].Set.Empty() {
175-
delete(managers, manager)
176-
}
177173
return newObject, managers, nil
178174
}
179175

180-
func (s *Updater) prune(merged typed.TypedValue, managers fieldpath.ManagedFields, applyingManager string, appliedSet *fieldpath.VersionedSet) (typed.TypedValue, error) {
181-
lastSet := managers[applyingManager]
176+
func shallowCopyManagers(managers fieldpath.ManagedFields) fieldpath.ManagedFields {
177+
newManagers := fieldpath.ManagedFields{}
178+
for manager, set := range managers {
179+
newManagers[manager] = set
180+
}
181+
return newManagers
182+
}
183+
184+
func (s *Updater) prune(merged typed.TypedValue, managers fieldpath.ManagedFields, applyingManager string, lastSet *fieldpath.VersionedSet) (typed.TypedValue, error) {
182185
if lastSet == nil || lastSet.Set.Empty() {
183186
return merged, nil
184187
}
@@ -190,30 +193,29 @@ func (s *Updater) prune(merged typed.TypedValue, managers fieldpath.ManagedField
190193
return nil, fmt.Errorf("failed to convert merged object to last applied version: %v", err)
191194
}
192195
pruned := convertedMerged.RemoveItems(lastSet.Set)
193-
pruned, err = s.addBackOwnedItems(convertedMerged, pruned, managers, applyingManager, appliedSet)
196+
pruned, err = s.addBackOwnedItems(convertedMerged, pruned, managers, applyingManager)
194197
if err != nil {
195198
return nil, fmt.Errorf("failed add back owned items: %v", err)
196199
}
197200
pruned, err = s.addBackDanglingItems(convertedMerged, pruned, lastSet)
198201
if err != nil {
199202
return nil, fmt.Errorf("failed add back dangling items: %v", err)
200203
}
201-
return s.Converter.Convert(pruned, appliedSet.APIVersion)
204+
return s.Converter.Convert(pruned, managers[applyingManager].APIVersion)
202205
}
203206

204-
func (s *Updater) addBackOwnedItems(merged, pruned typed.TypedValue, managedFields fieldpath.ManagedFields, applyingManager string, appliedSet *fieldpath.VersionedSet) (typed.TypedValue, error) {
207+
func (s *Updater) addBackOwnedItems(merged, pruned typed.TypedValue, managedFields fieldpath.ManagedFields, applyingManager string) (typed.TypedValue, error) {
205208
var err error
206-
managersAtVersion := map[fieldpath.APIVersion][]string{}
207-
for manager, managerSet := range managedFields {
208-
if !managerSet.Applied {
209-
continue
210-
}
211-
if manager == applyingManager {
212-
managerSet = appliedSet
209+
managedAtVersion := map[fieldpath.APIVersion]*fieldpath.Set{}
210+
for _, managerSet := range managedFields {
211+
if managerSet.Applied {
212+
if _, ok := managedAtVersion[managerSet.APIVersion]; !ok {
213+
managedAtVersion[managerSet.APIVersion] = fieldpath.NewSet()
214+
}
215+
managedAtVersion[managerSet.APIVersion] = managedAtVersion[managerSet.APIVersion].Union(managerSet.Set)
213216
}
214-
managersAtVersion[managerSet.APIVersion] = append(managersAtVersion[managerSet.APIVersion], manager)
215217
}
216-
for version, managers := range managersAtVersion {
218+
for version, managed := range managedAtVersion {
217219
merged, err = s.Converter.Convert(merged, version)
218220
if err != nil {
219221
if s.Converter.IsMissingVersionError(err) {
@@ -236,15 +238,7 @@ func (s *Updater) addBackOwnedItems(merged, pruned typed.TypedValue, managedFiel
236238
if err != nil {
237239
return nil, fmt.Errorf("failed to create field set from pruned object at version %v: %v", version, err)
238240
}
239-
toAddBack := prunedSet
240-
for _, manager := range managers {
241-
managerSet := managedFields[manager]
242-
if manager == applyingManager {
243-
managerSet = appliedSet
244-
}
245-
toAddBack = toAddBack.Union(managerSet.Set)
246-
}
247-
pruned = merged.RemoveItems(mergedSet.Difference(toAddBack))
241+
pruned = merged.RemoveItems(mergedSet.Difference(prunedSet.Union(managed)))
248242
}
249243
return pruned, nil
250244
}

0 commit comments

Comments
 (0)