func()

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)
}