This is an automated email from the ASF dual-hosted git repository. astefanutti pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 57f5d83fb79fce28adb56798bb1fbe8f823dbce1 Author: Antonin Stefanutti <anto...@stefanutti.fr> AuthorDate: Wed Nov 27 09:52:16 2019 +0100 chore: Remove empty maps recursively from JSON merge patch --- pkg/trait/deployer.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pkg/trait/deployer.go b/pkg/trait/deployer.go index 56b0322..f6052a1 100644 --- a/pkg/trait/deployer.go +++ b/pkg/trait/deployer.go @@ -136,7 +136,7 @@ func (s *mergeFromPositivePatch) Data(obj runtime.Object) ([]byte, error) { // so that values defaulted by controllers server-side are not deleted. // It's generally acceptable as these values are orthogonal to the values managed // by the traits. - removeNilValues(reflect.ValueOf(positivePatch)) + removeNilValues(reflect.ValueOf(positivePatch), reflect.Value{}) return json.Marshal(positivePatch) } @@ -145,23 +145,28 @@ func mergeFrom(obj runtime.Object) client.Patch { return &mergeFromPositivePatch{obj} } -func removeNilValues(v reflect.Value) { +func removeNilValues(v reflect.Value, parent reflect.Value) { for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { v = v.Elem() } switch v.Kind() { case reflect.Array, reflect.Slice: for i := 0; i < v.Len(); i++ { - removeNilValues(v.Index(i)) + removeNilValues(v.Index(i), v) } case reflect.Map: for _, k := range v.MapKeys() { c := v.MapIndex(k) if c.IsNil() { v.SetMapIndex(k, reflect.Value{}) + } else if c.Elem().Kind() == reflect.Map && len(c.Elem().MapKeys()) == 0 { + v.SetMapIndex(k, reflect.Value{}) } else { - removeNilValues(c) + removeNilValues(c, v) } } + if len(v.MapKeys()) == 0 && parent.Kind() == reflect.Map { + removeNilValues(parent, reflect.Value{}) + } } }