-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgoby.go
225 lines (186 loc) · 3.8 KB
/
goby.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"os/exec"
"errors"
)
// Goby resembles the content of a deb-package as found on Ubuntu or Debian derivates
// it consists of gzipped control.tar.gz and data.tar.gz tar archives
// and a debian-binary file containing the package semantic version
// all three files are packaged into an ar-Archive
type Goby struct {
ctrl *Ctrl
data *Data
preGoby string
postGoby string
outputFile string
err error
}
func NewGoby(cfgFilepath string) (*Goby, error) {
config, err := ioutil.ReadFile(cfgFilepath)
if err != nil {
return nil, err
}
ctrl, err := NewCtrl(config)
if err != nil {
return nil, err
}
data, err := NewData(config)
if err != nil {
return nil, err
}
actions := struct {
PreGoby string `json:"preGoby"`
PostGoby string `json:"postGoby"`
OutputFile string `json:"outputFile"`
}{}
err = json.Unmarshal(config, &actions)
if err != nil {
return nil, err
}
return &Goby{
ctrl: ctrl,
data: data,
preGoby: actions.PreGoby,
postGoby: actions.PostGoby,
outputFile: actions.OutputFile,
}, nil
}
func (g *Goby) Make(filePath string) error {
if g.err != nil {
return g.err
}
fmt.Print("Running pre goby commands ... ")
if err := g.run(g.preGoby); err != nil {
g.err = err
return err
}
fmt.Print("done\n")
/*
Checks
*/
fmt.Print("Running package checks ... ")
if err := g.check(); err != nil {
g.err = err
return err
}
fmt.Print("done\n")
/*
Builds
*/
fmt.Print("Building package ... ")
content, err := g.build()
if err != nil {
g.err = err
return err
}
fmt.Print("done\n")
/*
Writing Data
*/
if filePath == defaultPackageName {
if g.outputFile != "" {
filePath = g.outputFile
} else {
filePath = string(g.ctrl.Package) + "-" + string(g.ctrl.Version) + ".deb"
}
}
fmt.Print("Writing contents to " + filePath + " ... ")
if err := g.write(content, filePath); err != nil {
g.err = err
return err
}
fmt.Print("done\n")
fmt.Print("Running post goby commands ... ")
if err := g.run(g.postGoby); err != nil {
g.err = err
return err
}
fmt.Print("done\n")
return nil
}
func (g *Goby) run(command string) error {
if g.err != nil {
return g.err
}
command = whiteTrim(command)
if command == "" {
return nil
}
shell, err := exec.LookPath("bash")
if err != nil {
shell, err = exec.LookPath("sh")
if err != nil {
return errors.New("Neither bash nor sh found to execute: " + command)
}
}
cmd := exec.Command(shell,"-c", command)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func (g *Goby) check() error {
if g.err != nil {
return g.err
}
if err := g.data.Check(); err != nil {
g.err = err
return err
}
if err := g.ctrl.Check(); err != nil {
g.err = err
return err
}
return nil
}
func (g *Goby) build() ([]byte, error) {
if g.err != nil {
return nil, g.err
}
deb := NewArArchive()
// Ubuntu is picky about debian-binary being first in the package
deb.AddFile("debian-binary", []byte("2.0\n"))
// Build gzipped control tar archive
ctrl, err := g.ctrl.Build(g.data)
if err != nil {
g.err = err
return nil, err
}
// Add control archive to ar-Archive
if err = deb.AddFile("control.tar.gz", ctrl); err != nil {
g.err = err
return nil, err
}
// Build gzipped data tar archive
data, err := g.data.Build()
if err != nil {
g.err = err
return nil, err
}
// Add data archive to ar-Archive
if err = deb.AddFile("data.tar.gz", data); err != nil {
g.err = err
return nil, err
}
return deb.Data()
}
func (g *Goby) write(content []byte, filePath string) error {
if g.err != nil {
return g.err
}
f, err := os.Create(filePath)
defer f.Close()
if err != nil {
g.err = err
return err
}
_, err = f.Write(content)
if err != nil {
g.err = err
return err
}
return nil
}