Skip to content

Commit 201cc56

Browse files
Merge pull request #80 from yassinebenaid/refactor
Refactor and cleanup
2 parents 4167b91 + 313c7cc commit 201cc56

File tree

13 files changed

+151
-139
lines changed

13 files changed

+151
-139
lines changed

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ RUN go mod download
88

99
RUN CGO_ENABLED=0 go build -o /usr/local/bin/bunster ./cmd/bunster
1010

11-
RUN rm -rf /bunster
11+
RUN rm -rf /bunster /tmp/* /var/tmp/*
1212

13-
CMD ["bash"]
13+
CMD ["bash"]

cmd/bunster/main.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,21 @@ import (
1313

1414
func main() {
1515
app := cli.Command{
16-
Name: "bunster",
16+
Name: "bunster",
17+
Usage: "compile shell script to self-contained executable programs",
1718
Commands: []*cli.Command{
1819
{
19-
Name: "ast",
20-
Description: "Print the script ast",
21-
Action: astCMD,
20+
Name: "ast",
21+
Usage: "Print the script ast",
22+
Action: astCMD,
2223
Flags: []cli.Flag{
2324
&cli.BoolFlag{Name: "no-ansi", Aliases: []string{"n"}},
2425
},
2526
},
2627
{
27-
Name: "build",
28-
Description: "Build a script",
29-
Action: buildCMD,
28+
Name: "build",
29+
Usage: "Build a script",
30+
Action: buildCMD,
3031
Flags: []cli.Flag{
3132
&cli.StringFlag{Name: "o", Required: true},
3233
&cli.StringFlag{Name: "build-space"},

generator/compound.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,23 @@ import (
88
func (g *generator) handleGroup(buf *InstructionBuffer, group ast.Group, pc *pipeContext) {
99
var cmdbuf InstructionBuffer
1010

11-
g.handleRedirections(&cmdbuf, "group", group.Redirections, pc, true)
11+
cmdbuf.add(ir.CloneStreamManager{})
12+
g.handleRedirections(&cmdbuf, group.Redirections, pc)
1213

1314
if pc == nil {
1415
for _, cmd := range group.Body {
1516
g.generate(&cmdbuf, cmd, nil)
1617
}
1718
} else {
18-
cmdbuf.add(ir.Literal("var done = make(chan struct{},1)"))
19-
cmdbuf.add(ir.Literal(`
20-
pipelineWaitgroup = append(pipelineWaitgroup, func() error {
19+
cmdbuf.add(ir.Literal("var done = make(chan struct{},1)\n"))
20+
cmdbuf.add(ir.PushToPipelineWaitgroup{
21+
Waitgroup: pc.waitgroup,
22+
Value: ir.Literal(`func() error {
2123
<-done
22-
streamManager.Destroy()
24+
streamManager.Destroy()
2325
return nil
24-
})
25-
`))
26+
}`),
27+
})
2628

2729
var go_routing InstructionBuffer
2830
for _, cmd := range group.Body {
@@ -44,22 +46,23 @@ func (g *generator) handleSubshell(buf *InstructionBuffer, subshell ast.SubShell
4446
var cmdbuf InstructionBuffer
4547

4648
cmdbuf.add(ir.CloneShell{})
47-
48-
g.handleRedirections(&cmdbuf, "subshell", subshell.Redirections, pc, true)
49+
cmdbuf.add(ir.CloneStreamManager{})
50+
g.handleRedirections(&cmdbuf, subshell.Redirections, pc)
4951

5052
if pc == nil {
5153
for _, cmd := range subshell.Body {
5254
g.generate(&cmdbuf, cmd, nil)
5355
}
5456
} else {
55-
cmdbuf.add(ir.Literal("var done = make(chan struct{},1)"))
56-
cmdbuf.add(ir.Literal(`
57-
pipelineWaitgroup = append(pipelineWaitgroup, func() error {
57+
cmdbuf.add(ir.Literal("var done = make(chan struct{},1)\n"))
58+
cmdbuf.add(ir.PushToPipelineWaitgroup{
59+
Waitgroup: pc.waitgroup,
60+
Value: ir.Literal(`func() error {
5861
<-done
59-
streamManager.Destroy()
62+
streamManager.Destroy()
6063
return nil
61-
})
62-
`))
64+
}`),
65+
})
6366

6467
var go_routing InstructionBuffer
6568
for _, cmd := range subshell.Body {

generator/expansion.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ import (
88
func (g *generator) handleCommandSubstitution(statements ast.CommandSubstitution) ir.Instruction {
99
var cmdbuf InstructionBuffer
1010

11-
cmdbuf.add(ir.CloneFDT{})
11+
cmdbuf.add(ir.CloneStreamManager{DeferDestroy: true})
1212
cmdbuf.add(ir.CloneShell{})
1313
cmdbuf.add(ir.Declare{
14-
Name: "stdout",
14+
Name: "buffer",
1515
Value: ir.NewBuffer{Value: ir.String("")},
1616
})
17-
cmdbuf.add(ir.AddStream{Fd: "1", StreamName: "stdout"})
17+
cmdbuf.add(ir.AddStream{Fd: "1", StreamName: "buffer"})
1818

1919
for _, statement := range statements {
2020
g.generate(&cmdbuf, statement, nil)
2121
}
2222

23-
cmdbuf.add(ir.Literal("return stdout.String(true)"))
23+
cmdbuf.add(ir.Literal("return buffer.String(true)"))
2424

2525
return ir.ExpressionClosure(cmdbuf)
2626
}

generator/generator.go

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -123,25 +123,17 @@ func (g *generator) handleSimpleCommand(buf *InstructionBuffer, cmd ast.Command,
123123
})
124124
}
125125

126-
g.handleRedirections(&cmdbuf, "command", cmd.Redirections, pc, false)
127-
cmdbuf.add(ir.SetStream{
128-
Name: "command.Stdin",
129-
Fd: ir.String("0"),
130-
})
131-
cmdbuf.add(ir.SetStream{
132-
Name: "command.Stdout",
133-
Fd: ir.String("1"),
134-
})
135-
cmdbuf.add(ir.SetStream{
136-
Name: "command.Stderr",
137-
Fd: ir.String("2"),
138-
})
126+
cmdbuf.add(ir.CloneStreamManager{DeferDestroy: true})
127+
g.handleRedirections(&cmdbuf, cmd.Redirections, pc)
128+
cmdbuf.add(ir.SetStream{Name: "command.Stdin", Fd: ir.String("0")})
129+
cmdbuf.add(ir.SetStream{Name: "command.Stdout", Fd: ir.String("1")})
130+
cmdbuf.add(ir.SetStream{Name: "command.Stderr", Fd: ir.String("2")})
139131

140132
if pc != nil {
141133
cmdbuf.add(ir.StartCommand("command"))
142134
cmdbuf.add(ir.PushToPipelineWaitgroup{
143135
Waitgroup: pc.waitgroup,
144-
Command: "command",
136+
Value: ir.Literal("command.Wait"),
145137
})
146138
} else {
147139
cmdbuf.add(ir.RunCommand("command"))
@@ -181,8 +173,7 @@ func (g *generator) handleExpression(expression ast.Expression) ir.Instruction {
181173
}
182174
}
183175

184-
func (g *generator) handleRedirections(buf *InstructionBuffer, name string, redirections []ast.Redirection, pc *pipeContext, nd bool) {
185-
buf.add(ir.CloneFDT{ND: nd})
176+
func (g *generator) handleRedirections(buf *InstructionBuffer, redirections []ast.Redirection, pc *pipeContext) {
186177

187178
// if we're inside a pipline, we need to connect the pipe to the command.(before any other redirection)
188179
if pc != nil {
@@ -203,51 +194,51 @@ func (g *generator) handleRedirections(buf *InstructionBuffer, name string, redi
203194
switch redirection.Method {
204195
case ">", ">|":
205196
buf.add(ir.OpenStream{
206-
Name: fmt.Sprintf("%s_file_%d", name, i),
197+
Name: fmt.Sprintf("stream%d", i),
207198
Target: g.handleExpression(redirection.Dst),
208199
Mode: ir.FLAG_WRITE,
209200
})
210201
buf.add(ir.AddStream{
211202
Fd: redirection.Src,
212-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
203+
StreamName: fmt.Sprintf("stream%d", i),
213204
})
214205
case ">>":
215206
buf.add(ir.OpenStream{
216-
Name: fmt.Sprintf("%s_file_%d", name, i),
207+
Name: fmt.Sprintf("stream%d", i),
217208
Target: g.handleExpression(redirection.Dst),
218209
Mode: ir.FLAG_APPEND,
219210
})
220211
buf.add(ir.AddStream{
221212
Fd: redirection.Src,
222-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
213+
StreamName: fmt.Sprintf("stream%d", i),
223214
})
224215
case "&>":
225216
buf.add(ir.OpenStream{
226-
Name: fmt.Sprintf("%s_file_%d", name, i),
217+
Name: fmt.Sprintf("stream%d", i),
227218
Target: g.handleExpression(redirection.Dst),
228219
Mode: ir.FLAG_WRITE,
229220
})
230221
buf.add(ir.AddStream{
231222
Fd: "1",
232-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
223+
StreamName: fmt.Sprintf("stream%d", i),
233224
})
234225
buf.add(ir.AddStream{
235226
Fd: "2",
236-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
227+
StreamName: fmt.Sprintf("stream%d", i),
237228
})
238229
case "&>>":
239230
buf.add(ir.OpenStream{
240-
Name: fmt.Sprintf("%s_file_%d", name, i),
231+
Name: fmt.Sprintf("stream%d", i),
241232
Target: g.handleExpression(redirection.Dst),
242233
Mode: ir.FLAG_APPEND,
243234
})
244235
buf.add(ir.AddStream{
245236
Fd: "1",
246-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
237+
StreamName: fmt.Sprintf("stream%d", i),
247238
})
248239
buf.add(ir.AddStream{
249240
Fd: "2",
250-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
241+
StreamName: fmt.Sprintf("stream%d", i),
251242
})
252243
case ">&", "<&":
253244
if redirection.Dst == nil && redirection.Close {
@@ -267,35 +258,35 @@ func (g *generator) handleRedirections(buf *InstructionBuffer, name string, redi
267258
}
268259
case "<":
269260
buf.add(ir.OpenStream{
270-
Name: fmt.Sprintf("%s_file_%d", name, i),
261+
Name: fmt.Sprintf("stream%d", i),
271262
Target: g.handleExpression(redirection.Dst),
272263
Mode: ir.FLAG_READ,
273264
})
274265
buf.add(ir.AddStream{
275266
Fd: redirection.Src,
276-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
267+
StreamName: fmt.Sprintf("stream%d", i),
277268
})
278269
case "<<<":
279270
buf.add(ir.Declare{
280-
Name: fmt.Sprintf("%s_file_%d", name, i),
271+
Name: fmt.Sprintf("stream%d", i),
281272
Value: ir.NewBuffer{
282273
Readonly: true,
283274
Value: g.handleExpression(redirection.Dst),
284275
},
285276
})
286277
buf.add(ir.AddStream{
287278
Fd: redirection.Src,
288-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
279+
StreamName: fmt.Sprintf("stream%d", i),
289280
})
290281
case "<>":
291282
buf.add(ir.OpenStream{
292-
Name: fmt.Sprintf("%s_file_%d", name, i),
283+
Name: fmt.Sprintf("stream%d", i),
293284
Target: g.handleExpression(redirection.Dst),
294285
Mode: ir.FLAG_RW,
295286
})
296287
buf.add(ir.AddStream{
297288
Fd: redirection.Src,
298-
StreamName: fmt.Sprintf("%s_file_%d", name, i),
289+
StreamName: fmt.Sprintf("stream%d", i),
299290
})
300291
}
301292
}

0 commit comments

Comments
 (0)