summaryrefslogtreecommitdiff
path: root/misc/dashboard/builder/package.go
diff options
context:
space:
mode:
Diffstat (limited to 'misc/dashboard/builder/package.go')
-rw-r--r--misc/dashboard/builder/package.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/misc/dashboard/builder/package.go b/misc/dashboard/builder/package.go
new file mode 100644
index 000000000..6e9f9ff39
--- /dev/null
+++ b/misc/dashboard/builder/package.go
@@ -0,0 +1,66 @@
+// 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 main
+
+import (
+ "go/doc"
+ "go/parser"
+ "go/token"
+ "log"
+ "os"
+ "path"
+)
+
+func (b *Builder) buildPackages(workpath string, c Commit) os.Error {
+ pkgs, err := getPackages()
+ if err != nil {
+ return err
+ }
+ for _, p := range pkgs {
+ goroot := path.Join(workpath, "go")
+ goinstall := path.Join(goroot, "bin", "goinstall")
+ envv := append(b.envv(), "GOROOT="+goroot)
+
+ // goinstall
+ buildLog, code, err := runLog(envv, "", goroot, goinstall, p)
+ if err != nil {
+ log.Printf("goinstall %v: %v", p, err)
+ continue
+ }
+ built := code != 0
+
+ // get doc comment from package source
+ info, err := getPackageComment(p, path.Join(goroot, "pkg", p))
+ if err != nil {
+ log.Printf("goinstall %v: %v", p, err)
+ }
+
+ // update dashboard with build state + info
+ err = b.updatePackage(p, built, buildLog, info, c)
+ if err != nil {
+ log.Printf("updatePackage %v: %v", p, err)
+ }
+ }
+ return nil
+}
+
+func getPackageComment(pkg, pkgpath string) (info string, err os.Error) {
+ fset := token.NewFileSet()
+ pkgs, err := parser.ParseDir(fset, pkgpath, nil, parser.PackageClauseOnly|parser.ParseComments)
+ if err != nil {
+ return
+ }
+ for name := range pkgs {
+ if name == "main" {
+ continue
+ }
+ if info != "" {
+ return "", os.NewError("multiple non-main package docs")
+ }
+ pdoc := doc.NewPackageDoc(pkgs[name], pkg)
+ info = pdoc.Doc
+ }
+ return
+}