github.com/psexton/git-lfs@v2.1.1-0.20170517224304-289a18b2bc53+incompatible/lfs/gitscanner_cmd.go (about)

     1  package lfs
     2  
     3  import (
     4  	"bufio"
     5  	"io"
     6  	"os/exec"
     7  	"strings"
     8  
     9  	"github.com/rubyist/tracerx"
    10  )
    11  
    12  type wrappedCmd struct {
    13  	Stdin  io.WriteCloser
    14  	Stdout *bufio.Reader
    15  	Stderr *bufio.Reader
    16  	*exec.Cmd
    17  }
    18  
    19  // startCommand starts up a command and creates a stdin pipe and a buffered
    20  // stdout & stderr pipes, wrapped in a wrappedCmd. The stdout buffer will be of stdoutBufSize
    21  // bytes.
    22  func startCommand(command string, args ...string) (*wrappedCmd, error) {
    23  	cmd := exec.Command(command, args...)
    24  	stdout, err := cmd.StdoutPipe()
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  	stderr, err := cmd.StderrPipe()
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  
    33  	stdin, err := cmd.StdinPipe()
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  
    38  	tracerx.Printf("run_command: %s %s", command, strings.Join(args, " "))
    39  	if err := cmd.Start(); err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	return &wrappedCmd{
    44  		stdin,
    45  		bufio.NewReaderSize(stdout, stdoutBufSize),
    46  		bufio.NewReaderSize(stderr, stdoutBufSize),
    47  		cmd,
    48  	}, nil
    49  }