Skip to content

Commit 9e7f729

Browse files
author
gentele
committed
new fix for issue 314
1 parent 5a0fa35 commit 9e7f729

2 files changed

Lines changed: 17 additions & 30 deletions

File tree

pkg/devspace/config/configutil/get.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package configutil
33
import (
44
"os"
55
"sync"
6-
"unsafe"
76

87
"github.com/covexo/devspace/pkg/util/kubeconfig"
98
"github.com/covexo/devspace/pkg/util/log"
@@ -83,9 +82,9 @@ func GetConfig() *v1.Config {
8382
//ignore error as overwrite.yaml is optional
8483
loadConfig(overwriteConfigRaw, OverwriteConfigPath)
8584

86-
merge(&config, configRaw, unsafe.Pointer(&config), unsafe.Pointer(configRaw))
87-
merge(&overwriteConfig, overwriteConfigRaw, unsafe.Pointer(&overwriteConfig), unsafe.Pointer(overwriteConfigRaw))
88-
merge(&config, overwriteConfig, unsafe.Pointer(&config), unsafe.Pointer(overwriteConfig))
85+
Merge(&config, configRaw)
86+
Merge(&overwriteConfig, overwriteConfigRaw)
87+
Merge(&config, overwriteConfig)
8988

9089
if config.Version == nil || *config.Version != CurrentConfigVersion {
9190
log.Fatal("Your config is out of date. Please run `devspace init -r` to update your config")

pkg/devspace/config/configutil/merge.go

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,20 @@ import (
55
"unsafe"
66
)
77

8+
type pointerInterface struct {
9+
Type, Data unsafe.Pointer
10+
}
11+
812
// Merge deeply merges two objects
13+
// object MUST be a pointer of a pointer
14+
// overwriteObject MUST be a pointer
915
func Merge(object interface{}, overwriteObject interface{}) {
10-
objectPointerUnsafe := unsafe.Pointer(&object)
11-
overwriteObjectPointerUnsafe := *(*unsafe.Pointer)(unsafe.Pointer(&overwriteObject))
16+
objectPointerUnsafe := (*(*pointerInterface)(unsafe.Pointer(&object))).Data
17+
overwriteObjectPointerUnsafe := (*(*pointerInterface)(unsafe.Pointer(&overwriteObject))).Data
1218

13-
merge(&object, overwriteObject, objectPointerUnsafe, overwriteObjectPointerUnsafe)
19+
merge(object, overwriteObject, objectPointerUnsafe, overwriteObjectPointerUnsafe)
1420
}
1521

16-
// objectPointer MUST be a pointer of a pointer
17-
// objectPointerUnsafe MUST be an unsafe pointer of a pointer
1822
func merge(objectPointer interface{}, overwriteObjectPointer interface{}, objectPointerUnsafe unsafe.Pointer, overwriteObjectPointerUnsafe unsafe.Pointer) {
1923
overwriteObjectRef := reflect.ValueOf(overwriteObjectPointer)
2024

@@ -55,10 +59,10 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
5559
overwriteValue := getMapValue(overwriteObject, key, genericPointerType)
5660
valuePointerRef := objectRef.MapIndex(keyRef)
5761

58-
if isZero(valuePointerRef) == false && isTrivialDataType(valuePointerRef) {
62+
if isZero(valuePointerRef) == false {
5963
valuePointer := valuePointerRef.Interface()
6064

61-
merge(&valuePointer, overwriteValue, unsafe.Pointer(&valuePointer), *(*unsafe.Pointer)(unsafe.Pointer(&overwriteValue)))
65+
Merge(&valuePointer, overwriteValue)
6266
} else {
6367
keyRef := reflect.ValueOf(key)
6468
overwriteValueRef := reflect.ValueOf(overwriteValue)
@@ -76,33 +80,17 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
7680
overwriteValue := overwriteValueRef.Interface()
7781
valuePointerRef := objectRef.Field(i)
7882

79-
if valuePointerRef.IsNil() || isTrivialDataType(valuePointerRef) {
83+
if valuePointerRef.IsNil() {
8084
valuePointerRef.Set(reflect.ValueOf(overwriteValue))
8185
} else {
8286
valuePointer := valuePointerRef.Interface()
8387

84-
merge(&valuePointer, overwriteValue, unsafe.Pointer(&valuePointer), *(*unsafe.Pointer)(unsafe.Pointer(&overwriteValue)))
88+
Merge(&valuePointer, overwriteValue)
8589
}
8690
}
8791
}
8892
default:
89-
panic("Unable to merge trivial data types")
93+
*(*unsafe.Pointer)(objectPointerUnsafe) = overwriteObjectPointerUnsafe
9094
}
9195
}
9296
}
93-
94-
func isTrivialDataType(value reflect.Value) bool {
95-
if value.Type().Kind() == reflect.Ptr {
96-
value = value.Elem()
97-
}
98-
99-
switch reflect.TypeOf(value).Kind() {
100-
case reflect.Slice:
101-
return false
102-
case reflect.Map:
103-
return false
104-
case reflect.Struct:
105-
return false
106-
}
107-
return true
108-
}

0 commit comments

Comments
 (0)