github.com/jfrog/jfrog-cli-go@v1.22.1-0.20200318093948-4826ef344ffd/artifactory/utils/npm/list.go (about) 1 package npm 2 3 import ( 4 gofrogcmd "github.com/jfrog/gofrog/io" 5 "github.com/jfrog/jfrog-client-go/utils/errorutils" 6 "github.com/jfrog/jfrog-client-go/utils/log" 7 "github.com/mattn/go-shellwords" 8 "io" 9 "io/ioutil" 10 "sync" 11 ) 12 13 func RunList(flags, executablePath string) (stdResult, errResult []byte, err error) { 14 log.Debug("Running npm list command.") 15 splitFlags, err := shellwords.Parse(flags) 16 if err != nil { 17 return nil, nil, errorutils.CheckError(err) 18 } 19 20 listCmd := createListCommand(executablePath, splitFlags) 21 outData, errData, err := listCmd.exec() 22 log.Debug("npm list standard output is:\n" + string(outData)) 23 log.Debug("npm list error output is:\n" + string(errData)) 24 return outData, errData, err 25 } 26 27 func (listCmd *listCommand) exec() (outData, errData []byte, err error) { 28 var wg sync.WaitGroup 29 cmdErrors := make([]error, 3) 30 wg.Add(3) 31 go func() { 32 defer wg.Done() 33 cmdErrors[0] = gofrogcmd.RunCmd(listCmd.cmdConfig) 34 }() 35 36 go func() { 37 defer wg.Done() 38 defer listCmd.outPipeReader.Close() 39 data, err := ioutil.ReadAll(listCmd.outPipeReader) 40 cmdErrors[1] = err 41 outData = data 42 }() 43 44 go func() { 45 defer wg.Done() 46 defer listCmd.errPipeReader.Close() 47 data, err := ioutil.ReadAll(listCmd.errPipeReader) 48 cmdErrors[2] = err 49 errData = data 50 }() 51 52 wg.Wait() 53 for _, err := range cmdErrors { 54 if err != nil { 55 return outData, errData, errorutils.CheckError(err) 56 } 57 } 58 return outData, errData, nil 59 } 60 61 func createListCommand(executablePath string, splitFlags []string) *listCommand { 62 outPipeReader, outPipeWriter := io.Pipe() 63 errPipeReader, errPipeWriter := io.Pipe() 64 configListCmdConfig := createListCmdConfig(executablePath, splitFlags, outPipeWriter, errPipeWriter) 65 return &listCommand{cmdConfig: configListCmdConfig, 66 outPipeReader: outPipeReader, 67 errPipeReader: errPipeReader, 68 } 69 } 70 71 func createListCmdConfig(executablePath string, splitFlags []string, outPipeWriter *io.PipeWriter, errPipeWriter *io.PipeWriter) *NpmConfig { 72 return &NpmConfig{ 73 Npm: executablePath, 74 Command: []string{"list"}, 75 CommandFlags: append(splitFlags, "-json=true"), 76 StrWriter: outPipeWriter, 77 ErrWriter: errPipeWriter, 78 } 79 } 80 81 type listCommand struct { 82 cmdConfig *NpmConfig 83 outPipeReader *io.PipeReader 84 errPipeReader *io.PipeReader 85 }