@@ -17,47 +17,55 @@ import (
17
17
"gopkg.in/yaml.v3"
18
18
19
19
"io"
20
- "io/ioutil"
21
20
"os"
22
21
"path/filepath"
23
22
)
24
23
25
24
// Reads content of the yaml file and returns it
26
25
func ReadFile (filename string ) map [string ]interface {} {
27
26
log := logger .GetLogger ()
28
- log .Debug ("START: READ FILE" , zap . String ( "filename" , filename ) )
29
- yamlFile , err := ioutil .ReadFile (filename )
27
+ log .Debug ("START: READ FILE" )
28
+ yamlFile , err := os .ReadFile (filename )
30
29
if err != nil {
31
- log .Debug ("Could not open" ,
32
- zap . String ( "filename" , filename ))
30
+ log .Debug ("Could not open" , zap . String ( "filename" , filename ))
31
+ return nil
33
32
}
34
33
35
34
m := make (map [string ]interface {})
36
- err = yaml .Unmarshal (yamlFile , m )
35
+ err = yaml .Unmarshal (yamlFile , & m )
37
36
if err != nil {
38
- log .Debug ("Could not decode map" ,
39
- zap .Any ("map" , m ))
37
+ log .Debug ("Could not decode map" , zap .Any ("map" , m ))
40
38
}
41
- log .Debug ("END: READ FILE" , zap . String ( "filename" , filename ) )
39
+ log .Debug ("END: READ FILE" )
42
40
return m
43
41
}
44
42
45
43
// Writes content to a yaml file
46
44
47
- func WriteFile (filename string , data map [string ]interface {}) error {
45
+ func WriteFile (filename string , data map [string ]interface {}, keepHeader bool ) error {
48
46
log := logger .GetLogger ()
49
47
log .Debug ("START: WRITE FILE" , zap .String ("filename" , filename ))
48
+
50
49
var b bytes.Buffer
50
+ if keepHeader {
51
+ b .WriteString ("---\n " )
52
+ }
53
+
51
54
yamlEncoder := yaml .NewEncoder (& b )
52
55
yamlEncoder .SetIndent (2 )
56
+ if err := yamlEncoder .Encode (data ); err != nil {
57
+ log .Error ("Failed to encode YAML" , zap .Error (err ))
58
+ return err
59
+ }
60
+ yamlEncoder .Close ()
53
61
54
- yamlEncoder .Encode (& data )
55
- err := ioutil .WriteFile (filename , b .Bytes (), 0644 )
62
+ err := os .WriteFile (filename , b .Bytes (), 0644 )
56
63
if err != nil {
57
- log .Error ("Error while writing file " , zap .Error (err ), zap .String ("filename" , filename ))
64
+ log .Error ("Failed to write file" , zap .Error (err ), zap .String ("filename" , filename ))
58
65
}
66
+
59
67
log .Debug ("END: WRITE FILE" , zap .String ("filename" , filename ))
60
- return nil
68
+ return err
61
69
}
62
70
63
71
// Basically we have two map and we compare them if there are some sort of values that should be changed according to its logic
@@ -73,6 +81,7 @@ func Intersection(inputMap, defaultMap map[string]interface{}) (newMap map[strin
73
81
_ , ok := defaultMap [inputKey ]
74
82
if ok {
75
83
newMap [inputKey ] = inputVal
84
+ fmt .Printf ("adding to intersectionMap[%s] as this value ->: %s\n " , inputKey , newMap [inputKey ])
76
85
}
77
86
}
78
87
}
@@ -90,51 +99,60 @@ func UpdateValuesFile(valuesModel map[string]interface{}, varsPath string) error
90
99
if ! info .IsDir () && filepath .Ext (path ) == ".yaml" || filepath .Ext (path ) == ".yml" {
91
100
defaultModel := ReadFile (path )
92
101
intersectionMap := Intersection (valuesModel , defaultModel )
93
- if len (intersectionMap ) > 0 {
102
+ if isMapNotEmpty (intersectionMap ) { // this checks whether intersection map is truly empty or not
94
103
log .Debug ("INTERSECTION" , zap .Any ("map" , intersectionMap ))
95
104
mergo .Merge (& defaultModel , intersectionMap , mergo .WithOverride )
96
- WriteFile (path , defaultModel )
105
+ WriteFile (path , defaultModel , true )
97
106
}
98
107
}
99
108
return nil
100
109
})
101
110
}
102
111
103
- func Untar (tarball , target string ) error {
112
+ // isMapNotEmpty, checks if the map is empty or not
113
+ func isMapNotEmpty (m map [string ]interface {}) bool {
114
+ for _ , value := range m {
115
+ switch v := value .(type ) {
116
+ case map [string ]interface {}:
117
+ if isMapNotEmpty (v ) {
118
+ return true // there is at least one non-empty map
119
+ }
120
+ default :
121
+ return true // there is at least one non-empty value
122
+ }
123
+ }
124
+ return false // map is empty
125
+ }
104
126
127
+ func Untar (tarball , target string ) error {
105
128
reader , err := os .Open (tarball )
106
129
log := logger .GetLogger ()
107
130
if err != nil {
108
131
log .Debug ("Bundle file could not be opened." )
109
132
return err
110
133
}
111
- log .Debug ("Bundle file exists." )
112
134
defer reader .Close ()
113
135
114
136
gzf , err := gzip .NewReader (reader )
115
137
if err != nil {
116
- fmt .Println (err )
117
- os .Exit (1 )
138
+ return err
118
139
}
119
- log . Debug ( "Gunzip done." )
140
+ defer gzf . Close ( )
120
141
121
142
tarReader := tar .NewReader (gzf )
122
143
123
144
for {
124
145
header , err := tarReader .Next ()
125
-
126
146
if err == io .EOF {
127
147
break
128
148
} else if err != nil {
129
-
130
149
return err
131
150
}
132
151
133
152
path := filepath .Join (target , header .Name )
134
153
info := header .FileInfo ()
135
154
if info .IsDir () {
136
- if err = os .MkdirAll (path , info .Mode ()); err != nil {
137
-
155
+ if err := os .MkdirAll (path , info .Mode ()); err != nil {
138
156
return err
139
157
}
140
158
continue
@@ -144,13 +162,13 @@ func Untar(tarball, target string) error {
144
162
if err != nil {
145
163
return err
146
164
}
147
- defer file . Close ()
148
- _ , err = io .Copy (file , tarReader )
149
- if err != nil {
165
+
166
+ if _ , err : = io .Copy (file , tarReader ); err != nil {
167
+ file . Close () // Ensure file is closed in case of error
150
168
return err
151
169
}
170
+ file .Close () // Moved from defer to close immediately after use
152
171
}
153
- log .Debug ("Untar done." )
154
172
return nil
155
173
}
156
174
0 commit comments