blob: 520ef0471b195a8507ab2012c4edea50ca9011cb [file] [log] [blame]
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.16 && (linux || darwin)
// +build go1.16
// +build linux darwin
package main
import (
"bytes"
_ "embed"
"encoding/json"
"fmt"
"html"
"html/template"
"net/http"
"strings"
"golang.org/x/build/dashboard"
)
func handleBuilders(w http.ResponseWriter, r *http.Request) {
data := struct {
Builders map[string]*dashboard.BuildConfig
Hosts map[string]*dashboard.HostConfig
}{dashboard.Builders, dashboard.Hosts}
if r.FormValue("mode") == "json" {
j, err := json.MarshalIndent(data, "", "\t")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(j)
} else {
var buf bytes.Buffer
if err := buildersTmpl.Execute(&buf, data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
buf.WriteTo(w)
}
}
//go:embed templates/builders.html
var buildersTmplStr string
var buildersTmpl = template.Must(baseTmpl.New("builders").Funcs(template.FuncMap{
"builderOwners": func(bc *dashboard.BuildConfig) template.HTML {
owners := bc.HostConfig().Owners
if len(owners) == 0 {
return "golang-dev"
}
var buf strings.Builder
for i, p := range owners {
if i != 0 {
buf.WriteString(", ")
}
if p.GitHub != "" {
fmt.Fprintf(&buf, `<a href="https://github.com/%s">@%[1]s</a>`, html.EscapeString(p.GitHub))
} else if len(p.Emails) > 0 {
name := p.Name
if name == "" {
name = p.Emails[0]
}
fmt.Fprintf(&buf, `<a href="mailto:%s">%s</a>`, html.EscapeString(p.Emails[0]), html.EscapeString(name))
} else if p.Name != "" {
buf.WriteString(html.EscapeString(p.Name))
} else {
buf.WriteString("(unnamed)")
}
}
return template.HTML(buf.String())
},
}).Parse(buildersTmplStr))