github.com/opsmatic/godep@v0.1.5/pkg.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"io"
     6  	"os"
     7  	"os/exec"
     8  )
     9  
    10  type Package struct {
    11  	Dir        string
    12  	Root       string
    13  	ImportPath string
    14  	Deps       []string
    15  	Standard   bool
    16  
    17  	GoFiles        []string
    18  	CgoFiles       []string
    19  	IgnoredGoFiles []string
    20  
    21  	TestGoFiles  []string
    22  	TestImports  []string
    23  	XTestGoFiles []string
    24  	XTestImports []string
    25  
    26  	Error struct {
    27  		Err string
    28  	}
    29  }
    30  
    31  // LoadPackages loads the named packages using go list -json.
    32  // Unlike the go tool, an empty argument list is treated as
    33  // an empty list; "." must be given explicitly if desired.
    34  func LoadPackages(name ...string) (a []*Package, err error) {
    35  	if len(name) == 0 {
    36  		return nil, nil
    37  	}
    38  	args := []string{"list", "-e", "-json"}
    39  	cmd := exec.Command("go", append(args, name...)...)
    40  	r, err := cmd.StdoutPipe()
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  	cmd.Stderr = os.Stderr
    45  	err = cmd.Start()
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  	d := json.NewDecoder(r)
    50  	for {
    51  		info := new(Package)
    52  		err = d.Decode(info)
    53  		if err == io.EOF {
    54  			break
    55  		}
    56  		if err != nil {
    57  			info.Error.Err = err.Error()
    58  		}
    59  		a = append(a, info)
    60  	}
    61  	err = cmd.Wait()
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  	return a, nil
    66  }
    67  
    68  func (p *Package) allGoFiles() (a []string) {
    69  	a = append(a, p.GoFiles...)
    70  	a = append(a, p.CgoFiles...)
    71  	a = append(a, p.TestGoFiles...)
    72  	a = append(a, p.XTestGoFiles...)
    73  	a = append(a, p.IgnoredGoFiles...)
    74  	return a
    75  }