Skip to content

Commit fddcdc3

Browse files
authored
Commands Infra (#21)
1 parent 9ffba45 commit fddcdc3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+9053
-50
lines changed

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ With Rivi, developers can focus on the actual code base and less on administrati
1414
## Usage
1515
Rivi can be run as a service which listens to incoming repository webhooks. This service must be internet facing to accept incoming requests (e.g. GitHub).
1616
```
17-
Usage of rivi:
18-
-config string
19-
Bot configuration file(s)
20-
-port int
21-
Bot listening port (default 8080)
22-
-uri string
23-
Bot URI path (default "/")
17+
Usage: rivi server [options] CONFIGURATION_FILE(S)...
18+
19+
Starts rivi in server mode and listen to incoming webhooks
20+
21+
Options:
22+
-port=8080 Listen on port (default: 8080)
23+
-uri=/ URI path (default: "/")
2424
```
2525
### Example
2626
```
27-
$ rivi -port 9000 -config repo-x.yaml -config repo-y.yaml
27+
$ rivi server -port 9000 repo-x.yaml repo-y.yaml
2828
```
2929

3030
### Docker

bot/bot.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,6 @@ func New(configPaths ...string) (Bot, error) {
139139
if len(b.configurations) == 0 {
140140
return nil, fmt.Errorf("Bot has no readable configuration!")
141141
}
142-
log.Info("Bot is ready %+v", *b)
142+
log.Debug("Bot is ready %+v", *b)
143143
return b, nil
144144
}

commands/commands.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package commands
2+
3+
import (
4+
"github.com/mitchellh/cli"
5+
)
6+
7+
var Commands map[string]cli.CommandFactory = map[string]cli.CommandFactory{
8+
"server": func() (cli.Command, error) {
9+
return &serverCommand{}, nil
10+
},
11+
"validate": func() (cli.Command, error) {
12+
return &validateCommand{}, nil
13+
},
14+
}

commands/server.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package commands
2+
3+
import (
4+
"flag"
5+
"github.com/bivas/rivi/bot"
6+
"github.com/bivas/rivi/server"
7+
"github.com/bivas/rivi/util/log"
8+
9+
"github.com/mitchellh/cli"
10+
)
11+
12+
type serverCommand struct {
13+
port int
14+
uri string
15+
}
16+
17+
func (s *serverCommand) Help() string {
18+
return `
19+
Usage: rivi server [options] CONFIGURATION_FILE(S)...
20+
21+
Starts rivi in server mode and listen to incoming webhooks
22+
23+
Options:
24+
-port=8080 Listen on port (default: 8080)
25+
-uri=/ URI path (default: "/")
26+
`
27+
}
28+
29+
func (s *serverCommand) Run(args []string) int {
30+
flagSet := flag.NewFlagSet("server", flag.ContinueOnError)
31+
flagSet.IntVar(&s.port, "port", 8080, "Bot listening port")
32+
flagSet.StringVar(&s.uri, "uri", "/", "Bot URI path")
33+
if err := flagSet.Parse(args); err != nil {
34+
return cli.RunResultHelp
35+
}
36+
if len(flagSet.Args()) == 0 {
37+
log.Error("missing configuration file")
38+
return cli.RunResultHelp
39+
}
40+
run, err := bot.New(flagSet.Args()...)
41+
if err != nil {
42+
log.ErrorWith(log.MetaFields{log.E(err)}, "Unable to start bot handler")
43+
return 1
44+
}
45+
log.Info("Rivi is ready")
46+
srv := server.BotServer{Port: s.port, Uri: s.uri, Bot: run}
47+
if err := srv.Run(); err != nil {
48+
log.ErrorWith(log.MetaFields{log.E(err)}, "Bot exited with error")
49+
return -1
50+
}
51+
return 0
52+
}
53+
54+
func (s *serverCommand) Synopsis() string {
55+
return "start rivi server"
56+
}

commands/validate.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package commands
2+
3+
import (
4+
"flag"
5+
"github.com/bivas/rivi/bot"
6+
"github.com/bivas/rivi/util/log"
7+
"github.com/mitchellh/cli"
8+
)
9+
10+
type validateCommand struct {
11+
}
12+
13+
func (v *validateCommand) Help() string {
14+
return `
15+
Usage: rivi validate CONFIGURATION_FILE(S)...
16+
17+
Validate inputted configuration file(s)
18+
`
19+
}
20+
21+
func (v *validateCommand) Run(args []string) int {
22+
f := flag.NewFlagSet("validate", flag.ContinueOnError)
23+
if err := f.Parse(args); err != nil {
24+
return cli.RunResultHelp
25+
}
26+
if len(f.Args()) == 0 {
27+
log.Error("Missing configuration files to validate")
28+
return cli.RunResultHelp
29+
}
30+
hadError := false
31+
for _, file := range f.Args() {
32+
_, err := bot.New(file)
33+
if err != nil {
34+
log.ErrorWith(log.MetaFields{log.F("config", file), log.E(err)}, "Config file failed")
35+
hadError = true
36+
} else {
37+
log.InfoWith(log.MetaFields{log.F("config", file)}, "Config file passed")
38+
}
39+
}
40+
if hadError {
41+
return -1
42+
}
43+
return 0
44+
}
45+
46+
func (v *validateCommand) Synopsis() string {
47+
return "validate configuration file"
48+
}

rivi.go

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,23 @@
11
package main
22

33
import (
4-
"flag"
5-
"fmt"
64
"os"
75

8-
"github.com/bivas/rivi/bot"
9-
"github.com/bivas/rivi/server"
10-
rivilog "github.com/bivas/rivi/util/log"
11-
)
12-
13-
type configs []string
14-
15-
func (c *configs) String() string {
16-
return fmt.Sprintf("%s", *c)
17-
}
18-
19-
func (c *configs) Set(value string) error {
20-
*c = append(*c, value)
21-
return nil
22-
}
6+
"github.com/bivas/rivi/commands"
237

24-
type botSetup struct {
25-
port int
26-
uri string
27-
config configs
28-
}
8+
"github.com/mitchellh/cli"
9+
)
2910

