123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- /*
- Copyright 2018 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package fieldpath
- // APIVersion describes the version of an object or of a fieldset.
- type APIVersion string
- // VersionedSet associates a version to a set.
- type VersionedSet struct {
- *Set
- APIVersion APIVersion
- Applied bool
- }
- // ManagedFields is a map from manager to VersionedSet (what they own in
- // what version).
- type ManagedFields map[string]*VersionedSet
- // Difference returns a symmetric difference between two Managers. If a
- // given user's entry has version X in lhs and version Y in rhs, then
- // the return value for that user will be from rhs. If the difference for
- // a user is an empty set, that user will not be inserted in the map.
- func (lhs ManagedFields) Difference(rhs ManagedFields) ManagedFields {
- diff := ManagedFields{}
- for manager, left := range lhs {
- right, ok := rhs[manager]
- if !ok {
- if !left.Empty() {
- diff[manager] = left
- }
- continue
- }
- // If we have sets in both but their version
- // differs, we don't even diff and keep the
- // entire thing.
- if left.APIVersion != right.APIVersion {
- diff[manager] = right
- continue
- }
- newSet := left.Difference(right.Set).Union(right.Difference(left.Set))
- if !newSet.Empty() {
- diff[manager] = &VersionedSet{
- Set: newSet,
- APIVersion: right.APIVersion,
- }
- }
- }
- for manager, set := range rhs {
- if _, ok := lhs[manager]; ok {
- // Already done
- continue
- }
- if !set.Empty() {
- diff[manager] = set
- }
- }
- return diff
- }
|