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{})
+               }
        }
 }

Reply via email to