github.com/lixvbnet/courtney@v0.0.0-20221025031132-0dcb02231211/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/lixvbnet/courtney/scanner"
    12  	"github.com/lixvbnet/courtney/shared"
    13  	"github.com/lixvbnet/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.Printf("%+v", 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  	if err := setup.Parse(flag.Args()); err != nil {
    53  		return errors.Wrapf(err, "Parse")
    54  	}
    55  
    56  	s := scanner.New(setup)
    57  	if err := s.LoadProgram(); err != nil {
    58  		return errors.Wrapf(err, "LoadProgram")
    59  	}
    60  	if err := s.ScanPackages(); err != nil {
    61  		return errors.Wrapf(err, "ScanPackages")
    62  	}
    63  
    64  	t := tester.New(setup)
    65  	if setup.Load == "" {
    66  		if err := t.Test(); err != nil {
    67  			return errors.Wrapf(err, "Test")
    68  		}
    69  	} else {
    70  		if err := t.Load(); err != nil {
    71  			return errors.Wrapf(err, "Load")
    72  		}
    73  	}
    74  	if err := t.ProcessExcludes(s.Excludes); err != nil {
    75  		return errors.Wrapf(err, "ProcessExcludes")
    76  	}
    77  	if err := t.Save(); err != nil {
    78  		return errors.Wrapf(err, "Save")
    79  	}
    80  	if err := t.Enforce(); err != nil {
    81  		return errors.Wrapf(err, "Enforce")
    82  	}
    83  
    84  	return nil
    85  }
    86  
    87  type argsValue struct {
    88  	args []string
    89  }
    90  
    91  var _ flag.Value = (*argsValue)(nil)
    92  
    93  func (v *argsValue) String() string {
    94  	// notest
    95  	if v == nil {
    96  		return ""
    97  	}
    98  	return strings.Join(v.args, " ")
    99  }
   100  func (v *argsValue) Set(s string) error {
   101  	// notest
   102  	v.args = append(v.args, s)
   103  	return nil
   104  }