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() }