1
0
mirror of https://github.com/golang/go synced 2024-11-21 21:34:40 -07:00

dashboard: better ui layout for subrepo status

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/5595048
This commit is contained in:
Andrew Gerrand 2012-01-31 12:09:56 +11:00
parent 33b6d46afd
commit 1f5f457ba3
2 changed files with 113 additions and 77 deletions

View File

@ -53,13 +53,17 @@ func uiHandler(w http.ResponseWriter, r *http.Request) {
logErr(w, r, err)
return
}
builders := commitBuilders(commits)
builders := commitBuilders(commits, "")
tipState, err := TagState(c, "tip")
var tipState *TagState
if page == 0 {
// only show sub-repo state on first page
tipState, err = TagStateByName(c, "tip")
if err != nil {
logErr(w, r, err)
return
}
}
p := &Pagination{}
if len(commits) == commitsPerPage {
@ -105,10 +109,10 @@ func goCommits(c appengine.Context, page int) ([]*Commit, os.Error) {
// commitBuilders returns the names of the builders that provided
// Results for the provided commits.
func commitBuilders(commits []*Commit) []string {
func commitBuilders(commits []*Commit, goHash string) []string {
builders := make(map[string]bool)
for _, commit := range commits {
for _, r := range commit.Results("") {
for _, r := range commit.Results(goHash) {
builders[r.Builder] = true
}
}
@ -123,16 +127,20 @@ func keys(m map[string]bool) (s []string) {
return
}
// PackageState represents the state of a Package at a tag.
type PackageState struct {
*Package
*Commit
Results []*Result
OK bool
// TagState represents the state of all Packages at a Tag.
type TagState struct {
Tag *Commit
Packages []*PackageState
}
// TagState fetches the results for all Go subrepos at the specified tag.
func TagState(c appengine.Context, name string) ([]*PackageState, os.Error) {
// PackageState represents the state of a Package at a Tag.
type PackageState struct {
Package *Package
Commit *Commit
}
// TagStateByName fetches the results for all Go subrepos at the specified Tag.
func TagStateByName(c appengine.Context, name string) (*TagState, os.Error) {
tag, err := GetTag(c, name)
if err != nil {
return nil, err
@ -141,29 +149,26 @@ func TagState(c appengine.Context, name string) ([]*PackageState, os.Error) {
if err != nil {
return nil, err
}
var states []*PackageState
var st TagState
for _, pkg := range pkgs {
commit, err := pkg.LastCommit(c)
com, err := pkg.LastCommit(c)
if err != nil {
c.Warningf("%v: no Commit found: %v", pkg, err)
continue
}
results := commit.Results(tag.Hash)
ok := len(results) > 0
for _, r := range results {
ok = ok && r.OK
st.Packages = append(st.Packages, &PackageState{pkg, com})
}
states = append(states, &PackageState{
pkg, commit, results, ok,
})
st.Tag, err = tag.Commit(c)
if err != nil {
return nil, err
}
return states, nil
return &st, nil
}
type uiTemplateData struct {
Commits []*Commit
Builders []string
TipState []*PackageState
TipState *TagState
Pagination *Pagination
}

View File

@ -15,7 +15,7 @@
background: #eee;
}
h2 {
margin-top: 10px;
margin-top: 20px;
}
.build, .packages {
margin: 5px;
@ -136,39 +136,70 @@
<p>No commits to display. Hm.</p>
{{end}}
{{if $.TipState}}
<h2>Other packages</h2>
{{with $.TipState}}
{{$goHash := .Tag.Hash}}
<h2>
Sub-repositories at tip
<small>(<a href="{{repoURL .Tag.Hash ""}}">{{shortHash .Tag.Hash}}</a>)</small>
</h2>
<table class="packages">
<table class="build">
<colgroup class="col-package"></colgroup>
<colgroup class="col-hash"></colgroup>
{{range $.Builders | builderSpans}}
<colgroup class="col-result" span="{{.N}}"></colgroup>
{{end}}
<colgroup class="col-user"></colgroup>
<colgroup class="col-time"></colgroup>
<colgroup class="col-desc"></colgroup>
<tr>
<th>State</th>
<th>Package</th>
<th>&nbsp;</th>
<!-- extra row to make alternating colors use dark for first result -->
</tr>
{{range $state := $.TipState}}
<tr>
<td>
{{if .Results}}
<img src="/static/status_{{if .OK}}good{{else}}alert{{end}}.gif" />
<th></th>
<th></th>
{{range $.Builders | builderSpans}}
<th colspan="{{.N}}">{{.OS}}</th>
{{end}}
<th></th>
<th></th>
<th></th>
</tr>
<tr>
<th></th>
<th></th>
{{range $.Builders}}
<th class="result arch" title="{{.}}">{{builderArchShort .}}</th>
{{end}}
<th></th>
<th></th>
<th></th>
</tr>
{{range $pkg := .Packages}}
<tr class="commit">
<td><a title="{{.Package.Path}}">{{.Package.Name}}</a></td>
<td class="hash">
{{$h := $pkg.Commit.Hash}}
<a href="{{repoURL $h $pkg.Commit.PackagePath}}">{{shortHash $h}}</a>
</td>
{{range $.Builders}}
<td class="result">
{{with $pkg.Commit.Result . $goHash}}
{{if .OK}}
<span class="ok">ok</span>
{{else}}
<a href="/log/{{.LogHash}}" class="fail">fail</a>
{{end}}
{{else}}
&nbsp;
{{end}}
</td>
<td><a title="{{.Package.Path}}">{{.Package.Name}}</a></td>
<td>
{{range .Results}}
<div>
{{$h := $state.Commit.Hash}}
<a href="{{repoURL $h $state.Commit.PackagePath}}">{{shortHash $h}}</a>
{{if .OK}}
ok
{{else}}
<a href="/log/{{.LogHash}}" class="fail">failed</a>
{{end}}
on {{.Builder}}/<a href="{{repoURL .GoHash ""}}">{{shortHash .GoHash}}</a>
</a></div>
{{with $pkg.Commit}}
<td class="user" title="{{.User}}">{{shortUser .User}}</td>
<td class="time">{{.Time.Time.Format "Mon 02 Jan 15:04"}}</td>
<td class="desc" title="{{.Desc}}">{{shortDesc .Desc}}</td>
{{end}}
</td>
</tr>
{{end}}
</table>