tvl-depot/third_party/gerrit-queue/frontend/frontend.go
Florian Klink b3c4057f4b refactor(3p/gerrit-queue): use go:embed, bump go1.16, drop shell.nix
Previously, gerrit-queue used statik to embed files. Since go1.16, we
have go:embed, which solves this much nicer, without any requirements to
have the statik binary around.

As the only other thing the shell.nix and .envrc plumbing did was bring
a version of Go in scope, it's dropped now. We assume to have a
recent-enough go binary around, else go will complain.

Imported from https://github.com/flokli/gerrit-queue/pull/9

Change-Id: I851b06777a29d4f2d955cf3a7db6455a7189bc46
Reviewed-on: https://cl.tvl.fyi/c/depot/+/4329
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
Autosubmit: tazjin <mail@tazj.in>
2021-12-14 17:14:31 +00:00

113 lines
2.7 KiB
Go

package frontend
import (
"embed"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"html/template"
"github.com/apex/log"
"github.com/tweag/gerrit-queue/gerrit"
"github.com/tweag/gerrit-queue/misc"
"github.com/tweag/gerrit-queue/submitqueue"
)
//go:embed templates
var templates embed.FS
//loadTemplate loads a list of templates, relative to the templates 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)
for _, templateName := range templateNames {
r, err := templates.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 {
projectName := gerritClient.GetProjectName()
branchName := gerritClient.GetBranchName()
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
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(w, "index.tmpl.html", map[string]interface{}{
// Config
"projectName": projectName,
"branchName": branchName,
// State
"currentlyRunning": currentlyRunning,
"wipSerie": wipSerie,
"HEAD": HEAD,
// History
"memory": rotatingLogHandler,
})
})
return mux
}