89 lines
1.7 KiB
Go
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
|
|
}
|