-
Notifications
You must be signed in to change notification settings - Fork 0
/
data.go
138 lines (111 loc) · 2.62 KB
/
data.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"encoding/json"
"math"
"os"
"io/ioutil"
)
type Data struct {
DataFiles map[string]string `json:"dataFiles"`
// Package Files
Files []*File
err error
}
func NewData(config []byte) (*Data, error) {
data := &Data{}
err := json.Unmarshal(config, data)
if err != nil {
return nil, err
}
return data, nil
}
// Build takes alles Files from bd.Files and writes them into a tar Archive
// It returns the either
// (good) the gzipped bytes content of this archive and an nil error object
// (bad) an
func (bd *Data) Build() ([]byte, error) {
if bd.err != nil {
return nil, bd.err
}
// create tar archive
dataTar := NewTarArchive()
// add all files to the archive
for _, f := range bd.Files {
if f != nil {
dataTar.AddFile(f.Destination, f.Content)
}
}
gzippedTar, err := dataTar.Gzip()
if err != nil {
bd.err = err
}
return gzippedTar, bd.err
}
func (bd *Data) Check() error {
if bd.err != nil {
return bd.err
}
if err := bd.checkDataFiles(); err != nil {
bd.err = err
}
return bd.err
}
// CheckDataFiles populates bd.Files List from the json files map
// It checks folders recursively
// It returns an error if any of these files is not readable or if an error happened before
// It maps the json files map from "key": "value" to "dest": "src"
func (bd *Data) checkDataFiles() error {
if bd.err != nil {
return bd.err
}
dataFiles, err := expandDataFiles(bd.DataFiles)
if err != nil {
return err
}
for dest, src := range dataFiles {
f, err := NewFile(src, dest)
if err != nil {
return err
}
bd.Files = append(bd.Files, f)
}
return nil
}
// DataSize returns the Actual Size of all DataFiles in kb
// Size in bytes / 1024 rounded up
func (bd *Data) DataSizeKB() int {
size := 0
for _, f := range bd.Files {
size += len(f.Content)
}
return int(math.Ceil(float64(size) / 1024))
}
func expandDataFiles(fileList map[string]string) (map[string]string, error) {
expandedFiles := map[string]string{}
for dest, src := range fileList {
srcStat, err := os.Stat(src)
if err != nil {
return nil, err
}
if srcStat.IsDir() {
filesInSrcDir, err := ioutil.ReadDir(src)
if err != nil {
return nil, err
}
srcDirFileList := map[string]string{}
for _, fileInSrcDir := range filesInSrcDir {
srcDirFileList[dest + "/" + fileInSrcDir.Name()] = src + "/" + fileInSrcDir.Name()
}
filesInSrcFileList, err := expandDataFiles(srcDirFileList)
if err != nil {
return nil, err
}
for dest, src := range filesInSrcFileList {
expandedFiles[dest] = src
}
continue
}
expandedFiles[dest] = src
}
return expandedFiles, nil
}