Files
github-recon/commits.go
T
2025-05-09 23:22:03 +02:00

80 lines
1.9 KiB
Go

package main
import (
"context"
"fmt"
"github.com/charmbracelet/log"
"github.com/google/go-github/v72/github"
)
func commits(client *github.Client, ctx context.Context, username string) {
// Commits
fmt.Println(
GreyStyle.Render("[")+GreenStyle.Render("+")+GreyStyle.Render("]"),
GreyStyle.Render("Commits:\n"),
)
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, // "desc" ou "asc"
ListOptions: github.ListOptions{PerPage: 100},
}
for page := 1; page <= 10; page++ {
opts.ListOptions.Page = page
result, resp, err := client.Search.Commits(
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 {
log.Error("Failed to fetch commits", "err", err)
return
}
if err := collect("asc"); err != nil {
log.Error("Failed to fetch commits", "err", err)
return
}
}