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  }