// BootSimulator ... func BootSimulator(simulator models.SimInfoModel, xcodebuildVersion models.XcodebuildVersionModel) error { simulatorApp := "Simulator" if xcodebuildVersion.MajorVersion == 6 { simulatorApp = "iOS Simulator" } xcodeDevDirPth, err := getXcodeDeveloperDirPath() if err != nil { return fmt.Errorf("Failed to get Xcode Developer Directory - most likely Xcode.app is not installed") } simulatorAppFullPath := filepath.Join(xcodeDevDirPth, "Applications", simulatorApp+".app") openCmd := exec.Command("open", simulatorAppFullPath, "--args", "-CurrentDeviceUDID", simulator.SimID) log.Detail("$ %s", cmd.PrintableCommandArgs(openCmd.Args)) out, err := openCmd.CombinedOutput() outStr := string(out) if err != nil { return fmt.Errorf("failed to start simulators (%s), output: %s, error: %s", simulator.SimID, outStr, err) } return nil }
func runPrettyXcodeBuildCmd(useStdOut bool, xcprettyArgs []string, xcodebuildArgs []string) (string, int, error) { // buildCmd := cmd.CreateXcodebuildCmd(xcodebuildArgs...) prettyCmd := cmd.CreateXcprettyCmd(xcprettyArgs...) // var buildOutBuffer bytes.Buffer // pipeReader, pipeWriter := io.Pipe() // // build outputs: // - write it into a buffer // - write it into the pipe, which will be fed into xcpretty buildOutWriters := []io.Writer{pipeWriter} buildOutWriter := cmd.CreateBufferedWriter(&buildOutBuffer, buildOutWriters...) // var prettyOutWriter io.Writer if useStdOut { prettyOutWriter = os.Stdout } // and set the writers buildCmd.Stdin = nil buildCmd.Stdout = buildOutWriter buildCmd.Stderr = buildOutWriter // prettyCmd.Stdin = pipeReader prettyCmd.Stdout = prettyOutWriter prettyCmd.Stderr = prettyOutWriter // buildCmd.Env = append(os.Environ(), xcodeCommandEnvs...) log.Detail("$ set -o pipefail && %s | %v", cmd.PrintableCommandArgsWithEnvs(buildCmd.Args, xcodeCommandEnvs), cmd.PrintableCommandArgs(prettyCmd.Args)) fmt.Println() if err := buildCmd.Start(); err != nil { return buildOutBuffer.String(), 1, err } if err := prettyCmd.Start(); err != nil { return buildOutBuffer.String(), 1, err } defer func() { if err := pipeWriter.Close(); err != nil { log.Warn("Failed to close xcodebuild-xcpretty pipe, error: %s", err) } if err := prettyCmd.Wait(); err != nil { log.Warn("xcpretty command failed, error: %s", err) } }() if err := buildCmd.Wait(); err != nil { if exitError, ok := err.(*exec.ExitError); ok { waitStatus, ok := exitError.Sys().(syscall.WaitStatus) if !ok { return buildOutBuffer.String(), 1, errors.New("Failed to cast exit status") } return buildOutBuffer.String(), waitStatus.ExitStatus(), err } return buildOutBuffer.String(), 1, err } return buildOutBuffer.String(), 0, nil }