3011
func main() {
3112
logSetup()
32-
var setup botSetup
33-
flag.IntVar(&setup.port, "port", 8080, "Bot listening port")
34-
flag.StringVar(&setup.uri, "uri", "/", "Bot URI path")
35-
flag.Var(&setup.config, "config", "Bot configuration file(s)")
36-
flag.Parse()
37-
if len(setup.config) == 0 {
38-
rivilog.Error("missing configuration file")
39-
flag.Usage()
40-
os.Exit(1)
41-
}
42-
run, err := bot.New(setup.config...)
43-
if err != nil {
44-
rivilog.ErrorWith(rivilog.MetaFields{rivilog.E(err)}, "Unable to start bot handler")
45-
os.Exit(-1)
46-
}
47-
s := server.BotServer{Port: setup.port, Uri: setup.uri, Bot: run}
48-
if err := s.Run(); err != nil {
49-
rivilog.ErrorWith(rivilog.MetaFields{rivilog.E(err)}, "Bot exited with error")
50-
os.Exit(-1)
13+
c := cli.CLI{
14+
Name: "rivi",
15+
Autocomplete: true,
16+
Args: os.Args[1:],
17+
Commands: commands.Commands,
18+
HelpFunc: cli.BasicHelpFunc("rivi"),
19+
HelpWriter: os.Stdout,
5120
}
21+
exitCode, _ := c.Run()
22+
os.Exit(exitCode)
5223
}

vendor/github.com/armon/go-radix/.gitignore

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/armon/go-radix/.travis.yml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/armon/go-radix/LICENSE

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/armon/go-radix/README.md

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)