package main
import (
"os"
"time"
"net/http"
"github.com/tweag/gerrit-queue/frontend"
"github.com/tweag/gerrit-queue/gerrit"
"github.com/tweag/gerrit-queue/misc"
"github.com/tweag/gerrit-queue/submitqueue"
"github.com/urfave/cli"
"github.com/apex/log"
"github.com/apex/log/handlers/multi"
"github.com/apex/log/handlers/text"
)
func main() {
var URL, username, password, projectName, branchName string
var fetchOnly bool
var triggerInterval int
app := cli.NewApp()
app.Name = "gerrit-queue"
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "url",
Usage: "URL to the gerrit instance",
EnvVar: "GERRIT_URL",
Destination: &URL,
Required: true,
},
cli.StringFlag{
Name: "username",
Usage: "Username to use to login to gerrit",
EnvVar: "GERRIT_USERNAME",
Destination: &username,
Required: true,
},
cli.StringFlag{
Name: "password",
Usage: "Password to use to login to gerrit",
EnvVar: "GERRIT_PASSWORD",
Destination: &password,
Required: true,
},
cli.StringFlag{
Name: "project",
Usage: "Gerrit project name to run the submit queue for",
EnvVar: "GERRIT_PROJECT",
Destination: &projectName,
Required: true,
},
cli.StringFlag{
Name: "branch",
Usage: "Destination branch",
EnvVar: "GERRIT_BRANCH",
Destination: &branchName,
Value: "master",
},
cli.IntFlag{
Name: "trigger-interval",
Usage: "How often we should trigger ourselves (interval in seconds)",
EnvVar: "SUBMIT_QUEUE_TRIGGER_INTERVAL",
Destination: &triggerInterval,
Value: 600,
},
cli.BoolFlag{
Name: "fetch-only",
Usage: "Only fetch changes and assemble queue, but don't actually write",
EnvVar: "SUBMIT_QUEUE_FETCH_ONLY",
Destination: &fetchOnly,
},
}
rotatingLogHandler := misc.NewRotatingLogHandler(10000)
l := &log.Logger{
Handler: multi.New(
text.New(os.Stderr),
rotatingLogHandler,
),
Level: log.DebugLevel,
}
app.Action = func(c *cli.Context) error {
gerrit, err := gerrit.NewClient(l, URL, username, password, projectName, branchName)
if err != nil {
return err
}
log.Infof("Successfully connected to gerrit at %s", URL)
runner := submitqueue.NewRunner(l, gerrit)
handler := frontend.MakeFrontend(rotatingLogHandler, gerrit, runner)
// fetch only on first run
err = runner.Trigger(fetchOnly)
if err != nil {
log.Error(err.Error())
}
// ticker
go func() {
for {
time.Sleep(time.Duration(triggerInterval) * time.Second)
err = runner.Trigger(fetchOnly)
if err != nil {
log.Error(err.Error())
}
}
}()
server := http.Server{
Addr: ":8080",
Handler: handler,
}
server.ListenAndServe()
if err != nil {
log.Fatalf(err.Error())
}
return nil
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err.Error())
}
// TODOS:
// - handle event log, either by accepting webhooks, or by streaming events?
}