mirror of
https://github.com/anotherhadi/github-recon.git
synced 2026-10-05 10:58:25 +02:00
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package ghrecon
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/google/go-github/v72/github"
|
|
)
|
|
|
|
func (r Recon) Commits(username string) {
|
|
PrintTitle("🐙 Commits")
|
|
|
|
seenNames := make(map[string]struct{})
|
|
seenEmails := make(map[string]struct{})
|
|
var names, emails []string
|
|
|
|
collect := func(order string) error {
|
|
opts := &github.SearchOptions{
|
|
Sort: "author-date",
|
|
Order: order,
|
|
ListOptions: github.ListOptions{PerPage: 100},
|
|
}
|
|
for page := 1; page <= 10; page++ {
|
|
opts.ListOptions.Page = page
|
|
result, resp, err := r.client.Search.Commits(
|
|
r.ctx,
|
|
fmt.Sprintf("author:%s", username),
|
|
opts,
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("fetch page %d (%s): %w", page, order, err)
|
|
}
|
|
WaitForRateLimit(resp)
|
|
if len(result.Commits) == 0 {
|
|
break
|
|
}
|
|
for _, item := range result.Commits {
|
|
a := item.Commit.GetAuthor()
|
|
name := a.GetName()
|
|
email := a.GetEmail()
|
|
if _, seen := seenNames[name]; !seen {
|
|
seenNames[name] = struct{}{}
|
|
names = append(names, name)
|
|
PrintInfo(
|
|
"Name "+fmt.Sprint(len(names)),
|
|
name,
|
|
"from "+item.GetRepository().Owner.GetLogin()+"/"+item.GetRepository().
|
|
GetName(),
|
|
)
|
|
}
|
|
if _, seen := seenEmails[email]; !seen {
|
|
seenEmails[email] = struct{}{}
|
|
emails = append(emails, email)
|
|
PrintInfo(
|
|
"Email "+fmt.Sprint(len(emails)),
|
|
email,
|
|
"from "+item.GetRepository().Owner.GetLogin()+"/"+item.GetRepository().
|
|
GetName(),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
if err := collect("desc"); err != nil {
|
|
r.logger.Error("Failed to fetch commits", "err", err, "order", "desc")
|
|
}
|
|
if err := collect("asc"); err != nil {
|
|
r.logger.Error("Failed to fetch commits", "err", err, "order", "asc")
|
|
}
|
|
}
|