about summary refs log blame commit diff
path: root/third_party/gerrit-queue/frontend/frontend.go
blob: 2cc65423f0e66136137b02f03875815c025eea59 (plain) (tree)
1
2
3
4
5
6
7
8
9


                

                       
             
                   

                  

                       

                             
                                              
                                            
                                                   
 
 




                                                                               


                                                                                                 
         
                                                             

                                                    
                                                            











                                                        
         

                        

 
                                      
                                                                                                                                      

                                                    
 

                                                                          








                                                               

                                            
                                                                                  
                                                                              
                          



















                                                                        

                 
                                                            
                                          


                                              
 
                                                                                  
                                 

                                                   

                                
                                                             

                                                     

                                  
                                                     

                  
                  
 
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
}