package list import ( "net/http" "github.com/cli/cli/v2/api" "github.com/cli/cli/v2/internal/ghrepo" "github.com/cli/cli/v2/pkg/cmd/label/shared" ) func listLabels(client *http.Client, repo ghrepo.Interface, limit int) ([]shared.Label, int, error) { apiClient := api.NewClientFromHTTP(client) query := ` query LabelList($owner: String!,$repo: String!, $limit: Int!, $endCursor: String) { repository(owner: $owner, name: $repo) { labels(first: $limit, after: $endCursor) { totalCount, nodes { name, description, color } pageInfo { hasNextPage endCursor } } } }` variables := map[string]interface{}{ "owner": repo.RepoOwner(), "repo": repo.RepoName(), } type responseData struct { Repository struct { Labels struct { TotalCount int Nodes []shared.Label PageInfo struct { HasNextPage bool EndCursor string } } HasIssuesEnabled bool } } var labels []shared.Label var totalCount int pageLimit := min(limit, 100) loop: for { var response responseData variables["limit"] = pageLimit err := apiClient.GraphQL(repo.RepoHost(), query, variables, &response) if err != nil { return nil, 0, err } totalCount = response.Repository.Labels.TotalCount for _, label := range response.Repository.Labels.Nodes { labels = append(labels, label) if len(labels) == limit { break loop } } if response.Repository.Labels.PageInfo.HasNextPage { variables["endCursor"] = response.Repository.Labels.PageInfo.EndCursor pageLimit = min(pageLimit, limit-len(labels)) } else { break } } return labels, totalCount, nil } func min(a, b int) int { if a < b { return a } return b }