Release Notes v0.6.0¶
This release adds the graphql package for GitHub GraphQL API support, providing user contribution statistics similar to what's shown on GitHub profile pages. It also introduces a comprehensive MkDocs documentation site.
New Features¶
GraphQL Package for Contribution Statistics¶
The new graphql package provides access to GitHub's GraphQL API for retrieving user contribution statistics. Two approaches are available depending on your needs:
Quick Stats (Profile View)¶
Fast retrieval using contributionsCollection - the same data that powers GitHub profile contribution graphs:
import "github.com/grokify/gogithub/graphql"
client := graphql.NewClient(ctx, "your-token")
from := time.Now().AddDate(-1, 0, 0)
to := time.Now()
stats, err := graphql.GetContributionStats(ctx, client, "octocat", from, to)
if err != nil {
return err
}
fmt.Printf("Total commits: %d\n", stats.TotalCommitContributions)
fmt.Printf("Total PRs: %d\n", stats.TotalPRContributions)
fmt.Printf("Total issues: %d\n", stats.TotalIssueContributions)
For queries spanning more than one year (the API limit), use GetContributionStatsMultiYear:
from := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
to := time.Now()
stats, err := graphql.GetContributionStatsMultiYear(ctx, client, "octocat", from, to)
Detailed Stats (Additions/Deletions)¶
For line-level statistics with public/private filtering, use the detailed stats functions:
// Get stats for all repositories
stats, err := graphql.GetCommitStats(ctx, client, "octocat", from, to, graphql.VisibilityAll)
fmt.Printf("Commits: %d\n", stats.TotalCommits)
fmt.Printf("Additions: %d\n", stats.Additions)
fmt.Printf("Deletions: %d\n", stats.Deletions)
// Monthly breakdown
for _, month := range stats.ByMonth {
fmt.Printf("%s: %d commits (+%d/-%d)\n",
month.YearMonth(), month.Commits, month.Additions, month.Deletions)
}
// Per-repository breakdown
for _, repo := range stats.ByRepo {
fmt.Printf("%s/%s: %d commits\n", repo.Owner, repo.Name, repo.Commits)
}
Visibility Filtering¶
Filter statistics by repository visibility:
// Public repositories only
public, err := graphql.GetCommitStats(ctx, client, "octocat", from, to, graphql.VisibilityPublic)
// Private repositories only
private, err := graphql.GetCommitStats(ctx, client, "octocat", from, to, graphql.VisibilityPrivate)
// Get all three at once
all, public, private, err := graphql.GetCommitStatsByVisibility(ctx, client, "octocat", from, to)
Comparison of Approaches¶
| Feature | GetContributionStats |
GetCommitStats |
|---|---|---|
| Speed | Fast (1 query/year) | Slower (paginated) |
| Commit count | ✅ | ✅ |
| Additions/Deletions | ❌ | ✅ |
| Public/Private split | ⚠️ Combined only | ✅ Precise |
| Monthly breakdown | ✅ All contributions | ✅ Commits only |
| Per-repo breakdown | ❌ | ✅ |
MkDocs Documentation Site¶
A comprehensive documentation site is now available at grokify.github.io/gogithub:
- Getting Started - Installation and quick start guide
- Package Guides - Detailed documentation for each package
- API Reference - Links to pkg.go.dev documentation
- Changelog - Version history
The site uses MkDocs with Material theme and is automatically deployed via GitHub Actions.
New Types¶
graphql.ContributionStats¶
type ContributionStats struct {
Username string
From time.Time
To time.Time
TotalCommitContributions int
TotalIssueContributions int
TotalPRContributions int
TotalPRReviewContributions int
TotalRepositoryContributions int
RestrictedContributions int // All private contributions
ContributionsByMonth []MonthlyContribution
}
graphql.CommitStats¶
type CommitStats struct {
Username string
From time.Time
To time.Time
Visibility Visibility
TotalCommits int
Additions int
Deletions int
ByMonth []MonthlyCommitStats
ByRepo []RepoCommitStats
}
graphql.Visibility¶
const (
VisibilityAll Visibility = iota // All repositories
VisibilityPublic // Public only
VisibilityPrivate // Private only
)
Dependencies¶
- Added
github.com/shurcooL/githubv4for GitHub GraphQL API support
Authentication Note¶
The GraphQL API always requires authentication, even for public data. A token with no special scopes is sufficient for querying public repositories:
For GitHub Enterprise: