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  }