73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package list
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/cli/cli/internal/ghinstance"
|
|
"github.com/cli/cli/internal/ghrepo"
|
|
"github.com/shurcooL/githubv4"
|
|
"github.com/shurcooL/graphql"
|
|
)
|
|
|
|
type Release struct {
|
|
Name string
|
|
TagName string
|
|
IsDraft bool
|
|
IsPrerelease bool
|
|
CreatedAt time.Time
|
|
PublishedAt time.Time
|
|
}
|
|
|
|
func fetchReleases(httpClient *http.Client, repo ghrepo.Interface, limit int) ([]Release, error) {
|
|
type responseData struct {
|
|
Repository struct {
|
|
Releases struct {
|
|
Nodes []Release
|
|
PageInfo struct {
|
|
HasNextPage bool
|
|
EndCursor string
|
|
}
|
|
} `graphql:"releases(first: $perPage, orderBy: {field: CREATED_AT, direction: DESC}, after: $endCursor)"`
|
|
} `graphql:"repository(owner: $owner, name: $name)"`
|
|
}
|
|
|
|
perPage := limit
|
|
if limit > 100 {
|
|
perPage = 100
|
|
}
|
|
|
|
variables := map[string]interface{}{
|
|
"owner": githubv4.String(repo.RepoOwner()),
|
|
"name": githubv4.String(repo.RepoName()),
|
|
"perPage": githubv4.Int(perPage),
|
|
"endCursor": (*githubv4.String)(nil),
|
|
}
|
|
|
|
gql := graphql.NewClient(ghinstance.GraphQLEndpoint(repo.RepoHost()), httpClient)
|
|
|
|
var releases []Release
|
|
loop:
|
|
for {
|
|
var query responseData
|
|
err := gql.QueryNamed(context.Background(), "RepositoryReleaseList", &query, variables)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, r := range query.Repository.Releases.Nodes {
|
|
releases = append(releases, r)
|
|
if len(releases) == limit {
|
|
break loop
|
|
}
|
|
}
|
|
|
|
if !query.Repository.Releases.PageInfo.HasNextPage {
|
|
break
|
|
}
|
|
variables["endCursor"] = githubv4.String(query.Repository.Releases.PageInfo.EndCursor)
|
|
}
|
|
|
|
return releases, nil
|
|
}
|