diff options
Diffstat (limited to 'third_party/gerrit-queue/frontend')
-rw-r--r-- | third_party/gerrit-queue/frontend/frontend.go | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/third_party/gerrit-queue/frontend/frontend.go b/third_party/gerrit-queue/frontend/frontend.go new file mode 100644 index 000000000000..f1c7857ef87c --- /dev/null +++ b/third_party/gerrit-queue/frontend/frontend.go @@ -0,0 +1,117 @@ +package frontend + +import ( + "fmt" + "io/ioutil" + "net/http" + "encoding/json" + + "html/template" + + "github.com/gin-gonic/gin" + "github.com/rakyll/statik/fs" + + "github.com/apex/log" + + "github.com/tweag/gerrit-queue/gerrit" + "github.com/tweag/gerrit-queue/misc" + _ "github.com/tweag/gerrit-queue/statik" // register static assets + "github.com/tweag/gerrit-queue/submitqueue" +) + +//loadTemplate loads a list of templates, relative to the statikFS root, and a FuncMap, and returns a template object +func loadTemplate(templateNames []string, funcMap template.FuncMap) (*template.Template, error) { + if len(templateNames) == 0 { + return nil, fmt.Errorf("templateNames can't be empty") + } + tmpl := template.New(templateNames[0]).Funcs(funcMap) + statikFS, err := fs.New() + if err != nil { + return nil, err + } + + for _, templateName := range templateNames { + r, err := statikFS.Open("/" + templateName) + if err != nil { + return nil, err + } + defer r.Close() + contents, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + tmpl, err = tmpl.Parse(string(contents)) + if err != nil { + return nil, err + } + } + + return tmpl, nil +} + +// MakeFrontend returns a http.Handler +func MakeFrontend(rotatingLogHandler *misc.RotatingLogHandler, gerritClient *gerrit.Client, runner *submitqueue.Runner) http.Handler { + router := gin.Default() + + projectName := gerritClient.GetProjectName() + branchName := gerritClient.GetBranchName() + + router.GET("/", func(c *gin.Context) { + var wipSerie *gerrit.Serie = nil + HEAD := "" + currentlyRunning := runner.IsCurrentlyRunning() + + // don't trigger operations requiring a lock + if !currentlyRunning { + wipSerie = runner.GetWIPSerie() + HEAD = gerritClient.GetHEAD() + } + + funcMap := template.FuncMap{ + "changesetURL": func(changeset *gerrit.Changeset) string { + return gerritClient.GetChangesetURL(changeset) + }, + "levelToClasses": func(level log.Level) string { + switch level { + case log.DebugLevel: + return "text-muted" + case log.InfoLevel: + return "text-info" + case log.WarnLevel: + return "text-warning" + case log.ErrorLevel: + return "text-danger" + case log.FatalLevel: + return "text-danger" + default: + return "text-white" + } + }, + "fieldsToJSON": func(fields log.Fields) string { + jsonData, _ := json.Marshal(fields) + return string(jsonData) + }, + } + + tmpl := template.Must(loadTemplate([]string{ + "index.tmpl.html", + "serie.tmpl.html", + "changeset.tmpl.html", + }, funcMap)) + + tmpl.ExecuteTemplate(c.Writer, "index.tmpl.html", gin.H{ + // Config + "projectName": projectName, + "branchName": branchName, + + // State + "currentlyRunning": currentlyRunning, + "wipSerie": wipSerie, + "HEAD": HEAD, + + // History + "memory": rotatingLogHandler, + }) + }) + return router +} |