1
0
mirror of https://github.com/go-task/task.git synced 2025-11-29 22:48:03 +02:00

Migrate from os/exec.Cmd to a native Go sh interpreter

github.com/mvdan/sh

Closes #23
This commit is contained in:
Andrey Nering
2017-04-22 15:46:29 -03:00
parent e327dab695
commit 6bc27baa96
5 changed files with 103 additions and 92 deletions

73
task.go
View File

@@ -1,6 +1,7 @@
package task
import (
"bytes"
"context"
"fmt"
"log"
@@ -177,38 +178,54 @@ func (t *Task) runCommand(ctx context.Context, i int) error {
if err != nil {
return err
}
cmd := execext.NewCommand(ctx, c)
if dir != "" {
cmd.Dir = dir
envs, err := t.getEnviron(vars)
if err != nil {
return err
}
if t.Env != nil {
cmd.Env = os.Environ()
for key, value := range t.Env {
replacedValue, err := ReplaceVariables(value, vars)
if err != nil {
return err
}
replacedKey, err := ReplaceVariables(key, vars)
if err != nil {
return err
}
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", replacedKey, replacedValue))
}
opts := &execext.RunCommandOptions{
Context: ctx,
Command: c,
Dir: dir,
Env: envs,
Stdin: os.Stdin,
Stderr: os.Stderr,
}
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
if t.Set != "" {
bytes, err := cmd.Output()
if err != nil {
if t.Set == "" {
log.Println(c)
opts.Stdout = os.Stdout
if err = execext.RunCommand(opts); err != nil {
return err
}
os.Setenv(t.Set, strings.TrimSpace(string(bytes)))
return nil
}
cmd.Stdout = os.Stdout
log.Println(c)
if err = cmd.Run(); err != nil {
return err
} else {
buff := bytes.NewBuffer(nil)
opts.Stdout = buff
if err = execext.RunCommand(opts); err != nil {
return err
}
os.Setenv(t.Set, strings.TrimSpace(buff.String()))
}
return nil
}
func (t *Task) getEnviron(vars map[string]string) ([]string, error) {
if t.Env == nil {
return nil, nil
}
envs := os.Environ()
for k, v := range t.Env {
replacedValue, err := ReplaceVariables(v, vars)
if err != nil {
return nil, err
}
replacedKey, err := ReplaceVariables(k, vars)
if err != nil {
return nil, err
}
envs = append(envs, fmt.Sprintf("%s=%s", replacedKey, replacedValue))
}
return envs, nil
}