app/appengine: show all builder columns, even if they don't have results

Fixes golang/go#19930

Change-Id: Ia6018a2e93bea123b684d2708d858adcca7bb4e4
Reviewed-on: https://go-review.googlesource.com/c/build/+/170443
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/app/appengine/README.md b/app/appengine/README.md
index 779ca27..e2d2854 100644
--- a/app/appengine/README.md
+++ b/app/appengine/README.md
@@ -1,6 +1,22 @@
 # build.golang.org App Engine App
 
-Update with
+This is the code that runs https://build.golang.org/
+
+## Local development
+
+On a machine with a browser:
+
+```
+dev_appserver.py --port=8080 .
+```
+
+With a remote VM with a port open to the Internet:
+
+```
+dev_appserver.py --enable_host_checking=false --host=0.0.0.0 --port=8080 .
+```
+
+## Deploying
 
 ```sh
 gcloud config set project golang-org
diff --git a/app/appengine/ui.go b/app/appengine/ui.go
index ba0103d..c0207df 100644
--- a/app/appengine/ui.go
+++ b/app/appengine/ui.go
@@ -23,6 +23,7 @@
 	"time"
 
 	"golang.org/x/build/app/cache"
+	"golang.org/x/build/dashboard"
 	"golang.org/x/build/types"
 
 	"google.golang.org/appengine"
@@ -356,9 +357,14 @@
 			builders[r.Builder] = true
 		}
 	}
-	// In dev_appserver mode, add some dummy data:
-	if len(builders) == 0 && isDevAppServer {
-		return []string{"linux-amd64", "linux-amd64-nocgo", "linux-amd64-race", "windows-386", "windows-amd64"}
+	// Add all known builders from the builder configuration too.
+	// We want to see columns even if there are no results so we
+	// can identify missing builders. (Issue 19930)
+	for name, bc := range dashboard.Builders {
+		if !bc.BuildsRepoPostSubmit("go", "master", "master") {
+			continue
+		}
+		builders[name] = true
 	}
 	k := keys(builders)
 	sort.Sort(builderOrder(k))
@@ -366,6 +372,7 @@
 }
 
 func keys(m map[string]bool) (s []string) {
+	s = make([]string, 0, len(m))
 	for k := range m {
 		s = append(s, k)
 	}