golang.org/x/build@v0.0.0-20240506185731-218518f32b70/cmd/coordinator/builders.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build linux || darwin 6 7 package main 8 9 import ( 10 "bytes" 11 _ "embed" 12 "encoding/json" 13 "fmt" 14 "html" 15 "html/template" 16 "net/http" 17 "strings" 18 19 "golang.org/x/build/dashboard" 20 ) 21 22 func handleBuilders(w http.ResponseWriter, r *http.Request) { 23 data := struct { 24 Builders map[string]*dashboard.BuildConfig 25 Hosts map[string]*dashboard.HostConfig 26 }{dashboard.Builders, dashboard.Hosts} 27 if r.FormValue("mode") == "json" { 28 j, err := json.MarshalIndent(data, "", "\t") 29 if err != nil { 30 http.Error(w, err.Error(), http.StatusInternalServerError) 31 return 32 } 33 w.Header().Set("Content-Type", "application/json") 34 w.Write(j) 35 } else { 36 var buf bytes.Buffer 37 if err := buildersTmpl.Execute(&buf, data); err != nil { 38 http.Error(w, err.Error(), http.StatusInternalServerError) 39 return 40 } 41 w.Header().Set("Content-Type", "text/html; charset=utf-8") 42 buf.WriteTo(w) 43 } 44 } 45 46 //go:embed templates/builders.html 47 var buildersTmplStr string 48 49 var buildersTmpl = template.Must(baseTmpl.New("builders").Funcs(template.FuncMap{ 50 "builderOwners": func(bc *dashboard.BuildConfig) template.HTML { 51 owners := bc.HostConfig().Owners 52 if len(owners) == 0 { 53 return "golang-dev" 54 } 55 var buf strings.Builder 56 for i, p := range owners { 57 if i != 0 { 58 buf.WriteString(", ") 59 } 60 if p.GitHub != "" { 61 fmt.Fprintf(&buf, `<a href="https://github.com/%s">@%[1]s</a>`, html.EscapeString(p.GitHub)) 62 } else if len(p.Emails) > 0 { 63 name := p.Name 64 if name == "" { 65 name = p.Emails[0] 66 } 67 fmt.Fprintf(&buf, `<a href="mailto:%s">%s</a>`, html.EscapeString(p.Emails[0]), html.EscapeString(name)) 68 } else if p.Name != "" { 69 buf.WriteString(html.EscapeString(p.Name)) 70 } else { 71 buf.WriteString("(unnamed)") 72 } 73 } 74 return template.HTML(buf.String()) 75 }, 76 }).Parse(buildersTmplStr))