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 }