Skip to content

Commit

Permalink
buildstats: more refactoring, fix dropped repo filter
Browse files Browse the repository at this point in the history
  • Loading branch information
aclements committed Feb 15, 2023
1 parent fd40d06 commit 88fbd33
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 38 deletions.
18 changes: 18 additions & 0 deletions buildstats/alg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright 2022 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.

package main

func FilterInPlace[T any](xs []T, keep func(x T) bool) []T {
j := 0
for i := range xs {
if keep(xs[i]) {
if i != j {
xs[i] = xs[j]
}
j++
}
}
return xs[:j]
}
5 changes: 5 additions & 0 deletions buildstats/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module github.com/aclements/go-misc/buildstats

go 1.18

require golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d // indirect
2 changes: 2 additions & 0 deletions buildstats/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d h1:vtUKgx8dahOomfFzLREU8nSv25YHnTgLBn4rDnWZdU0=
golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
13 changes: 5 additions & 8 deletions buildstats/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"image/color"
"image/png"
"log"
"os"
"sort"
)

Expand Down Expand Up @@ -123,10 +122,9 @@ func (s sum) less(s2 sum) bool {
return s.total < s2.total
}

func rangeBuildResults(rev *rev, cb func(label string, res result)) {
meta := rev.getMeta()
for i, builder := range meta.Builders {
cb(builder, resultFromString(meta.Results[i]))
func rangeBuildResults(rev *rev, cb func(builder string, res result)) {
for i, builder := range rev.Builders {
cb(builder, resultFromString(rev.Results[i]))
}
}

Expand All @@ -135,15 +133,14 @@ func main() {
flag.Parse()

revs := getRevs(since.Time)
revs = FilterInPlace(revs, func(r *rev) bool { return r.Repo == "go" })

g := newGrid(revs)
for i, rev := range revs {
fmt.Fprintf(os.Stderr, "\rProcessing rev %d/%d...", i+1, len(revs))
for _, rev := range revs {
rangeBuildResults(rev, func(label string, res result) {
g.add(label, rev, res)
})
}
fmt.Fprintf(os.Stderr, "\n")

fmt.Printf("<!DOCTYPE html>\n")
fmt.Printf("<html><body>\n")
Expand Down
83 changes: 53 additions & 30 deletions buildstats/rev.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,14 @@ import (
"os"
"path/filepath"
"regexp"
"sync"
"time"
)

type rev struct {
path string
date time.Time

metaOnce sync.Once
meta revMeta
revMeta
}

var pathDateRe = regexp.MustCompile(`^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})-[0-9a-f]+$`)
Expand All @@ -37,9 +35,9 @@ func getRevs(since time.Time) []*rev {
log.Fatalf("reading rev directory %s: %s", revDir, err)
}

var matches []*rev
for i, dir := range dirs {
fmt.Fprintf(os.Stderr, "\rLoading rev %d/%d...", i+1, len(dirs))
// Filter the paths down without additional I/O.
var revs []*rev
for _, dir := range dirs {
if !dir.IsDir() {
continue
}
Expand All @@ -55,14 +53,22 @@ func getRevs(since time.Time) []*rev {
if t.Before(since) {
continue
}
matches = append(matches, &rev{
path: filepath.Join(revDir, name),

path := filepath.Join(revDir, dir.Name())
revs = append(revs, &rev{
path: path,
date: t,
})
}

// Load revision metadata.
for i, rev := range revs {
fmt.Fprintf(os.Stderr, "\rLoading rev %d/%d...", i+1, len(revs))
rev.revMeta = readMeta(rev.path)
}
fmt.Fprintf(os.Stderr, "\n")

return matches
return revs
}

func (r *rev) String() string {
Expand All @@ -71,30 +77,47 @@ func (r *rev) String() string {

type revMeta struct {
Repo string `json:"repo"`
Builders []string // not in JSON
Builders []string `json:""`
Results []string `json:"results"`
}

func (r *rev) getMeta() revMeta {
r.metaOnce.Do(func() {
path := filepath.Join(r.path, ".rev.json")
b, err := ioutil.ReadFile(path)
if err != nil {
log.Fatal(err)
}
if err = json.Unmarshal(b, &r.meta); err != nil {
log.Fatalf("decoding %s: %s", path, err)
}
func readMeta(revPath string) revMeta {
var meta revMeta

path = filepath.Join(r.path, ".builders.json")
b, err = ioutil.ReadFile(path)
if err != nil {
log.Fatal(err)
}
if err = json.Unmarshal(b, &r.meta.Builders); err != nil {
log.Fatalf("decoding %s: %s", path, err)
}
})
path := filepath.Join(revPath, ".rev.json")
b, err := ioutil.ReadFile(path)
if err != nil {
log.Fatal(err)
}
if err = json.Unmarshal(b, &meta); err != nil {
log.Fatalf("decoding %s: %s", path, err)
}

return r.meta
path = filepath.Join(revPath, ".builders.json")
b, err = ioutil.ReadFile(path)
if err != nil {
log.Fatal(err)
}
if err = json.Unmarshal(b, &meta.Builders); err != nil {
log.Fatalf("decoding %s: %s", path, err)
}

return meta
}

func (r *rev) getLogPath(builder string) (string, error) {
p := filepath.Join(r.path, builder)
target, err := os.Readlink(p)
if err != nil {
return "", fmt.Errorf("error getting log path: %e", err)
}
return filepath.Clean(filepath.Join(p, target)), nil
}

func (r *rev) readLog(builder string) ([]byte, error) {
path, err := r.getLogPath(builder)
if err != nil {
return nil, err
}
return ioutil.ReadFile(path)
}

0 comments on commit 88fbd33

Please sign in to comment.