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