1*9bb1b549SSpandan Daspackage main 2*9bb1b549SSpandan Das 3*9bb1b549SSpandan Dasimport ( 4*9bb1b549SSpandan Das "flag" 5*9bb1b549SSpandan Das "fmt" 6*9bb1b549SSpandan Das "io/ioutil" 7*9bb1b549SSpandan Das "log" 8*9bb1b549SSpandan Das "os" 9*9bb1b549SSpandan Das "os/exec" 10*9bb1b549SSpandan Das "path/filepath" 11*9bb1b549SSpandan Das 12*9bb1b549SSpandan Das "gopkg.in/yaml.v2" 13*9bb1b549SSpandan Das) 14*9bb1b549SSpandan Das 15*9bb1b549SSpandan Dasfunc main() { 16*9bb1b549SSpandan Das log.SetFlags(0) 17*9bb1b549SSpandan Das log.SetPrefix("testrunner: ") 18*9bb1b549SSpandan Das 19*9bb1b549SSpandan Das var configPath string 20*9bb1b549SSpandan Das flag.StringVar(&configPath, "config", "", "location of presubmit.yml") 21*9bb1b549SSpandan Das flag.Parse() 22*9bb1b549SSpandan Das if configPath == "" { 23*9bb1b549SSpandan Das var err error 24*9bb1b549SSpandan Das configPath, err = findConfigPath() 25*9bb1b549SSpandan Das if err != nil { 26*9bb1b549SSpandan Das log.Fatal(err) 27*9bb1b549SSpandan Das } 28*9bb1b549SSpandan Das } 29*9bb1b549SSpandan Das 30*9bb1b549SSpandan Das if err := run(configPath, flag.Args()); err != nil { 31*9bb1b549SSpandan Das log.Fatal(err) 32*9bb1b549SSpandan Das } 33*9bb1b549SSpandan Das} 34*9bb1b549SSpandan Das 35*9bb1b549SSpandan Dasfunc run(configPath string, args []string) error { 36*9bb1b549SSpandan Das configData, err := ioutil.ReadFile(configPath) 37*9bb1b549SSpandan Das if err != nil { 38*9bb1b549SSpandan Das return err 39*9bb1b549SSpandan Das } 40*9bb1b549SSpandan Das var config interface{} 41*9bb1b549SSpandan Das if err := yaml.Unmarshal(configData, &config); err != nil { 42*9bb1b549SSpandan Das return err 43*9bb1b549SSpandan Das } 44*9bb1b549SSpandan Das 45*9bb1b549SSpandan Das platform := config.(map[interface{}]interface{})["platforms"].(map[interface{}]interface{})["windows"].(map[interface{}]interface{}) 46*9bb1b549SSpandan Das var buildFlags []string 47*9bb1b549SSpandan Das for _, f := range platform["build_flags"].([]interface{}) { 48*9bb1b549SSpandan Das buildFlags = append(buildFlags, f.(string)) 49*9bb1b549SSpandan Das } 50*9bb1b549SSpandan Das testFlags := buildFlags 51*9bb1b549SSpandan Das for _, f := range platform["test_flags"].([]interface{}) { 52*9bb1b549SSpandan Das testFlags = append(testFlags, f.(string)) 53*9bb1b549SSpandan Das } 54*9bb1b549SSpandan Das var buildTargets, testTargets []string 55*9bb1b549SSpandan Das if len(args) == 0 { 56*9bb1b549SSpandan Das for _, t := range platform["build_targets"].([]interface{}) { 57*9bb1b549SSpandan Das buildTargets = append(buildTargets, t.(string)) 58*9bb1b549SSpandan Das } 59*9bb1b549SSpandan Das for _, t := range platform["test_targets"].([]interface{}) { 60*9bb1b549SSpandan Das testTargets = append(testTargets, t.(string)) 61*9bb1b549SSpandan Das } 62*9bb1b549SSpandan Das } else { 63*9bb1b549SSpandan Das buildTargets = args 64*9bb1b549SSpandan Das testTargets = args 65*9bb1b549SSpandan Das } 66*9bb1b549SSpandan Das 67*9bb1b549SSpandan Das buildCmd := exec.Command("bazel", "build") 68*9bb1b549SSpandan Das buildCmd.Args = append(buildCmd.Args, buildFlags...) 69*9bb1b549SSpandan Das buildCmd.Args = append(buildCmd.Args, buildTargets...) 70*9bb1b549SSpandan Das buildCmd.Stdout = os.Stdout 71*9bb1b549SSpandan Das buildCmd.Stderr = os.Stderr 72*9bb1b549SSpandan Das if err := buildCmd.Run(); err != nil { 73*9bb1b549SSpandan Das return err 74*9bb1b549SSpandan Das } 75*9bb1b549SSpandan Das 76*9bb1b549SSpandan Das testCmd := exec.Command("bazel", "test") 77*9bb1b549SSpandan Das testCmd.Args = append(testCmd.Args, testFlags...) 78*9bb1b549SSpandan Das testCmd.Args = append(testCmd.Args, testTargets...) 79*9bb1b549SSpandan Das testCmd.Stdout = os.Stdout 80*9bb1b549SSpandan Das testCmd.Stderr = os.Stderr 81*9bb1b549SSpandan Das if err := testCmd.Run(); err != nil { 82*9bb1b549SSpandan Das return err 83*9bb1b549SSpandan Das } 84*9bb1b549SSpandan Das 85*9bb1b549SSpandan Das return nil 86*9bb1b549SSpandan Das} 87*9bb1b549SSpandan Das 88*9bb1b549SSpandan Dasfunc findConfigPath() (string, error) { 89*9bb1b549SSpandan Das d, err := os.Getwd() 90*9bb1b549SSpandan Das if err != nil { 91*9bb1b549SSpandan Das return "", err 92*9bb1b549SSpandan Das } 93*9bb1b549SSpandan Das for { 94*9bb1b549SSpandan Das configPath := filepath.Join(d, ".bazelci/presubmit.yml") 95*9bb1b549SSpandan Das _, err := os.Stat(configPath) 96*9bb1b549SSpandan Das if !os.IsNotExist(err) { 97*9bb1b549SSpandan Das return configPath, nil 98*9bb1b549SSpandan Das } 99*9bb1b549SSpandan Das parent := filepath.Dir(d) 100*9bb1b549SSpandan Das if parent == d { 101*9bb1b549SSpandan Das return "", fmt.Errorf("could not find presubmit.yml") 102*9bb1b549SSpandan Das } 103*9bb1b549SSpandan Das d = parent 104*9bb1b549SSpandan Das } 105*9bb1b549SSpandan Das} 106