github.com/DanRoseus/courtney@v0.3.0/courtney.go (about) 1 package main 2 3 import ( 4 "flag" 5 "os" 6 7 "strings" 8 9 "fmt" 10 11 "github.com/dave/courtney/scanner" 12 "github.com/dave/courtney/shared" 13 "github.com/dave/courtney/tester" 14 "github.com/dave/patsy" 15 "github.com/dave/patsy/vos" 16 ) 17 18 func main() { 19 // notest 20 env := vos.Os() 21 22 enforceFlag := flag.Bool("e", false, "Enforce 100% code coverage") 23 verboseFlag := flag.Bool("v", false, "Verbose output") 24 shortFlag := flag.Bool("short", false, "Pass the short flag to the go test command") 25 timeoutFlag := flag.String("timeout", "", "Pass the timeout flag to the go test command") 26 outputFlag := flag.String("o", "", "Override coverage file location") 27 argsFlag := new(argsValue) 28 flag.Var(argsFlag, "t", "Argument to pass to the 'go test' command. Can be used more than once.") 29 loadFlag := flag.String("l", "", "Load coverage file(s) instead of running 'go test'") 30 31 flag.Parse() 32 33 setup := &shared.Setup{ 34 Env: env, 35 Paths: patsy.NewCache(env), 36 Enforce: *enforceFlag, 37 Verbose: *verboseFlag, 38 Short: *shortFlag, 39 Timeout: *timeoutFlag, 40 Output: *outputFlag, 41 TestArgs: argsFlag.args, 42 Load: *loadFlag, 43 } 44 if err := Run(setup); err != nil { 45 fmt.Println(err) 46 os.Exit(1) 47 } 48 } 49 50 // Run initiates the command with the provided setup 51 func Run(setup *shared.Setup) error { 52 53 if err := setup.Parse(flag.Args()); err != nil { 54 return err 55 } 56 57 s := scanner.New(setup) 58 if err := s.LoadProgram(); err != nil { 59 return err 60 } 61 if err := s.ScanPackages(); err != nil { 62 return err 63 } 64 65 t := tester.New(setup) 66 if setup.Load == "" { 67 if err := t.Test(); err != nil { 68 return err 69 } 70 } else { 71 if err := t.Load(); err != nil { 72 return err 73 } 74 } 75 if err := t.ProcessExcludes(s.Excludes); err != nil { 76 return err 77 } 78 if err := t.Save(); err != nil { 79 return err 80 } 81 if err := t.Enforce(); err != nil { 82 return err 83 } 84 85 return nil 86 } 87 88 type argsValue struct { 89 args []string 90 } 91 92 var _ flag.Value = (*argsValue)(nil) 93 94 func (v *argsValue) String() string { 95 // notest 96 if v == nil { 97 return "" 98 } 99 return strings.Join(v.args, " ") 100 } 101 func (v *argsValue) Set(s string) error { 102 // notest 103 v.args = append(v.args, s) 104 return nil 105 }