Skip to content

Commit

Permalink
First iteration of -usr flag.
Browse files Browse the repository at this point in the history
  • Loading branch information
thomasvn committed Apr 24, 2024
1 parent d1d1007 commit abca2cd
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 52 deletions.
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ Top PRs/Issues:

```bash
$ gwir -h
Usage of gwir:
-days int
How many days back to analyze (default 7)
-org string
Expand All @@ -47,6 +46,8 @@ Usage of gwir:
Optional. Passing a GitHub Personal Access Token allows you to view private repositories and make more API requests per hour. You can also set this token as an environment variable GITHUB_PERSONAL_ACCESS_TOKEN.
-top int
How many top PRs/Issues to show (default 5)
-usr string
GitHub user to analyze
```

## Install
Expand Down Expand Up @@ -77,6 +78,12 @@ TODO:
- Asciicinema? https://github.com/kubecost/kubectl-cost/blob/main/assets/presentation-script.md
- Pipe to Glow?
- echo "[Glow](https://github.com/charmbracelet/glow)" | glow -
- Other APIs to investigate.
// client.Activity.ListEventsPerformedByUser()
// client.Activity.ListEventsReceivedByUser()
// client.Activity.ListUserEventsForOrganization()
// client.Activity.ListEventsForOrganization()
// client.Activity.ListFeeds()
-->

