go.dsage.org/courtney@v0.4.1-0.20240216163045-2a9a7e4f5143/courtney.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 "strings" 8 9 "github.com/pkg/errors" 10 11 "github.com/dave/patsy" 12 "github.com/dave/patsy/vos" 13 14 "go.dsage.org/courtney/scanner" 15 "go.dsage.org/courtney/shared" 16 "go.dsage.org/courtney/tester" 17 ) 18 19 func main() { 20 // notest 21 env := vos.Os() 22 23 enforceFlag := flag.Bool("e", false, "Enforce 100% code coverage") 24 verboseFlag := flag.Bool("v", false, "Verbose output") 25 shortFlag := flag.Bool("short", false, "Pass the short flag to the go test command") 26 timeoutFlag := flag.String("timeout", "", "Pass the timeout flag to the go test command") 27 outputFlag := flag.String("o", "", "Override coverage file location") 28 argsFlag := new(argsValue) 29 flag.Var(argsFlag, "t", "Argument to pass to the 'go test' command. Can be used more than once.") 30 loadFlag := flag.String("l", "", "Load coverage file(s) instead of running 'go test'") 31 32 flag.Parse() 33 34 setup := &shared.Setup{ 35 Env: env, 36 Paths: patsy.NewCache(env), 37 Enforce: *enforceFlag, 38 Verbose: *verboseFlag, 39 Short: *shortFlag, 40 Timeout: *timeoutFlag, 41 Output: *outputFlag, 42 TestArgs: argsFlag.args, 43 Load: *loadFlag, 44 } 45 if err := Run(setup); err != nil { 46 fmt.Printf("%+v", err) 47 os.Exit(1) 48 } 49 } 50 51 // Run initiates the command with the provided setup 52 func Run(setup *shared.Setup) error { 53 if err := setup.Parse(flag.Args()); err != nil { 54 return errors.Wrapf(err, "Parse") 55 } 56 57 s := scanner.New(setup) 58 if err := s.LoadProgram(); err != nil { 59 return errors.Wrapf(err, "LoadProgram") 60 } 61 if err := s.ScanPackages(); err != nil { 62 return errors.Wrapf(err, "ScanPackages") 63 } 64 65 t := tester.New(setup) 66 if setup.Load == "" { 67 if err := t.Test(); err != nil { 68 return errors.Wrapf(err, "Test") 69 } 70 } else { 71 if err := t.Load(); err != nil { 72 return errors.Wrapf(err, "Load") 73 } 74 } 75 if err := t.ProcessExcludes(s.Excludes); err != nil { 76 return errors.Wrapf(err, "ProcessExcludes") 77 } 78 if err := t.Save(); err != nil { 79 return errors.Wrapf(err, "Save") 80 } 81 if err := t.Enforce(); err != nil { 82 return errors.Wrapf(err, "Enforce") 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 }