github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/pkg/cmd/release/list/http.go (about) 1 package list 2 3 import ( 4 "context" 5 "net/http" 6 "time" 7 8 "github.com/cli/cli/internal/ghinstance" 9 "github.com/cli/cli/internal/ghrepo" 10 "github.com/shurcooL/githubv4" 11 "github.com/shurcooL/graphql" 12 ) 13 14 type Release struct { 15 Name string 16 TagName string 17 IsDraft bool 18 IsPrerelease bool 19 CreatedAt time.Time 20 PublishedAt time.Time 21 } 22 23 func fetchReleases(httpClient *http.Client, repo ghrepo.Interface, limit int) ([]Release, error) { 24 type responseData struct { 25 Repository struct { 26 Releases struct { 27 Nodes []Release 28 PageInfo struct { 29 HasNextPage bool 30 EndCursor string 31 } 32 } `graphql:"releases(first: $perPage, orderBy: {field: CREATED_AT, direction: DESC}, after: $endCursor)"` 33 } `graphql:"repository(owner: $owner, name: $name)"` 34 } 35 36 perPage := limit 37 if limit > 100 { 38 perPage = 100 39 } 40 41 variables := map[string]interface{}{ 42 "owner": githubv4.String(repo.RepoOwner()), 43 "name": githubv4.String(repo.RepoName()), 44 "perPage": githubv4.Int(perPage), 45 "endCursor": (*githubv4.String)(nil), 46 } 47 48 gql := graphql.NewClient(ghinstance.GraphQLEndpoint(repo.RepoHost()), httpClient) 49 50 var releases []Release 51 loop: 52 for { 53 var query responseData 54 err := gql.QueryNamed(context.Background(), "RepositoryReleaseList", &query, variables) 55 if err != nil { 56 return nil, err 57 } 58 59 for _, r := range query.Repository.Releases.Nodes { 60 releases = append(releases, r) 61 if len(releases) == limit { 62 break loop 63 } 64 } 65 66 if !query.Repository.Releases.PageInfo.HasNextPage { 67 break 68 } 69 variables["endCursor"] = githubv4.String(query.Repository.Releases.PageInfo.EndCursor) 70 } 71 72 return releases, nil 73 }