<!--
Expand Down
54 changes: 10 additions & 44 deletions org.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,82 +104,48 @@ func getRepoEventsLastXDays(client *github.Client, owner string, repo string, x
stop := false
page := 1
for {
opts := &github.ListOptions{}
opts.PerPage = 100
opts.Page = page
events, res, _ := client.Activity.ListRepositoryEvents(context.Background(), owner, repo, opts)
opts := github.ListOptions{PerPage: 100, Page: page}
events, res, _ := client.Activity.ListRepositoryEvents(context.Background(), owner, repo, &opts)
for _, event := range events {
if event.GetCreatedAt().Time.Before(time.Now().AddDate(0, 0, -1*x)) {
stop = true
break
}

// Tally the event counts
if val, ok := eventCounts[event.GetType()]; ok {
eventCounts[event.GetType()] = val + 1
} else {
eventCounts[event.GetType()] = 1
}
eventCounts[event.GetType()]++
totalCount++

// Tally PR/Issue event counts
payload, _ := event.ParsePayload()
switch event.GetType() {
case "PullRequestEvent":
prEvent := payload.(*github.PullRequestEvent)
if val, ok := prIssueCounts[prEvent.PullRequest.GetHTMLURL()]; ok {
prIssueCounts[prEvent.PullRequest.GetHTMLURL()] = val + 1
} else {
prIssueCounts[prEvent.PullRequest.GetHTMLURL()] = 1
}
prIssueCounts[prEvent.PullRequest.GetHTMLURL()]++
prIssueTitle[prEvent.PullRequest.GetHTMLURL()] = prEvent.PullRequest.GetTitle()
case "PullRequestReviewEvent":
prReviewEvent := payload.(*github.PullRequestReviewEvent)
if val, ok := prIssueCounts[prReviewEvent.PullRequest.GetHTMLURL()]; ok {
prIssueCounts[prReviewEvent.PullRequest.GetHTMLURL()] = val + 1
} else {
prIssueCounts[prReviewEvent.PullRequest.GetHTMLURL()] = 1
}
prIssueCounts[prReviewEvent.PullRequest.GetHTMLURL()]++
prIssueTitle[prReviewEvent.PullRequest.GetHTMLURL()] = prReviewEvent.PullRequest.GetTitle()
case "PullRequestReviewCommentEvent":
prReviewCommentEvent := payload.(*github.PullRequestReviewCommentEvent)
if val, ok := prIssueCounts[prReviewCommentEvent.PullRequest.GetHTMLURL()]; ok {
prIssueCounts[prReviewCommentEvent.PullRequest.GetHTMLURL()] = val + 1
} else {
prIssueCounts[prReviewCommentEvent.PullRequest.GetHTMLURL()] = 1
}
prIssueCounts[prReviewCommentEvent.PullRequest.GetHTMLURL()]++
prIssueTitle[prReviewCommentEvent.PullRequest.GetHTMLURL()] = prReviewCommentEvent.PullRequest.GetTitle()
case "PullRequestReviewThreadEvent":
prReviewThreadEvent := payload.(*github.PullRequestReviewThreadEvent)
if val, ok := prIssueCounts[prReviewThreadEvent.PullRequest.GetHTMLURL()]; ok {
prIssueCounts[prReviewThreadEvent.PullRequest.GetHTMLURL()] = val + 1
} else {
prIssueCounts[prReviewThreadEvent.PullRequest.GetHTMLURL()] = 1
}
prIssueCounts[prReviewThreadEvent.PullRequest.GetHTMLURL()]++
prIssueTitle[prReviewThreadEvent.PullRequest.GetHTMLURL()] = prReviewThreadEvent.PullRequest.GetTitle()
case "PullRequestTargetEvent":
prTargetEvent := payload.(*github.PullRequestTargetEvent)
if val, ok := prIssueCounts[prTargetEvent.PullRequest.GetHTMLURL()]; ok {
prIssueCounts[prTargetEvent.PullRequest.GetHTMLURL()] = val + 1
} else {
prIssueCounts[prTargetEvent.PullRequest.GetHTMLURL()] = 1
}
prIssueCounts[prTargetEvent.PullRequest.GetHTMLURL()]++
prIssueTitle[prTargetEvent.PullRequest.GetHTMLURL()] = prTargetEvent.PullRequest.GetTitle()
case "IssuesEvent":
issuesEvent := payload.(*github.IssuesEvent)
if val, ok := prIssueCounts[issuesEvent.Issue.GetHTMLURL()]; ok {
prIssueCounts[issuesEvent.Issue.GetHTMLURL()] = val + 1
} else {
prIssueCounts[issuesEvent.Issue.GetHTMLURL()] = 1
}
prIssueCounts[issuesEvent.Issue.GetHTMLURL()]++
prIssueTitle[issuesEvent.Issue.GetHTMLURL()] = issuesEvent.Issue.GetTitle()
case "IssueCommentEvent":
issueCommentEvent := payload.(*github.IssueCommentEvent)
if val, ok := prIssueCounts[issueCommentEvent.Issue.GetHTMLURL()]; ok {
prIssueCounts[issueCommentEvent.Issue.GetHTMLURL()] = val + 1
} else {
prIssueCounts[issueCommentEvent.Issue.GetHTMLURL()] = 1
}
prIssueCounts[issueCommentEvent.Issue.GetHTMLURL()]++
prIssueTitle[issueCommentEvent.Issue.GetHTMLURL()] = issueCommentEvent.Issue.GetTitle()
}
}
Expand Down
62 changes: 55 additions & 7 deletions usr.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,60 @@
package main

import "github.com/google/go-github/v61/github"
import (
"context"
"fmt"
"time"

"github.com/google/go-github/v61/github"
)

func AnalyzeUserActivity(client *github.Client, argopts ArgOpts) {
// TODO: Use one of these APIs
// client.Activity.ListEventsPerformedByUser()
// client.Activity.ListEventsReceivedByUser()
// client.Activity.ListUserEventsForOrganization()
// client.Activity.ListEventsForOrganization()
// client.Activity.ListFeeds()
// Paginated query to get all events for the user
allUserEvents := []*github.Event{}
page := 1
for {
opts := github.ListOptions{PerPage: 100, Page: page}
events, res, _ := client.Activity.ListEventsPerformedByUser(context.Background(), argopts.GITHUB_USER, false, &opts)
allUserEvents = append(allUserEvents, events...)
// TODO: filter for timestamps here to reduce the # of API requests made
if res.NextPage == 0 {
break
}
page++
}

// Filter for events within the timestamp
recentUserEvents := []*github.Event{}
for _, event := range allUserEvents {
if event.GetCreatedAt().After(time.Now().Add(time.Duration(-argopts.DAYS) * time.Hour * 24)) {
recentUserEvents = append(recentUserEvents, event)
}
}

// Process the event types
type EventCount struct {
RepoCount map[string]int
RepoEventTypeCount map[string]map[string]int
}
eventCounts := EventCount{RepoCount: make(map[string]int), RepoEventTypeCount: make(map[string]map[string]int)}
for _, event := range recentUserEvents {
eventCounts.RepoCount[event.GetRepo().GetName()]++
if _, ok := eventCounts.RepoEventTypeCount[event.GetRepo().GetName()]; !ok {
eventCounts.RepoEventTypeCount[event.GetRepo().GetName()] = make(map[string]int)
}
eventCounts.RepoEventTypeCount[event.GetRepo().GetName()][event.GetType()]++
}

// Print sorted results
repoCountSortedSlice := sortMap(eventCounts.RepoCount)
for _, pair := range repoCountSortedSlice {
fmt.Printf("\n%s: %d\n", pair.Key, pair.Value)
repoEventCountSortedSlice := sortMap(eventCounts.RepoEventTypeCount[pair.Key])
for _, pair := range repoEventCountSortedSlice {
fmt.Printf(" - %s: %d\n", pair.Key, pair.Value)
}
}

// TODO: Depending on the event type, print details and provide a link?
// TODO: Provide links to PRs/Issues/Repos?
}

0 comments on commit abca2cd

Please sign in to comment.