package main import ( "bytes" "fmt" "html" "net/url" "slices" "strings" ) type SvgWriter struct { ypos float64 header []byte out bytes.Buffer } const ( SvgType_Package = iota SvgType_Project ) func NewSvg(SvgType int) *SvgWriter { svg := &SvgWriter{} svg.header = []byte(``) switch SvgType { case SvgType_Package: svg.out.WriteString(` succeeded failed blocked broken building unresolvable scheduled disabled excluded unknown `) case SvgType_Project: svg.out.WriteString(` `) } return svg } func (svg *SvgWriter) WriteTitle(title string) { svg.out.WriteString(`` + html.EscapeString(title) + "") svg.ypos += 2.5 } func (svg *SvgWriter) WriteSubtitle(subtitle string) { svg.out.WriteString(``) svg.out.WriteString(`` + html.EscapeString(subtitle) + ``) svg.ypos += 2 } func (svg *SvgWriter) WritePackageStatus(loglink, arch, status, detail string) { StatusToSVG := func(S string) string { switch S { case "succeeded": return "s" case "failed": return "f" case "broken", "scheduled": return S case "blocked": return "b" case "building": return "build" case "unresolvable": return "u" case "disabled": return "d" case "excluded": return "e" } return "un" } svg.out.WriteString(`` + html.EscapeString(arch) + ``) svg.out.WriteString(``) if len(loglink) > 0 { u, err := url.Parse(loglink) if err == nil { svg.out.WriteString(``) } } svg.out.WriteString(``) if len(loglink) > 0 { svg.out.WriteString(``) } if len(detail) > 0 { svg.out.WriteString(`` + html.EscapeString(detail) + "") } svg.out.WriteString("\n") svg.ypos += 2 } func (svg *SvgWriter) WriteProjectStatus(project, repo, arch, status string, count int) { u, err := url.Parse(*ObsUrl + "/project/monitor/" + url.PathEscape(project) + "?defaults=0&" + url.QueryEscape(status) + "=1&arch_" + url.QueryEscape(arch) + "=1&repo_" + url.QueryEscape(strings.ReplaceAll(repo, ".", "_")) + "=1") if err != nil { return } svg.out.WriteString(`` + "\n" + `\n" + html.EscapeString(status+": ") + fmt.Sprint(count) + "\n") svg.ypos += 2 } func (svg *SvgWriter) GenerateSvg() []byte { return slices.Concat(svg.header, []byte(fmt.Sprint(svg.ypos)), svg.out.Bytes(), []byte("")) }