Skip to content

Commit 33867d0

Browse files
authored
Merge pull request #319 from covexo/issue-314
Issue 314
2 parents e506b1c + 9e7f729 commit 33867d0

2 files changed

Lines changed: 18 additions & 13 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: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ 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(&overwriteObject)
16+
objectPointerUnsafe := (*(*pointerInterface)(unsafe.Pointer(&object))).Data
17+
overwriteObjectPointerUnsafe := (*(*pointerInterface)(unsafe.Pointer(&overwriteObject))).Data
1218

1319
merge(object, overwriteObject, objectPointerUnsafe, overwriteObjectPointerUnsafe)
1420
}
@@ -20,14 +26,15 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
2026
if overwriteObjectRef.Kind() == reflect.Ptr {
2127
overwriteObjectRef = overwriteObjectRef.Elem()
2228
}
29+
objectPointerReal := reflect.ValueOf(objectPointer).Elem().Interface()
2330
overwriteObject := overwriteObjectRef.Interface()
2431
overwriteObjectType := reflect.TypeOf(overwriteObject)
2532
overwriteObjectKind := overwriteObjectType.Kind()
26-
objectPointerRef := reflect.ValueOf(objectPointer)
33+
objectPointerRef := reflect.ValueOf(objectPointerReal)
2734
var objectRef reflect.Value
2835

2936
if !objectPointerRef.IsNil() {
30-
objectRef = reflect.ValueOf(objectPointer).Elem()
37+
objectRef = reflect.ValueOf(objectPointerReal).Elem()
3138
}
3239

3340
switch overwriteObjectKind {
@@ -55,7 +62,7 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
5562
if isZero(valuePointerRef) == false {
5663
valuePointer := valuePointerRef.Interface()
5764

58-
merge(valuePointer, overwriteValue, unsafe.Pointer(&valuePointer), unsafe.Pointer(&overwriteValue))
65+
Merge(&valuePointer, overwriteValue)
5966
} else {
6067
keyRef := reflect.ValueOf(key)
6168
overwriteValueRef := reflect.ValueOf(overwriteValue)
@@ -66,7 +73,6 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
6673
}
6774
case reflect.Struct:
6875
for i := 0; i < overwriteObjectRef.NumField(); i++ {
69-
//fieldName := objectRef.Type().Field(i).Name
7076
overwriteValueRef := overwriteObjectRef.Field(i)
7177
overwriteValuePointerRef := reflect.ValueOf(overwriteValueRef.Interface())
7278

@@ -75,11 +81,11 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
7581
valuePointerRef := objectRef.Field(i)
7682

7783
if valuePointerRef.IsNil() {
78-
objectRef.Field(i).Set(reflect.ValueOf(overwriteValue))
84+
valuePointerRef.Set(reflect.ValueOf(overwriteValue))
7985
} else {
80-
valuePointer := objectRef.Field(i).Interface()
86+
valuePointer := valuePointerRef.Interface()
8187

82-
merge(valuePointer, overwriteValue, unsafe.Pointer(&valuePointer), unsafe.Pointer(&overwriteValue))
88+
Merge(&valuePointer, overwriteValue)
8389
}
8490
}
8591
}

0 commit comments

Comments
 (0)