dashboard/app: add a JSON output mode for the data on the front page

Fixes golang/go#9493

Change-Id: I4891abf530901c620c2923e9f2d3e3227dd7ced9
Reviewed-on: https://go-review.googlesource.com/2290
Reviewed-by: Andrew Gerrand <adg@golang.org>
diff --git a/types/types.go b/types/types.go
new file mode 100644
index 0000000..b8dfa48
--- /dev/null
+++ b/types/types.go
@@ -0,0 +1,40 @@
+// Copyright 2011 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 types contains common types used by the Go continuous build
+// system.
+package types
+
+// BuildStatus is the data structure that's marshalled as JSON
+// for the http://build.golang.org/?mode=json page.
+type BuildStatus struct {
+	// Builders is a list of all known builders.
+	// The order that builders appear is the same order as the build results for a revision.
+	Builders []string `json:"builders"`
+
+	// Revisions are the revisions shown on the front page of build.golang.org,
+	// in the same order. It starts with the "go" repo, from recent to old, and then
+	// it has 1 each of the subrepos, with only their most recent commit.
+	Revisions []BuildRevision `json:"revisions"`
+}
+
+// BuildRevision is the status of a commit across all builders.
+// It corresponds to a single row of http://build.golang.org/
+type BuildRevision struct {
+	// Repo is "go" for the main repo, else  "tools", "crypto", "net", etc.
+	// These are repos as listed at https://go.googlesource.com/
+	Repo string `json:"repo"`
+
+	// Revision is the full git hash of the repo.
+	Revision string `json:"revision"`
+
+	// GoRevision is the full git hash of the "go" repo, if Repo is not "go" itself.
+	// Otherwise this is empty.
+	GoRevision string `json:"goRevision,omitempty"`
+
+	// Results are the build results for each of the builders in
+	// the same length slice BuildStatus.Builders.
+	// Each string is either "" (if no data), "ok", or the URL to failure logs.
+	Results []string `json:"results"`
+}