|
1 | 1 | package main
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "fmt" |
5 |
| - "go/build" |
6 |
| - "os" |
7 |
| - "os/exec" |
8 |
| - "path/filepath" |
9 |
| - "syscall" |
10 |
| - |
11 |
| - "github.com/cucumber/godog" |
12 |
| - "github.com/cucumber/godog/colors" |
13 |
| - "github.com/cucumber/godog/internal/builder" |
| 4 | + "github.com/cucumber/godog/cmd/godog/internal" |
14 | 5 | )
|
15 | 6 |
|
16 |
| -var parsedStatus int |
17 |
| - |
18 |
| -func buildAndRun() (int, error) { |
19 |
| - var status int |
20 |
| - |
21 |
| - bin, err := filepath.Abs("godog.test") |
22 |
| - if err != nil { |
23 |
| - return 1, err |
24 |
| - } |
25 |
| - if build.Default.GOOS == "windows" { |
26 |
| - bin += ".exe" |
27 |
| - } |
28 |
| - if err = builder.Build(bin); err != nil { |
29 |
| - return 1, err |
30 |
| - } |
31 |
| - defer os.Remove(bin) |
32 |
| - |
33 |
| - cmd := exec.Command(bin, os.Args[1:]...) |
34 |
| - cmd.Stdout = os.Stdout |
35 |
| - cmd.Stderr = os.Stderr |
36 |
| - cmd.Stdin = os.Stdin |
37 |
| - cmd.Env = os.Environ() |
38 |
| - |
39 |
| - if err = cmd.Start(); err != nil { |
40 |
| - return status, err |
41 |
| - } |
42 |
| - |
43 |
| - if err = cmd.Wait(); err != nil { |
44 |
| - if exiterr, ok := err.(*exec.ExitError); ok { |
45 |
| - // The program has exited with an exit code != 0 |
46 |
| - status = 1 |
47 |
| - |
48 |
| - // This works on both Unix and Windows. Although package |
49 |
| - // syscall is generally platform dependent, WaitStatus is |
50 |
| - // defined for both Unix and Windows and in both cases has |
51 |
| - // an ExitStatus() method with the same signature. |
52 |
| - if st, ok := exiterr.Sys().(syscall.WaitStatus); ok { |
53 |
| - status = st.ExitStatus() |
54 |
| - } |
55 |
| - return status, nil |
56 |
| - } |
57 |
| - return status, err |
58 |
| - } |
59 |
| - return status, nil |
60 |
| -} |
61 |
| - |
62 | 7 | func main() {
|
63 |
| - var vers bool |
64 |
| - var output string |
65 |
| - |
66 |
| - opt := godog.Options{Output: colors.Colored(os.Stdout)} |
67 |
| - flagSet := godog.FlagSet(&opt) |
68 |
| - flagSet.BoolVar(&vers, "version", false, "Show current version.") |
69 |
| - flagSet.StringVar(&output, "o", "", "Build and output test runner executable to given target path.") |
70 |
| - flagSet.StringVar(&output, "output", "", "Build and output test runner executable to given target path.") |
71 |
| - |
72 |
| - if err := flagSet.Parse(os.Args[1:]); err != nil { |
73 |
| - fmt.Fprintln(os.Stderr, err) |
74 |
| - os.Exit(1) |
75 |
| - } |
76 |
| - |
77 |
| - if len(output) > 0 { |
78 |
| - bin, err := filepath.Abs(output) |
79 |
| - if err != nil { |
80 |
| - fmt.Fprintln(os.Stderr, "could not locate absolute path for:", output, err) |
81 |
| - os.Exit(1) |
82 |
| - } |
83 |
| - if err = builder.Build(bin); err != nil { |
84 |
| - fmt.Fprintln(os.Stderr, "could not build binary at:", output, err) |
85 |
| - os.Exit(1) |
86 |
| - } |
87 |
| - os.Exit(0) |
88 |
| - } |
89 |
| - |
90 |
| - if vers { |
91 |
| - fmt.Fprintln(os.Stdout, "Godog version is:", godog.Version) |
92 |
| - os.Exit(0) // should it be 0? |
93 |
| - } |
| 8 | + rootCmd := internal.CreateRootCmd() |
| 9 | + buildCmd := internal.CreateBuildCmd() |
| 10 | + runCmd := internal.CreateRunCmd() |
| 11 | + versionCmd := internal.CreateVersionCmd() |
94 | 12 |
|
95 |
| - status, err := buildAndRun() |
96 |
| - if err != nil { |
97 |
| - fmt.Fprintln(os.Stderr, err) |
98 |
| - os.Exit(1) |
99 |
| - } |
100 |
| - // it might be a case, that status might not be resolved |
101 |
| - // in some OSes. this is attempt to parse it from stderr |
102 |
| - if parsedStatus > status { |
103 |
| - status = parsedStatus |
104 |
| - } |
105 |
| - os.Exit(status) |
| 13 | + rootCmd.AddCommand(&buildCmd, &runCmd, &versionCmd) |
| 14 | + rootCmd.Execute() |
106 | 15 | }
|
0 commit comments