only merge lists with prefix

Signed-off-by: Rafael da Fonseca <rafael.fonseca@wildlifestudios.com>
pull/30632/head
Rafael da Fonseca 7 months ago
parent 02d070ebdc
commit 825fc2b0bc

@ -34,6 +34,8 @@ import (
chart "helm.sh/helm/v4/pkg/chart/v2" chart "helm.sh/helm/v4/pkg/chart/v2"
) )
const mergePrefix = "*"
// ChartLoader loads a chart. // ChartLoader loads a chart.
type ChartLoader interface { type ChartLoader interface {
Load() (*chart.Chart, error) Load() (*chart.Chart, error)
@ -252,23 +254,25 @@ func MergeMaps(a, b map[string]interface{}) map[string]interface{} {
continue continue
} }
} }
} else if reflect.TypeOf(v).Kind() == reflect.Slice { } else if reflect.TypeOf(v).Kind() == reflect.Slice && strings.HasPrefix(k, mergePrefix) {
if sourceList, ok := out[k].([]map[string]interface{}); ok { strippedKey := strings.TrimPrefix(k, mergePrefix)
out[strippedKey] = out[k]
delete(out, k)
if sourceList, ok := out[strippedKey].([]map[string]interface{}); ok {
val, ok := v.([]map[string]interface{}) val, ok := v.([]map[string]interface{})
if !ok { if !ok {
log.Println("Property mismatch during merge") log.Println("Property mismatch during merge")
out[k] = v
continue continue
} }
out[k] = MergeMapLists(sourceList, val) out[strippedKey] = MergeMapLists(sourceList, val)
continue continue
} else if sourceList, ok := out[k].([]interface{}); ok { } else if sourceList, ok := out[strippedKey].([]interface{}); ok {
if val, ok := v.([]interface{}); ok { if val, ok := v.([]interface{}); ok {
out[k] = append(sourceList, val...) out[strippedKey] = append(sourceList, val...)
} else { } else {
out[k] = v out[strippedKey] = v
} }
continue continue
} }
@ -287,16 +291,16 @@ func MergeMapLists(a, b []map[string]interface{}) []map[string]interface{} {
var mergeKey string var mergeKey string
var mergeValue interface{} var mergeValue interface{}
for k, v := range mapEntry { for k, v := range mapEntry {
if strings.HasPrefix(k, "*") { if strings.HasPrefix(k, mergePrefix) {
mergeKey = k mergeKey = k
mergeValue = v mergeValue = v
b[j][strings.TrimPrefix(mergeKey, "*")] = v b[j][strings.TrimPrefix(mergeKey, mergePrefix)] = v
delete(b[j], mergeKey) delete(b[j], mergeKey)
break break
} }
} }
if len(mergeKey) > 0 { if len(mergeKey) > 0 {
strippedMergeKey := strings.TrimPrefix(mergeKey, "*") strippedMergeKey := strings.TrimPrefix(mergeKey, mergePrefix)
for i, sourceMapEntry := range out { for i, sourceMapEntry := range out {
for k, v := range sourceMapEntry { for k, v := range sourceMapEntry {
if (k == strippedMergeKey || k == mergeKey) && v == mergeValue { if (k == strippedMergeKey || k == mergeKey) && v == mergeValue {

Loading…
Cancel
Save