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  }