about summary refs log tree commit diff
path: root/third_party/gerrit-queue/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/gerrit-queue/main.go')
-rw-r--r--third_party/gerrit-queue/main.go137
1 files changed, 137 insertions, 0 deletions
diff --git a/third_party/gerrit-queue/main.go b/third_party/gerrit-queue/main.go
new file mode 100644
index 000000000000..eaa792c95828
--- /dev/null
+++ b/third_party/gerrit-queue/main.go
@@ -0,0 +1,137 @@
+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?
+}