Fix type assertions

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

@ -24,7 +24,6 @@ import (
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
"reflect"
"strings" "strings"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -34,7 +33,7 @@ import (
chart "helm.sh/helm/v4/pkg/chart/v2" chart "helm.sh/helm/v4/pkg/chart/v2"
) )
const mergePrefix = "*" const mergePrefix = "\\*"
// ChartLoader loads a chart. // ChartLoader loads a chart.
type ChartLoader interface { type ChartLoader interface {
@ -232,6 +231,7 @@ func LoadValues(data io.Reader) (map[string]interface{}, error) {
}); err != nil { }); err != nil {
return nil, errors.Wrap(err, "cannot unmarshal yaml document") return nil, errors.Wrap(err, "cannot unmarshal yaml document")
} }
values = MergeMaps(values, currentMap) values = MergeMaps(values, currentMap)
} }
return values, nil return values, nil
@ -246,7 +246,6 @@ func MergeMaps(a, b map[string]interface{}) map[string]interface{} {
out[k] = v out[k] = v
} }
for k, v := range b { for k, v := range b {
if val, ok := v.(map[string]interface{}); ok { if val, ok := v.(map[string]interface{}); ok {
if bv, ok := out[k]; ok { if bv, ok := out[k]; ok {
if bv, ok := bv.(map[string]interface{}); ok { if bv, ok := bv.(map[string]interface{}); ok {
@ -254,27 +253,38 @@ func MergeMaps(a, b map[string]interface{}) map[string]interface{} {
continue continue
} }
} }
} else if reflect.TypeOf(v).Kind() == reflect.Slice && strings.HasPrefix(k, mergePrefix) { } else {
strippedKey := strings.TrimPrefix(k, mergePrefix) strippedKey := strings.TrimPrefix(k, mergePrefix)
out[strippedKey] = out[k] if out[k] != nil {
delete(out, k) out[strippedKey] = out[k]
if sourceList, ok := out[strippedKey].([]map[string]interface{}); ok { delete(out, k)
}
if sourceList, ok := out[strippedKey].([]any); ok && strings.HasPrefix(k, mergePrefix) {
val, ok := v.([]map[string]interface{}) _, isMapSlice := sourceList[0].(map[string]any)
if !ok { if isMapSlice {
log.Println("Property mismatch during merge") val, ok := v.([]any)
continue if !ok {
} // List is explicitly made null on a subsequent file
if v == nil {
delete(out, strippedKey)
continue
} else {
log.Printf("Property \"%s\" mismatch during merge", strippedKey)
continue
}
}
out[strippedKey] = MergeMapLists(sourceList, val) out[strippedKey] = MergeMapLists(sourceList, val)
continue continue
} else if sourceList, ok := out[strippedKey].([]interface{}); ok { } else if sourceList, ok := out[strippedKey].([]any); ok {
if val, ok := v.([]interface{}); ok { if val, ok := v.([]any); ok {
out[strippedKey] = append(sourceList, val...) out[strippedKey] = append(sourceList, val...)
} else { } else {
out[strippedKey] = v out[strippedKey] = v
}
continue
} }
continue
} }
} }
@ -285,23 +295,37 @@ func MergeMaps(a, b map[string]interface{}) map[string]interface{} {
// MergeMapLists merges two lists of maps. If a prefix of * is set on a map key, // MergeMapLists merges two lists of maps. If a prefix of * is set on a map key,
// that key will be used to de-duplicate/merge with the source map // that key will be used to de-duplicate/merge with the source map
func MergeMapLists(a, b []map[string]interface{}) []map[string]interface{} { func MergeMapLists(a, b []any) []any {
out := a out := a
for j, mapEntry := range b { for j, mapEntry := range b {
mapEntry, ok := mapEntry.(map[string]any)
if !ok {
continue
}
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, mergePrefix) { if strings.HasPrefix(k, mergePrefix) {
mergeKey = k mergeKey = k
mergeValue = v mergeValue = v
b[j][strings.TrimPrefix(mergeKey, mergePrefix)] = v bj, ok := b[j].(map[string]any)
delete(b[j], mergeKey) if !ok {
continue
}
bj[strings.TrimPrefix(mergeKey, mergePrefix)] = v
delete(bj, mergeKey)
break break
} }
} }
if len(mergeKey) > 0 { if len(mergeKey) > 0 {
strippedMergeKey := strings.TrimPrefix(mergeKey, mergePrefix) strippedMergeKey := strings.TrimPrefix(mergeKey, mergePrefix)
for i, sourceMapEntry := range out { for i, sourceMapEntry := range out {
sourceMapEntry, ok := sourceMapEntry.(map[string]any)
if !ok {
continue
}
for k, v := range sourceMapEntry { for k, v := range sourceMapEntry {
if (k == strippedMergeKey || k == mergeKey) && v == mergeValue { if (k == strippedMergeKey || k == mergeKey) && v == mergeValue {
mergedMapEntry := MergeMaps(sourceMapEntry, mapEntry) mergedMapEntry := MergeMaps(sourceMapEntry, mapEntry)

Loading…
Cancel
Save