runner: pipe commands together
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package runner
|
package runner
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@@ -26,3 +27,33 @@ func (runner *ZRunner) Run(ctx context.Context, command string, formatArgs ...an
|
|||||||
cmd := exec.Command(runner.Prog, args...)
|
cmd := exec.Command(runner.Prog, args...)
|
||||||
return cmd.CombinedOutput()
|
return cmd.CombinedOutput()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Pipeline(cmds ...*exec.Cmd) ([]byte, error) {
|
||||||
|
for i := 0; i < len(cmds)-1; i++ {
|
||||||
|
stdout, err := cmds[i].StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
cmds[i+1].Stdin = stdout
|
||||||
|
}
|
||||||
|
|
||||||
|
out := bytes.Buffer{}
|
||||||
|
|
||||||
|
cmds[len(cmds)-1].Stdout = &out
|
||||||
|
|
||||||
|
for _, cmd := range cmds {
|
||||||
|
err := cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
return out.Bytes(), err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, cmd := range cmds {
|
||||||
|
err := cmd.Wait()
|
||||||
|
if err != nil {
|
||||||
|
return out.Bytes(), err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out.Bytes(), nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,9 +2,11 @@ package runner_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"os/exec"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"git.gentoo.party/sam/thanks/internal/runner"
|
"git.gentoo.party/sam/thanks/internal/runner"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_ZCommand(t *testing.T) {
|
func Test_ZCommand(t *testing.T) {
|
||||||
@@ -19,3 +21,12 @@ func Test_ZCommand(t *testing.T) {
|
|||||||
t.Errorf("localRunner failed: %s\n\n%s", err.Error(), out)
|
t.Errorf("localRunner failed: %s\n\n%s", err.Error(), out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_Pipelie(t *testing.T) {
|
||||||
|
c1 := exec.Command("echo", "-n", "foo")
|
||||||
|
c2 := exec.Command("rev")
|
||||||
|
out, err := runner.Pipeline(c1, c2)
|
||||||
|
|
||||||
|
assert.Equal(t, "oof", string(out))
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user