// LoadData loads the build data for the given commits. func LoadData(commits []string) (map[int]*buildbot.Build, map[string]map[string]*buildbot.BuildSummary, map[string][]*buildbot.BuilderComment, error) { defer timer.New("build_cache.LoadData()").Stop() builds, err := buildbot.GetBuildsForCommits(commits, nil) if err != nil { return nil, nil, nil, err } byId := map[int]*buildbot.Build{} byCommit := map[string]map[string]*buildbot.BuildSummary{} builders := map[string]bool{} for hash, buildList := range builds { byBuilder := map[string]*buildbot.BuildSummary{} for _, b := range buildList { byId[b.Id] = b if !util.AnyMatch(BOT_BLACKLIST, b.Builder) { byBuilder[b.Builder] = b.GetSummary() builders[b.Builder] = true } } byCommit[hash] = byBuilder } builderList := make([]string, 0, len(builders)) for b, _ := range builders { builderList = append(builderList, b) } builderComments, err := buildbot.GetBuildersComments(builderList) if err != nil { return nil, nil, nil, err } return byId, byCommit, builderComments, nil }
// GetBuildsForCommits returns the build data for the given commits. func (c *BuildCache) GetBuildsForCommits(commits []string) (map[string]map[string]*buildbot.BuildSummary, map[string][]*buildbot.BuilderComment, error) { c.mutex.RLock() defer c.mutex.RUnlock() builders := map[string][]*buildbot.BuilderComment{} for k, v := range c.builders { builders[k] = v } byCommit := map[string]map[string]*buildbot.BuildSummary{} missing := []string{} for _, hash := range commits { builds, ok := c.byCommit[hash] if ok { byCommit[hash] = builds } else { missing = append(missing, hash) } } missingBuilders := map[string]bool{} if len(missing) > 0 { glog.Warningf("Missing build data for some commits; loading now (%v)", missing) _, missingByCommit, builders, err := LoadData(missing) if err != nil { return nil, nil, fmt.Errorf("Failed to load missing builds: %v", err) } for hash, byBuilder := range missingByCommit { byCommit[hash] = byBuilder for builder, _ := range byBuilder { if _, ok := builders[builder]; !ok { missingBuilders[builder] = true } } } } missingBuilderList := make([]string, 0, len(missingBuilders)) for b, _ := range missingBuilders { missingBuilderList = append(missingBuilderList, b) } missingComments, err := buildbot.GetBuildersComments(missingBuilderList) if err != nil { return nil, nil, fmt.Errorf("Failed to load missing builder comments: %v", err) } for b, s := range missingComments { builders[b] = s } return byCommit, builders, nil }