Skip to content

Commit 8b22e25

Browse files
committed
Implement 'run' command
1 parent 4b0e9ea commit 8b22e25

File tree

8 files changed

+136
-22
lines changed

8 files changed

+136
-22
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ Create a new project:
1616
codegame new
1717
```
1818

19+
Run a project:
20+
```sh
21+
codegame run
22+
```
23+
1924
Get information about a game server:
2025
```sh
2126
codegame info <url>

commands/docs.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/gomarkdown/markdown"
1111
"github.com/gomarkdown/markdown/html"
1212
"github.com/gomarkdown/markdown/parser"
13-
"github.com/ogier/pflag"
1413

1514
_ "embed"
1615
)
@@ -19,7 +18,7 @@ import (
1918
var docsStyle string
2019

2120
func Docs() error {
22-
if pflag.NArg() == 1 {
21+
if len(os.Args) <= 2 {
2322
cli.Print("Opening documentation...")
2423
err := exec.OpenBrowser("https://docs.code-game.org")
2524
if err != nil {
@@ -28,7 +27,7 @@ func Docs() error {
2827
return err
2928
}
3029

31-
url := baseURL(pflag.Arg(1))
30+
url := baseURL(os.Args[2])
3231

3332
cgeVersion, err := cggenevents.GetCGEVersion(url)
3433
if err != nil {

commands/info.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/Bananenpro/cli"
1313
"github.com/code-game-project/codegame-cli/util/external"
1414
"github.com/mattn/go-colorable"
15-
"github.com/ogier/pflag"
1615
)
1716

1817
type gameInfo struct {
@@ -26,8 +25,8 @@ type gameInfo struct {
2625

2726
func Info() error {
2827
var url string
29-
if pflag.NArg() >= 2 {
30-
url = strings.ToLower(pflag.Arg(1))
28+
if len(os.Args) >= 3 {
29+
url = strings.ToLower(os.Args[2])
3130
} else {
3231
var err error
3332
url, err = cli.Input("Game server URL:")

commands/new.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"github.com/code-game-project/codegame-cli/util/external"
2121
"github.com/code-game-project/codegame-cli/util/modules"
2222
"github.com/code-game-project/codegame-cli/util/semver"
23-
"github.com/ogier/pflag"
2423
)
2524

2625
//go:embed templates/events.cge.tmpl
@@ -30,8 +29,8 @@ var projectNameRegexp = regexp.MustCompile(`^[a-zA-Z0-9_\-]*$`)
3029

3130
func New() error {
3231
var project string
33-
if pflag.NArg() >= 2 {
34-
project = strings.ToLower(pflag.Arg(1))
32+
if len(os.Args) >= 3 {
33+
project = strings.ToLower(os.Args[2])
3534
} else {
3635
var err error
3736
project, err = cli.SelectString("Project type:", []string{"Game Client", "Game Server"}, []string{"client", "server"})
@@ -91,8 +90,8 @@ func New() error {
9190

9291
func newServer(projectName string) error {
9392
var language string
94-
if pflag.NArg() >= 3 {
95-
language = strings.ToLower(pflag.Arg(2))
93+
if len(os.Args) >= 4 {
94+
language = strings.ToLower(os.Args[3])
9695
} else {
9796
var err error
9897
language, err = cli.SelectString("Language:", []string{"Go", "JavaScript", "TypeScript"}, []string{"go", "js", "ts"})
@@ -168,8 +167,8 @@ func newClient() error {
168167
}
169168

170169
var language string
171-
if pflag.NArg() >= 3 {
172-
language = strings.ToLower(pflag.Arg(2))
170+
if len(os.Args) >= 4 {
171+
language = strings.ToLower(os.Args[3])
173172
} else {
174173
var err error
175174
language, err = cli.SelectString("Language:", []string{"Go", "JavaScript", "TypeScript"}, []string{"go", "js", "ts"})

commands/run.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package commands
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
"os/exec"
8+
"path/filepath"
9+
"strings"
10+
11+
"github.com/Bananenpro/cli"
12+
"github.com/Bananenpro/pflag"
13+
"github.com/code-game-project/codegame-cli/util/cgfile"
14+
)
15+
16+
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+
41+
data, err := cgfile.LoadCodeGameFile(root)
42+
if err != nil {
43+
return cli.Error("Failed to load .codegame.json")
44+
}
45+
46+
url := data.URL
47+
if overrideURL != "" {
48+
url = overrideURL
49+
}
50+
51+
var cmdName string
52+
args := []string{}
53+
switch data.Lang {
54+
case "go":
55+
cmdName = "go"
56+
args = append(args, "run")
57+
default:
58+
return cli.Error("'run' is not supported for '%s'", data.Lang)
59+
}
60+
args = append(args, flagSet.Args()...)
61+
62+
env := make([]string, 0, len(os.Environ())+1)
63+
env = append(env, "CG_GAME_URL="+url)
64+
env = append(env, os.Environ()...)
65+
66+
if _, err := exec.LookPath(cmdName); err != nil {
67+
cli.Error("'%s' ist not installed!", cmdName)
68+
return err
69+
}
70+
71+
cmd := exec.Command(cmdName, args...)
72+
cmd.Stdin = os.Stdin
73+
cmd.Stdout = os.Stdout
74+
cmd.Stderr = os.Stderr
75+
cmd.Env = env
76+
77+
err = cmd.Run()
78+
if err != nil {
79+
cli.Error("Failed to run 'CG_GAME_URL=%s %s %s'", url, cmdName, strings.Join(args, " "))
80+
}
81+
return nil
82+
}
83+
84+
func findProjectRoot() (string, error) {
85+
dir, err := os.Getwd()
86+
if err != nil {
87+
return "", err
88+
}
89+
90+
for {
91+
entries, err := os.ReadDir(dir)
92+
if err != nil {
93+
return "", err
94+
}
95+
for _, entry := range entries {
96+
if !entry.IsDir() && entry.Name() == ".codegame.json" {
97+
return dir, nil
98+
}
99+
}
100+
101+
parent := filepath.Dir(filepath.Clean(dir))
102+
if parent == dir {
103+
return "", errors.New("not found")
104+
}
105+
dir = parent
106+
}
107+
}

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@ go 1.18
44

55
require (
66
github.com/Bananenpro/cli v0.1.2
7+
github.com/Bananenpro/pflag v1.0.7
78
github.com/adrg/xdg v0.4.0
89
github.com/gomarkdown/markdown v0.0.0-20220607163217-45f7c050e2d1
910
github.com/mattn/go-colorable v0.1.12
10-
github.com/ogier/pflag v0.0.1
1111
)
1212

1313
require (
1414
github.com/AlecAivazis/survey/v2 v2.3.5 // indirect
1515
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
1616
github.com/mattn/go-isatty v0.0.14 // indirect
1717
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
18+
github.com/spf13/pflag v1.0.5 // indirect
1819
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect
1920
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 // indirect
2021
golang.org/x/text v0.3.7 // indirect

go.sum

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5
22
github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
33
github.com/Bananenpro/cli v0.1.2 h1:X6Fb80PxfhIItabAjp4G9roLCpj7Q0FvYc5jxX/8nAw=
44
github.com/Bananenpro/cli v0.1.2/go.mod h1:JBXpIAXo/D0rlsfgCViQBicjcJY6UWUldmxvKM+ijRc=
5+
github.com/Bananenpro/pflag v1.0.7 h1:mKWwZ1/XrEsIporK1PRh6psvkhGg3HsTEs/hTK2EMZU=
6+
github.com/Bananenpro/pflag v1.0.7/go.mod h1:AmjL495QkJVOAmSCFZh3RA6Q/a53pg+nD3hwKCsVR2g=
57
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=
68
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
79
github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls=
@@ -26,10 +28,10 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k
2628
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
2729
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
2830
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
29-
github.com/ogier/pflag v0.0.1 h1:RW6JSWSu/RkSatfcLtogGfFgpim5p7ARQ10ECk5O750=
30-
github.com/ogier/pflag v0.0.1/go.mod h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFPE+g=
3131
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3232
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
33+
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
34+
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
3335
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
3436
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
3537
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=

main.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import (
99
"time"
1010

1111
"github.com/Bananenpro/cli"
12+
"github.com/Bananenpro/pflag"
1213
"github.com/adrg/xdg"
1314
"github.com/code-game-project/codegame-cli/commands"
1415
"github.com/code-game-project/codegame-cli/util/external"
1516
"github.com/code-game-project/codegame-cli/util/semver"
16-
"github.com/ogier/pflag"
1717
)
1818

1919
const Version = "0.6.0"
@@ -25,22 +25,22 @@ func main() {
2525
fmt.Fprintln(os.Stderr, "The official CodeGame CLI.")
2626
fmt.Fprintln(os.Stderr, "\nCommands:")
2727
fmt.Fprintln(os.Stderr, "\tnew \tCreate a new project.")
28+
fmt.Fprintln(os.Stderr, "\trun \tRun a project.")
2829
fmt.Fprintln(os.Stderr, "\tinfo \tDisplay some info about a game server.")
2930
fmt.Fprintln(os.Stderr, "\tdocs \tOpen the CodeGame documentation in a web browser.")
3031
fmt.Fprintln(os.Stderr, "\nAbout: https://code-game.org")
3132
fmt.Fprintln(os.Stderr, "Copyright (c) 2022 CodeGame Contributors (https://code-game.org/contributors)")
3233
pflag.PrintDefaults()
3334
}
34-
pflag.Parse()
3535

36-
if pflag.NArg() == 0 {
36+
if len(os.Args) == 1 {
3737
pflag.Usage()
3838
os.Exit(1)
3939
}
4040

4141
checkVersion()
4242

43-
command := strings.ToLower(pflag.Arg(0))
43+
command := strings.ToLower(os.Args[1])
4444

4545
var err error
4646
switch command {
@@ -50,14 +50,16 @@ func main() {
5050
err = commands.Info()
5151
case "docs":
5252
err = commands.Docs()
53+
case "run":
54+
err = commands.Run()
5355
default:
5456
cli.Error("Unknown command: %s", strings.ToLower(pflag.Arg(0)))
5557
pflag.Usage()
5658
os.Exit(1)
5759
}
5860
if err != nil {
59-
cli.FinishLoading()
60-
cli.FinishProgressBar()
61+
cli.CancelLoading()
62+
cli.CancelProgressBar()
6163
os.Exit(1)
6264
}
6365
}

0 commit comments

Comments
 (0)