mirror of https://github.com/databricks/cli.git
44 lines
939 B
Go
44 lines
939 B
Go
|
package process
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"os/exec"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/databricks/cli/libs/env"
|
||
|
"github.com/databricks/cli/libs/log"
|
||
|
)
|
||
|
|
||
|
func Forwarded(ctx context.Context, args []string, src io.Reader, outWriter, errWriter io.Writer, opts ...execOption) error {
|
||
|
commandStr := strings.Join(args, " ")
|
||
|
log.Debugf(ctx, "starting: %s", commandStr)
|
||
|
cmd := exec.CommandContext(ctx, args[0], args[1:]...)
|
||
|
|
||
|
// empirical tests showed buffered copies being more responsive
|
||
|
cmd.Stdout = outWriter
|
||
|
cmd.Stderr = errWriter
|
||
|
cmd.Stdin = src
|
||
|
// we pull the env through lib/env such that we can run
|
||
|
// parallel tests with anything using libs/process.
|
||
|
for k, v := range env.All(ctx) {
|
||
|
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", k, v))
|
||
|
}
|
||
|
|
||
|
// apply common options
|
||
|
for _, o := range opts {
|
||
|
err := o(ctx, cmd)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
err := cmd.Start()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return cmd.Wait()
|
||
|
}
|