// FindCommitsForBuild determines which commits were first included in the // given build. Assumes that all previous builds for the given builder/master // are already in the database. func FindCommitsForBuild(bf BuildFinder, b *Build, repos *gitinfo.RepoMap) ([]string, int, []string, error) { defer metrics.NewTimer("buildbot.FindCommitsForBuild").Stop() // Shortcut: Don't bother computing commit blamelists for trybots. if IsTrybot(b.Builder) { return []string{}, -1, []string{}, nil } if b.Repository == "" { return []string{}, -1, []string{}, nil } repo, err := repos.Repo(b.Repository) if err != nil { return nil, -1, nil, fmt.Errorf("Could not find commits for build: %v", err) } // Shortcut for the first build for a given builder: this build must be // the first inclusion for all revisions prior to b.GotRevision. if b.Number == 0 && b.GotRevision != "" { revlist, err := repo.RevList(b.GotRevision) return revlist, -1, []string{}, err } // Start tracing commits back in time until we hit a previous build. commitMap, stealFrom, stolen, err := findCommitsRecursive(bf, map[string]bool{}, b, b.GotRevision, repo, -1, []string{}) if err != nil { return nil, -1, nil, err } commits := make([]string, 0, len(commitMap)) for c, _ := range commitMap { commits = append(commits, c) } return commits, stealFrom, stolen, nil }