From fadffa25786b9992a67212ca9b1792a7d832eae3 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Tue, 16 Jul 2024 15:11:01 -0400 Subject: [PATCH] feat: add repoRecentReleases (#4) * feat: add repoRecentReleases Adds a `repoRecentReleases` command that fetches the latest releases for a given repository. Reference: https://github.com/muesli/markscribe/pull/84 * Update repos.go Co-authored-by: Carlos Alexandro Becker * Update repos.go Co-authored-by: Carlos Alexandro Becker * Update repos.go Co-authored-by: Carlos Alexandro Becker --------- Co-authored-by: Carlos Alexandro Becker --- README.md | 15 +++++++++++++++ main.go | 1 + repos.go | 38 ++++++++++++++++++++++++++++++++++++++ types.go | 14 ++++++++++---- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 035b407..e078542 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,21 @@ Last Release: {{humanize .LastRelease.PublishedAt}} {{end}} ``` +### Recent releases to a given repository + +``` +{{range recentRepoReleases "charmbracelet" "markscribe" 10}} +Name: {{.Name}} +Git Tag: {{.TagName}} +URL: {{.URL}} +Published: {{humanize .PublishedAt}} +CreatedAt: {{humanize .CreatedAt}} +IsPreRelease: {{.IsPreRelease}} +IsDraft: {{.IsDraft}} +IsLatest: {{.IsLatest}} +{{end}} +``` + This function requires GitHub authentication with the following API scopes: `repo:status`, `public_repo`, `read:user`. diff --git a/main.go b/main.go index d4686db..0995fed 100644 --- a/main.go +++ b/main.go @@ -49,6 +49,7 @@ func main() { funcMap["gists"] = gists funcMap["sponsors"] = sponsors funcMap["repo"] = repo + funcMap["repoRecentReleases"] = repoRecentReleases /* RSS */ funcMap["rss"] = rssFeed /* GoodReads */ diff --git a/repos.go b/repos.go index f748301..6a0472d 100644 --- a/repos.go +++ b/repos.go @@ -86,6 +86,12 @@ var repoQuery struct { } `graphql:"repository(owner:$owner, name:$name)"` } +var repoRecentReleasesQuery struct { + Repository struct { + Releases qlRelease `graphql:"releases(first: $count, orderBy: {field: CREATED_AT, direction: DESC})"` + } `graphql:"repository(name: $name, owner: $owner)"` +} + func recentContributions(count int) []Contribution { // fmt.Printf("Finding recent contributions...\n") @@ -298,6 +304,38 @@ func repo(owner, name string) Repo { } } +func repoRecentReleases(owner, name string, count int) []Release { + var releases []Release + + variables := map[string]interface{}{ + "owner": githubv4.String(owner), + "name": githubv4.String(name), + "count": githubv4.Int(count), + } + err := gitHubClient.Query(context.Background(), &repoRecentReleasesQuery, variables) + if err != nil { + panic(err) + } + + for _, rel := range repoRecentReleasesQuery.Repository.Releases.Nodes { + if bool(rel.IsPrerelease) { + continue + } + releases = append(releases, Release{ + Name: string(rel.Name), + TagName: string(rel.TagName), + PublishedAt: rel.PublishedAt.Time, + CreatedAt: rel.CreatedAt.Time, + URL: string(rel.URL), + IsLatest: bool(rel.IsLatest), + IsPreRelease: bool(rel.IsPrerelease), + IsDraft: bool(rel.IsDraft), + }) + } + + return releases +} + /* { user(login: "muesli") { diff --git a/types.go b/types.go index e0961c1..5d5b2b2 100644 --- a/types.go +++ b/types.go @@ -37,10 +37,14 @@ type PullRequest struct { // Release represents a release. type Release struct { - Name string - TagName string - PublishedAt time.Time - URL string + Name string + TagName string + PublishedAt time.Time + CreatedAt time.Time + URL string + IsLatest bool + IsPreRelease bool + IsDraft bool } // Repo represents a git repo. @@ -89,8 +93,10 @@ type qlRelease struct { Name githubv4.String TagName githubv4.String PublishedAt githubv4.DateTime + CreatedAt githubv4.DateTime URL githubv4.String IsPrerelease githubv4.Boolean + IsLatest githubv4.Boolean IsDraft githubv4.Boolean } }