Skip to content

Commit 6a7ca5f

Browse files
Merge pull request #56 from yassinebenaid/dev
Add support for `&&` and `||` conditional command execution
2 parents 111fec9 + 37e3cdc commit 6a7ca5f

File tree

4 files changed

+533
-37
lines changed

4 files changed

+533
-37
lines changed

docs/supported-features.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,8 @@ key=value key2="value" command
3939
```shell
4040
command | command2 | command3
4141
```
42+
43+
## Conditional Execution
44+
```shell
45+
command || command2 && command3
46+
```

generator/generator.go

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,60 @@ func (g *generator) generate(buf *InstructionBuffer, statement ast.Statement, pc
4444
*buf = append(*buf, ir.Closure{
4545
Body: cmdbuf,
4646
})
47+
case ast.List:
48+
g.handleList(buf, v)
4749
}
4850
}
4951

52+
func (g *generator) handleList(buf *InstructionBuffer, l ast.List) {
53+
g.generate(buf, l.Left, nil)
54+
55+
var bodybuf InstructionBuffer
56+
g.generate(&bodybuf, l.Right, nil)
57+
58+
buf.add(ir.IfLastExitCode{
59+
Zero: l.Operator == "&&",
60+
Body: bodybuf,
61+
})
62+
}
63+
64+
func (g *generator) handlePipeline(buf *InstructionBuffer, p ast.Pipeline) {
65+
buf.add(ir.NewPipelineWaitgroup("pipelineWaitgroup"))
66+
67+
for i, cmd := range p {
68+
if i < (len(p) - 1) { //last command doesn't need a pipe
69+
buf.add(ir.NewPipe{
70+
Writer: fmt.Sprintf("pipeWriter%d", i+1),
71+
Reader: fmt.Sprintf("pipeReader%d", i+1),
72+
})
73+
}
74+
75+
var pc pipeContext
76+
if i == 0 {
77+
pc = pipeContext{
78+
writer: fmt.Sprintf("pipeWriter%d", i+1),
79+
stderr: cmd.Stderr,
80+
}
81+
} else if i == (len(p) - 1) {
82+
pc = pipeContext{
83+
reader: fmt.Sprintf("pipeReader%d", i),
84+
}
85+
} else {
86+
pc = pipeContext{
87+
writer: fmt.Sprintf("pipeWriter%d", i+1),
88+
reader: fmt.Sprintf("pipeReader%d", i),
89+
stderr: cmd.Stderr,
90+
}
91+
}
92+
93+
pc.waitgroup = "pipelineWaitgroup"
94+
g.generate(buf, cmd.Command, &pc)
95+
}
96+
97+
buf.add(ir.WaitPipelineWaitgroup("pipelineWaitgroup"))
98+
99+
}
100+
50101
func (g *generator) handleSimpleCommand(buf *InstructionBuffer, cmd ast.Command, pc *pipeContext) {
51102
buf.add(ir.Declare{Name: "commandName", Value: g.handleExpression(cmd.Name)})
52103
buf.add(ir.DeclareSlice{Name: "arguments"})
@@ -258,40 +309,3 @@ type pipeContext struct {
258309
waitgroup string
259310
stderr bool
260311
}
261-
262-
func (g *generator) handlePipeline(buf *InstructionBuffer, p ast.Pipeline) {
263-
buf.add(ir.NewPipelineWaitgroup("pipelineWaitgroup"))
264-
265-
for i, cmd := range p {
266-
if i < (len(p) - 1) { //last command doesn't need a pipe
267-
buf.add(ir.NewPipe{
268-
Writer: fmt.Sprintf("pipeWriter%d", i+1),
269-
Reader: fmt.Sprintf("pipeReader%d", i+1),
270-
})
271-
}
272-
273-
var pc pipeContext
274-
if i == 0 {
275-
pc = pipeContext{
276-
writer: fmt.Sprintf("pipeWriter%d", i+1),
277-
stderr: cmd.Stderr,
278-
}
279-
} else if i == (len(p) - 1) {
280-
pc = pipeContext{
281-
reader: fmt.Sprintf("pipeReader%d", i),
282-
}
283-
} else {
284-
pc = pipeContext{
285-
writer: fmt.Sprintf("pipeWriter%d", i+1),
286-
reader: fmt.Sprintf("pipeReader%d", i),
287-
stderr: cmd.Stderr,
288-
}
289-
}
290-
291-
pc.waitgroup = "pipelineWaitgroup"
292-
g.generate(buf, cmd.Command, &pc)
293-
}
294-
295-
buf.add(ir.WaitPipelineWaitgroup("pipelineWaitgroup"))
296-
297-
}

0 commit comments

Comments
 (0)