|
1 | 1 | package commands |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "errors" |
5 | | - "fmt" |
6 | 4 | "os" |
7 | | - "os/exec" |
8 | | - "path/filepath" |
9 | | - "strings" |
10 | 5 |
|
11 | 6 | "github.com/Bananenpro/cli" |
12 | | - "github.com/Bananenpro/pflag" |
13 | 7 | "github.com/code-game-project/codegame-cli/util/cgfile" |
| 8 | + "github.com/code-game-project/codegame-cli/util/modules" |
14 | 9 | ) |
15 | 10 |
|
16 | 11 | func Run() error { |
17 | | - flagSet := pflag.NewFlagSet("run", pflag.ExitOnError) |
18 | | - flagSet.ParseErrorsWhitelist = pflag.ParseErrorsWhitelist{ |
19 | | - UnknownFlags: true, |
20 | | - PassUnknownFlagsToArgs: true, |
21 | | - } |
22 | | - |
23 | | - var overrideURL string |
24 | | - flagSet.StringVarP(&overrideURL, "override-url", "u", "", "Override the game URL in .codegame.json for this specific run.") |
25 | | - var help bool |
26 | | - flagSet.BoolVarP(&help, "help", "h", false, "Show help.") |
27 | | - |
28 | | - if help { |
29 | | - fmt.Fprintf(os.Stderr, "Usage: %s run [...]\n", os.Args[0]) |
30 | | - fmt.Fprintln(os.Stderr, "\nOptions:") |
31 | | - flagSet.PrintDefaults() |
32 | | - os.Exit(1) |
33 | | - } |
34 | | - flagSet.Parse(os.Args[2:]) |
35 | | - |
36 | | - root, err := findProjectRoot() |
37 | | - if err != nil { |
38 | | - return cli.Error("Not in a CodeGame project directory") |
39 | | - } |
40 | | - wd, _ := os.Getwd() |
41 | | - rootRelative, err := filepath.Rel(wd, root) |
| 12 | + rootRelative, err := cgfile.FindProjectRootRelative() |
42 | 13 | if err != nil { |
43 | 14 | return err |
44 | 15 | } |
45 | 16 |
|
46 | | - data, err := cgfile.LoadCodeGameFile(root) |
| 17 | + data, err := cgfile.LoadCodeGameFile(rootRelative) |
47 | 18 | if err != nil { |
48 | 19 | return cli.Error("Failed to load .codegame.json") |
49 | 20 | } |
50 | 21 |
|
51 | | - url := data.URL |
52 | | - if overrideURL != "" { |
53 | | - url = overrideURL |
| 22 | + args := []string{"run"} |
| 23 | + if len(os.Args) > 2 { |
| 24 | + args = append(args, os.Args[2:]...) |
54 | 25 | } |
55 | 26 |
|
56 | | - var cmdName string |
57 | | - args := []string{} |
58 | 27 | switch data.Lang { |
59 | 28 | case "go": |
60 | | - cmdName = "go" |
61 | | - args = append(args, []string{"run", filepath.Join(rootRelative, "main.go")}...) |
| 29 | + err = modules.Execute("go", "latest", "client", args...) |
62 | 30 | default: |
63 | 31 | return cli.Error("'run' is not supported for '%s'", data.Lang) |
64 | 32 | } |
65 | | - args = append(args, flagSet.Args()...) |
66 | | - |
67 | | - env := make([]string, 0, len(os.Environ())+1) |
68 | | - env = append(env, "CG_GAME_URL="+url) |
69 | | - env = append(env, os.Environ()...) |
70 | | - |
71 | | - if _, err := exec.LookPath(cmdName); err != nil { |
72 | | - cli.Error("'%s' ist not installed!", cmdName) |
73 | | - return err |
74 | | - } |
75 | | - |
76 | | - cmd := exec.Command(cmdName, args...) |
77 | | - cmd.Stdin = os.Stdin |
78 | | - cmd.Stdout = os.Stdout |
79 | | - cmd.Stderr = os.Stderr |
80 | | - cmd.Env = env |
81 | | - |
82 | | - err = cmd.Run() |
83 | 33 | if err != nil { |
84 | | - cli.Error("Failed to run 'CG_GAME_URL=%s %s %s'", url, cmdName, strings.Join(args, " ")) |
| 34 | + return err |
85 | 35 | } |
86 | 36 | return nil |
87 | 37 | } |
88 | | - |
89 | | -func findProjectRoot() (string, error) { |
90 | | - dir, err := os.Getwd() |
91 | | - if err != nil { |
92 | | - return "", err |
93 | | - } |
94 | | - |
95 | | - for { |
96 | | - entries, err := os.ReadDir(dir) |
97 | | - if err != nil { |
98 | | - return "", err |
99 | | - } |
100 | | - for _, entry := range entries { |
101 | | - if !entry.IsDir() && entry.Name() == ".codegame.json" { |
102 | | - return dir, nil |
103 | | - } |
104 | | - } |
105 | | - |
106 | | - parent := filepath.Dir(filepath.Clean(dir)) |
107 | | - if parent == dir { |
108 | | - return "", errors.New("not found") |
109 | | - } |
110 | | - dir = parent |
111 | | - } |
112 | | -} |
0 commit comments