Skip to content

Commit a25e2e0

Browse files
committed
Outsource 'run' command to modules
1 parent c8888d0 commit a25e2e0

File tree

4 files changed

+54
-86
lines changed

4 files changed

+54
-86
lines changed

commands/new.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func newServer(projectName string) error {
118118
case "ts":
119119
err = modules.Execute("js", "latest", "server", "new", "server", "--typescript")
120120
default:
121-
return cli.Error("Unsupported language: %s", language)
121+
return cli.Error("'new server' is not supported for '%s'", language)
122122
}
123123
if err != nil {
124124
return err
@@ -204,7 +204,7 @@ func newClient() error {
204204
libraryVersion := external.LibraryVersionFromCGVersion("code-game-project", "javascript-client", cgVersion)
205205
err = modules.Execute("js", libraryVersion, "client", "new", "client", "--typescript", "--library-version="+libraryVersion, "--game-name="+name, "--url="+trimURL(url))
206206
default:
207-
return cli.Error("Unsupported language: %s", language)
207+
return cli.Error("'new client' is not supported for '%s'", language)
208208
}
209209
if err != nil {
210210
return err

commands/run.go

Lines changed: 8 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,37 @@
11
package commands
22

33
import (
4-
"errors"
5-
"fmt"
64
"os"
7-
"os/exec"
8-
"path/filepath"
9-
"strings"
105

116
"github.com/Bananenpro/cli"
12-
"github.com/Bananenpro/pflag"
137
"github.com/code-game-project/codegame-cli/util/cgfile"
8+
"github.com/code-game-project/codegame-cli/util/modules"
149
)
1510

1611
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()
4213
if err != nil {
4314
return err
4415
}
4516

46-
data, err := cgfile.LoadCodeGameFile(root)
17+
data, err := cgfile.LoadCodeGameFile(rootRelative)
4718
if err != nil {
4819
return cli.Error("Failed to load .codegame.json")
4920
}
5021

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:]...)
5425
}
5526

56-
var cmdName string
57-
args := []string{}
5827
switch data.Lang {
5928
case "go":
60-
cmdName = "go"
61-
args = append(args, []string{"run", filepath.Join(rootRelative, "main.go")}...)
29+
err = modules.Execute("go", "latest", "client", args...)
6230
default:
6331
return cli.Error("'run' is not supported for '%s'", data.Lang)
6432
}
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()
8333
if err != nil {
84-
cli.Error("Failed to run 'CG_GAME_URL=%s %s %s'", url, cmdName, strings.Join(args, " "))
34+
return err
8535
}
8636
return nil
8737
}
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-
}

util/cgfile/project.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cgfile
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
7+
"github.com/Bananenpro/cli"
8+
)
9+
10+
func FindProjectRoot() (string, error) {
11+
dir, err := os.Getwd()
12+
if err != nil {
13+
return "", err
14+
}
15+
16+
for {
17+
entries, err := os.ReadDir(dir)
18+
if err != nil {
19+
return "", err
20+
}
21+
for _, entry := range entries {
22+
if !entry.IsDir() && entry.Name() == ".codegame.json" {
23+
return dir, nil
24+
}
25+
}
26+
27+
parent := filepath.Dir(filepath.Clean(dir))
28+
if parent == dir {
29+
return "", cli.Error("Not in a CodeGame project directory")
30+
}
31+
dir = parent
32+
}
33+
}
34+
35+
func FindProjectRootRelative() (string, error) {
36+
root, err := FindProjectRoot()
37+
if err != nil {
38+
return "", err
39+
}
40+
wd, _ := os.Getwd()
41+
return filepath.Rel(wd, root)
42+
}

util/exec/exec.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"os/exec"
77
"runtime"
8+
"strings"
89

910
"github.com/Bananenpro/cli"
1011
)
@@ -41,7 +42,7 @@ func Execute(hidden bool, programName string, args ...string) (string, error) {
4142
if outStr != "" {
4243
err = cli.Error("'%s' returned with an error:\n%s", programName, outStr)
4344
} else {
44-
err = cli.Error("Failed to execute '%s'.", programName)
45+
err = cli.Error("Failed to execute '%s %s'.", programName, strings.Join(args, " "))
4546
}
4647
}
4748

0 commit comments

Comments
 (0)