func GetIssues()

in tools/issue-labeler/labeler/backfill.go [25:81]


func GetIssues(repository, since string) ([]*github.Issue, error) {
	client := newGitHubClient()
	owner, repo, err := splitRepository(repository)
	if err != nil {
		return nil, fmt.Errorf("invalid repository format: %w", err)
	}

	sinceTime, err := time.Parse("2006-01-02", since) // input format YYYY-MM-DD
	if err != nil {
		return nil, fmt.Errorf("invalid since time format: %w", err)
	}

	opt := &github.IssueListByRepoOptions{
		Since:     sinceTime,
		State:     "all",
		Sort:      "updated",
		Direction: "desc",
		ListOptions: github.ListOptions{
			PerPage: 100,
		},
	}

	var allIssues []*github.Issue
	ctx := context.Background()

	issues, resp, err := client.Issues.ListByRepo(ctx, owner, repo, opt)
	if err != nil {
		return nil, fmt.Errorf("listing issues: %w", err)
	}
	allIssues = append(allIssues, issues...)

	for {
		// use link headers instead of page parameter based pagination as
		// it is not supported for large datasets

		next := parseNextLink(resp.Response)
		if next == "" {
			break
		}

		req, err := client.NewRequest("GET", next, nil)
		if err != nil {
			return allIssues, err
		}
		req.Header.Set("Accept", "application/vnd.github.raw+json")

		var issues []*github.Issue
		resp, err = client.Do(ctx, req, &issues)
		if err != nil {
			return allIssues, err
		}

		allIssues = append(allIssues, issues...)
	}

	return allIssues, nil
}