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))