2011-03-02 20:41:09 -07:00
|
|
|
// 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"
|
2011-06-28 00:01:52 -06:00
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
2011-03-02 20:41:09 -07:00
|
|
|
)
|
|
|
|
|
2011-07-01 22:02:42 -06:00
|
|
|
const MaxCommentLength = 500 // App Engine won't store more in a StringProperty.
|
|
|
|
|
2011-05-12 09:21:34 -06:00
|
|
|
func (b *Builder) buildPackages(workpath string, hash string) os.Error {
|
|
|
|
pkgs, err := packages()
|
2011-03-02 20:41:09 -07:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
for _, p := range pkgs {
|
2011-06-28 00:01:52 -06:00
|
|
|
goroot := filepath.Join(workpath, "go")
|
2011-07-01 22:02:42 -06:00
|
|
|
gobin := filepath.Join(goroot, "bin")
|
|
|
|
goinstall := filepath.Join(gobin, "goinstall")
|
2011-03-02 20:41:09 -07:00
|
|
|
envv := append(b.envv(), "GOROOT="+goroot)
|
|
|
|
|
2011-07-01 22:02:42 -06:00
|
|
|
// add GOBIN to path
|
|
|
|
for i, v := range envv {
|
|
|
|
if strings.HasPrefix(v, "PATH=") {
|
|
|
|
p := filepath.SplitList(v[5:])
|
|
|
|
p = append([]string{gobin}, p...)
|
|
|
|
s := strings.Join(p, string(filepath.ListSeparator))
|
|
|
|
envv[i] = "PATH=" + s
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-02 20:41:09 -07:00
|
|
|
// goinstall
|
2011-07-20 00:07:40 -06:00
|
|
|
buildLog, code, err := runLog(envv, "", goroot, goinstall, "-dashboard=false", p)
|
2011-03-02 20:41:09 -07:00
|
|
|
if err != nil {
|
|
|
|
log.Printf("goinstall %v: %v", p, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// get doc comment from package source
|
2011-07-01 22:02:42 -06:00
|
|
|
info, err := packageComment(p, filepath.Join(goroot, "src", "pkg", p))
|
2011-03-02 20:41:09 -07:00
|
|
|
if err != nil {
|
2011-07-01 22:02:42 -06:00
|
|
|
log.Printf("packageComment %v: %v", p, err)
|
2011-03-02 20:41:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// update dashboard with build state + info
|
2011-07-01 22:02:42 -06:00
|
|
|
err = b.updatePackage(p, code == 0, buildLog, info)
|
2011-03-02 20:41:09 -07:00
|
|
|
if err != nil {
|
|
|
|
log.Printf("updatePackage %v: %v", p, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2011-06-28 00:01:52 -06:00
|
|
|
func isGoFile(fi *os.FileInfo) bool {
|
|
|
|
return fi.IsRegular() && // exclude directories
|
|
|
|
!strings.HasPrefix(fi.Name, ".") && // ignore .files
|
|
|
|
filepath.Ext(fi.Name) == ".go"
|
|
|
|
}
|
|
|
|
|
2011-05-12 09:21:34 -06:00
|
|
|
func packageComment(pkg, pkgpath string) (info string, err os.Error) {
|
2011-03-02 20:41:09 -07:00
|
|
|
fset := token.NewFileSet()
|
2011-06-28 00:01:52 -06:00
|
|
|
pkgs, err := parser.ParseDir(fset, pkgpath, isGoFile, parser.PackageClauseOnly|parser.ParseComments)
|
2011-03-02 20:41:09 -07:00
|
|
|
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
|
|
|
|
}
|
2011-07-01 22:02:42 -06:00
|
|
|
// grab only first paragraph
|
|
|
|
if parts := strings.SplitN(info, "\n\n", 2); len(parts) > 1 {
|
|
|
|
info = parts[0]
|
|
|
|
}
|
|
|
|
// replace newlines with spaces
|
|
|
|
info = strings.Replace(info, "\n", " ", -1)
|
|
|
|
// truncate
|
|
|
|
if len(info) > MaxCommentLength {
|
|
|
|
info = info[:MaxCommentLength]
|
|
|
|
}
|
2011-03-02 20:41:09 -07:00
|
|
|
return
|
|
|
|
}
|