autogits/workflow-pr/reviews.go
2025-02-18 12:40:32 +01:00

89 lines
1.7 KiB
Go

package main
import (
"slices"
"src.opensuse.org/autogits/common"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
type PRReviews struct {
reviews []*models.PullReview
reviewers []string
}
func FetchGiteaReviews(rf common.GiteaReviewFetcher, reviewers []string, org, repo string, no int64) (*PRReviews, error) {
reviews, err := rf.GetPullRequestReviews(org, repo, no)
if err != nil {
return nil, err
}
return &PRReviews{
reviews: reviews,
reviewers: reviewers,
}, nil
}
func (r *PRReviews) IsApproved() bool {
goodReview := false
for _, reviewer := range r.reviewers {
goodReview = false
for _, review := range r.reviews {
if review.User.UserName == reviewer && review.State == common.ReviewStateApproved && !review.Stale {
goodReview = true
break
}
}
if !goodReview {
break
}
}
return goodReview
}
func (r *PRReviews) HasPendingReviewBy(reviewer string) bool {
if !slices.Contains(r.reviewers, reviewer) {
return false
}
isPending := false
for _, r := range r.reviews {
if r.User.UserName == reviewer && !r.Stale {
switch r.State {
case common.ReviewStateApproved:
fallthrough
case common.ReviewStateRequestChanges:
return false
case common.ReviewStateRequestReview:
fallthrough
case common.ReviewStatePending:
isPending = true
}
}
}
return isPending
}
func (r *PRReviews) IsReviewedBy(reviewer string) bool {
if !slices.Contains(r.reviewers, reviewer) {
return false
}
for _, r := range r.reviews {
if r.User.UserName == reviewer && !r.Stale {
switch r.State {
case common.ReviewStateApproved:
return true
case common.ReviewStateRequestChanges:
return true
}
}
}
return false
}