github.com/demerzelsolutions/courtney@v0.3.0/shared/shared.go (about)

     1  package shared
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  
     7  	"path/filepath"
     8  
     9  	"github.com/dave/patsy"
    10  	"github.com/dave/patsy/vos"
    11  )
    12  
    13  // Setup holds globals, environment and command line flags for the courtney
    14  // command
    15  type Setup struct {
    16  	Env      vos.Env
    17  	Paths    *patsy.Cache
    18  	Enforce  bool
    19  	Verbose  bool
    20  	Short    bool
    21  	Timeout  string
    22  	Load     string
    23  	Output   string
    24  	TestArgs []string
    25  	Packages []PackageSpec
    26  }
    27  
    28  // PackageSpec identifies a package by dir and path
    29  type PackageSpec struct {
    30  	Dir  string
    31  	Path string
    32  }
    33  
    34  // Parse parses a slice of strings into the Packages slice
    35  func (s *Setup) Parse(args []string) error {
    36  	if len(args) == 0 {
    37  		args = []string{"./..."}
    38  	}
    39  	packages := map[string]string{}
    40  	for _, ppath := range args {
    41  		var dir string
    42  		recursive := false
    43  		if strings.HasSuffix(ppath, "/...") {
    44  			ppath = strings.TrimSuffix(ppath, "/...")
    45  			recursive = true
    46  		}
    47  		if strings.HasSuffix(ppath, "/") {
    48  			ppath = strings.TrimSuffix(ppath, "/")
    49  		}
    50  		if ppath == "." {
    51  			var err error
    52  			dir, err = s.Env.Getwd()
    53  			if err != nil {
    54  				return err
    55  			}
    56  			ppath, err = s.Paths.Path(dir)
    57  			if err != nil {
    58  				return err
    59  			}
    60  		} else {
    61  			var err error
    62  			dir, err = s.Paths.Dir(ppath)
    63  			if err != nil {
    64  				return err
    65  			}
    66  		}
    67  		if !recursive {
    68  			packages[ppath] = dir
    69  		} else {
    70  			dirs := map[string]bool{}
    71  			filepath.Walk(dir, func(fpath string, info os.FileInfo, err error) error {
    72  				if !info.IsDir() && strings.HasSuffix(info.Name(), ".go") {
    73  					// Scan until we find a Go source file. Record the dir and
    74  					// skip the rest of the dir
    75  					fdir, _ := filepath.Split(fpath)
    76  					// don't want the dir to end with "/"
    77  					fdir = strings.TrimSuffix(fdir, string(filepath.Separator))
    78  					dirs[fdir] = true
    79  					return nil
    80  				}
    81  				return nil
    82  			})
    83  			for dir := range dirs {
    84  				ppath, err := s.Paths.Path(dir)
    85  				if err != nil {
    86  					return err
    87  				}
    88  				packages[ppath] = dir
    89  			}
    90  		}
    91  	}
    92  	for ppath, dir := range packages {
    93  		s.Packages = append(s.Packages, PackageSpec{Path: ppath, Dir: dir})
    94  	}
    95  	return nil
    96  }