in cmd/gopherstats/gopherstats.go [1017:1159]
func (sc *statsClient) rangeStats() {
var (
newCLs = map[*gophers.Person]int{}
commentsOnOtherCLs = map[*gophers.Person]int{}
githubIssuesCreated = map[*gophers.Person]int{}
githubUniqueIssueComments = map[*gophers.Person]int{} // non-owner
githubUniqueIssueEvents = map[*gophers.Person]int{} // non-owner
uniqueFilesEdited = map[*gophers.Person]int{}
uniqueDirsEdited = map[*gophers.Person]int{}
)
t1 := *startTime
t2 := *endTime
sc.corpus().GitHub().ForeachRepo(func(r *maintner.GitHubRepo) error {
if r.ID().Owner != "golang" {
return nil
}
return r.ForeachIssue(func(gi *maintner.GitHubIssue) error {
if gi.User == nil {
return nil
}
owner := gophers.GetPerson("@" + gi.User.Login)
if gi.Created.After(t1) && gi.Created.Before(t2) {
if owner == nil {
log.Printf("No owner for golang.org/issue/%d (%q)", gi.Number, gi.User.Login)
} else if !owner.Bot {
githubIssuesCreated[owner]++
}
}
sawCommenter := map[*gophers.Person]bool{}
gi.ForeachComment(func(gc *maintner.GitHubComment) error {
if gc.User == nil || gc.User.ID == gi.User.ID {
return nil
}
if gc.Created.After(t1) && gc.Created.Before(t2) {
commenter := gophers.GetPerson("@" + gc.User.Login)
if commenter == nil || sawCommenter[commenter] || commenter.Bot {
return nil
}
sawCommenter[commenter] = true
githubUniqueIssueComments[commenter]++
}
return nil
})
sawEventer := map[*gophers.Person]bool{}
gi.ForeachEvent(func(gc *maintner.GitHubIssueEvent) error {
if gc.Actor == nil || gc.Actor.ID == gi.User.ID {
return nil
}
if gc.Created.After(t1) && gc.Created.Before(t2) {
eventer := gophers.GetPerson("@" + gc.Actor.Login)
if eventer == nil || sawEventer[eventer] || eventer.Bot {
return nil
}
sawEventer[eventer] = true
githubUniqueIssueEvents[eventer]++
}
return nil
})
return nil
})
})
type projectFile struct {
gp *maintner.GerritProject
file string
}
var fileTouched = map[*gophers.Person]map[projectFile]bool{}
var dirTouched = map[*gophers.Person]map[projectFile]bool{}
foreachProjectUnsorted(sc.corpus().Gerrit(), func(gp *maintner.GerritProject) error {
if gp.Server() != "go.googlesource.com" {
return nil
}
return gp.ForeachCLUnsorted(func(cl *maintner.GerritCL) error {
owner := gophers.GetPerson(cl.Commit.Author.Email())
if cl.Created.After(t1) && cl.Created.Before(t2) {
newCLs[owner]++
}
if ct := cl.Commit.CommitTime; ct.After(t1) && ct.Before(t2) && cl.Status == "merged" {
email := cl.Commit.Author.Email() // gerrit-y email
who := gophers.GetPerson(email)
if who != nil {
if len(cl.Commit.Files) > 20 {
// Probably just a cleanup or moving files, skip this CL.
return nil
}
if fileTouched[who] == nil {
fileTouched[who] = map[projectFile]bool{}
}
if dirTouched[who] == nil {
dirTouched[who] = map[projectFile]bool{}
}
for _, diff := range cl.Commit.Files {
if strings.Contains(diff.File, "vendor/") {
continue
}
fileTouched[who][projectFile{gp, diff.File}] = true
dirTouched[who][projectFile{gp, path.Dir(diff.File)}] = true
}
}
}
saw := map[*gophers.Person]bool{}
for _, meta := range cl.Metas {
t := meta.Commit.CommitTime
if t.Before(t1) || t.After(t2) {
continue
}
email := meta.Commit.Author.Email() // gerrit-y email
who := gophers.GetPerson(email)
if who == owner || who == nil || saw[who] || who.Bot {
continue
}
saw[who] = true
commentsOnOtherCLs[who]++
}
return nil
})
})
for p, m := range fileTouched {
uniqueFilesEdited[p] = len(m)
}
for p, m := range dirTouched {
uniqueDirsEdited[p] = len(m)
}
top(newCLs, "CLs created:", 40)
top(commentsOnOtherCLs, "Unique non-self CLs commented on:", 40)
top(githubIssuesCreated, "GitHub issues created:", 40)
top(githubUniqueIssueComments, "Unique GitHub issues commented on:", 40)
top(githubUniqueIssueEvents, "Unique GitHub issues acted on:", 40)
top(uniqueFilesEdited, "Unique files edited:", 40)
top(uniqueDirsEdited, "Unique directories edited:", 40)
}