Skip to content

Commit a0468b7

Browse files
authored
Use pagination when listing reviews and reviewers (#46)
Fixes review detection on PRs that have many reviews.
1 parent 71bbd06 commit a0468b7

1 file changed

Lines changed: 66 additions & 15 deletions

File tree

github/github.go

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -526,13 +526,14 @@ func (client *Client) ReviewStatus(pr *github.PullRequest) (bool, error) {
526526
owner := repo.Owner.GetLogin()
527527
name := repo.GetName()
528528

529-
reviewers, _, err := client.PullRequests.ListReviewers(client.Ctx, owner, name, pr.GetNumber(), nil)
529+
reviewers, err := client.AllReviewers(pr)
530530
if err != nil {
531-
return false, errors.Wrapf(err, "cannot list reviewers for PR %d on %s", pr.GetNumber(), repo.GetFullName())
531+
return false, err
532532
}
533-
reviews, _, err := client.PullRequests.ListReviews(client.Ctx, owner, name, pr.GetNumber(), nil)
533+
534+
reviews, err := client.AllReviews(pr)
534535
if err != nil {
535-
return false, errors.Wrapf(err, "cannot list reviews for PR %d on %s", pr.GetNumber(), repo.GetFullName())
536+
return false, err
536537
}
537538

538539
approval := false
@@ -610,11 +611,7 @@ func (client *Client) ReviewStatus(pr *github.PullRequest) (bool, error) {
610611
}
611612

612613
func (client *Client) LastReviewFromUser(pr *github.PullRequest, user *github.User) (*github.PullRequestReview, error) {
613-
repo := pr.Base.Repo
614-
owner := repo.Owner.GetLogin()
615-
name := repo.GetName()
616-
617-
reviews, _, err := client.PullRequests.ListReviews(client.Ctx, owner, name, pr.GetNumber(), nil)
614+
reviews, err := client.AllReviews(pr)
618615
if err != nil {
619616
return nil, err
620617
}
@@ -764,24 +761,78 @@ func (client *Client) ShaStatus(pr *github.PullRequest, SHA string) (bool, error
764761
}
765762

766763
func (client *Client) AllRepositories(user *github.User) ([]*github.Repository, error) {
767-
ownedRepos := []*github.Repository{}
768-
listOptions := &github.RepositoryListOptions{
764+
opts := &github.RepositoryListOptions{
769765
ListOptions: github.ListOptions{
770766
PerPage: 100,
771767
},
772768
}
773769

770+
var allRepos []*github.Repository
774771
for {
775-
repos, resp, err := client.Repositories.List(client.Ctx, "", listOptions)
772+
repos, resp, err := client.Repositories.List(client.Ctx, "", opts)
776773
if err != nil {
777774
return nil, errors.Wrapf(err, "cannot list repositories for user %s", user.GetLogin())
778775
}
779-
ownedRepos = append(ownedRepos, repos...)
776+
allRepos = append(allRepos, repos...)
780777
if resp.NextPage == 0 {
781778
break
782779
}
783-
listOptions.ListOptions.Page = resp.NextPage
780+
opts.Page = resp.NextPage
781+
}
782+
783+
return allRepos, nil
784+
}
785+
786+
func (client *Client) AllReviews(pr *github.PullRequest) ([]*github.PullRequestReview, error) {
787+
repo := pr.Base.Repo
788+
owner := repo.Owner.GetLogin()
789+
name := repo.GetName()
790+
791+
opts := &github.ListOptions{
792+
PerPage: 100,
793+
}
794+
795+
var allReviews []*github.PullRequestReview
796+
for {
797+
reviews, resp, err := client.PullRequests.ListReviews(client.Ctx, owner, name, pr.GetNumber(), opts)
798+
if err != nil {
799+
return nil, errors.Wrapf(err, "cannot list reviews for %s#%d", repo.GetFullName(), pr.GetNumber())
800+
}
801+
802+
allReviews = append(allReviews, reviews...)
803+
if resp.NextPage == 0 {
804+
break
805+
}
806+
opts.Page = resp.NextPage
807+
}
808+
809+
return allReviews, nil
810+
}
811+
812+
func (client *Client) AllReviewers(pr *github.PullRequest) (*github.Reviewers, error) {
813+
repo := pr.Base.Repo
814+
owner := repo.Owner.GetLogin()
815+
name := repo.GetName()
816+
817+
opts := &github.ListOptions{
818+
PerPage: 100,
819+
}
820+
821+
var allReviewers github.Reviewers
822+
for {
823+
reviewers, resp, err := client.PullRequests.ListReviewers(client.Ctx, owner, name, pr.GetNumber(), opts)
824+
if err != nil {
825+
return nil, errors.Wrapf(err, "cannot list reviewers for %s#%d", repo.GetFullName(), pr.GetNumber())
826+
}
827+
828+
allReviewers.Users = append(allReviewers.Users, reviewers.Users...)
829+
allReviewers.Teams = append(allReviewers.Teams, reviewers.Teams...)
830+
831+
if resp.NextPage == 0 {
832+
break
833+
}
834+
opts.Page = resp.NextPage
784835
}
785836

786-
return ownedRepos, nil
837+
return &allReviewers, nil
787838
}

0 commit comments

Comments
 (0)