Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,10 @@ func buildReportWithLogging(result *diff.Result, periodStart, periodEnd, generat
for _, event := range result.NewEvents {
ua := getOrCreateUserActivity(userActivities, event.Username)
activityType := eventTypeToActivityType(event.Event.Type)
// Skip events that don't map to an activity type (like CreateEvent)
if activityType == "" {
continue
}
ua.Activities = append(ua.Activities, report.Activity{
Type: activityType,
User: event.Username,
Expand Down Expand Up @@ -725,7 +729,11 @@ func eventTypeToActivityType(eventType string) report.ActivityType {
case "WatchEvent":
return report.ActivityStarred
case "CreateEvent":
return report.ActivityCreatedRepo
// Don't convert CreateEvent to ActivityCreatedRepo because:
// 1. NewRepos already tracks actual repository creations
// 2. CreateEvent includes branch/tag creation, not just repos
// Returning empty string will cause this event to be skipped
return ""
case "ForkEvent":
return report.ActivityForked
case "PushEvent":
Expand Down
49 changes: 48 additions & 1 deletion main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -499,13 +499,60 @@ func TestConvertEvent(t *testing.T) {
}
}

func TestNoDuplicateRepoCreations(t *testing.T) {
// This test validates that we don't get duplicate "created repo" entries
// when both NewRepos and CreateEvent exist for the same repository.
now := time.Now()
result := &diff.Result{
OldCapturedAt: now.Add(-1 * time.Hour),
NewCapturedAt: now,
NewRepos: []diff.RepoChange{
{
Username: "testuser",
Repo: diff.Repo{
Owner: "testuser",
Name: "new-repo",
CreatedAt: now,
},
},
},
NewEvents: []diff.EventChange{
{
Username: "testuser",
Event: diff.Event{
Type: "CreateEvent",
Repo: "testuser/new-repo",
CreatedAt: now,
},
},
},
}

rpt := buildReport(result, now.Add(-1*time.Hour), now, now)

// Count ActivityCreatedRepo entries
createdRepoCount := 0
for _, ua := range rpt.UserActivities {
for _, a := range ua.Activities {
if a.Type == report.ActivityCreatedRepo {
createdRepoCount++
}
}
}

// Should only have 1 entry (from NewRepos), not 2 (NewRepos + CreateEvent)
if createdRepoCount != 1 {
t.Errorf("expected 1 ActivityCreatedRepo entry, got %d", createdRepoCount)
}
}

func TestEventTypeToActivityType(t *testing.T) {
tests := []struct {
input string
expected report.ActivityType
}{
{"WatchEvent", report.ActivityStarred},
{"CreateEvent", report.ActivityCreatedRepo},
{"CreateEvent", ""}, // CreateEvent is skipped to avoid duplicates with NewRepos
{"ForkEvent", report.ActivityForked},
{"PushEvent", report.ActivityPushed},
{"PullRequestEvent", report.ActivityPR},
Expand Down
Loading