diff --git a/README.md b/README.md index 894bbcc..be73534 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Code Ownership & Review Assignment Tool - GitHub CODEOWNERS but better [![Go Report Card](https://goreportcard.com/badge/github.com/multimediallc/codeowners-plus)](https://goreportcard.com/report/github.com/multimediallc/codeowners-plus?kill_cache=1) [![Tests](https://github.com/multimediallc/codeowners-plus/actions/workflows/go.yml/badge.svg)](https://github.com/multimediallc/codeowners-plus/actions/workflows/go.yml) -![Coverage](https://img.shields.io/badge/Coverage-59.9%25-yellow) +![Coverage](https://img.shields.io/badge/Coverage-60.1%25-yellow) [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) diff --git a/internal/github/gh.go b/internal/github/gh.go index d509769..c4c286d 100644 --- a/internal/github/gh.go +++ b/internal/github/gh.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "maps" "slices" "strings" "time" @@ -120,12 +121,22 @@ func (gh *Client) InitReviews() error { allReviews = f.Filtered(allReviews, func(review *github.PullRequestReview) bool { return review.User.GetLogin() != gh.PR.User.GetLogin() }) + // use descending chronological order (default ascending) + slices.Reverse(allReviews) gh.reviews = allReviews return nil } func (gh *Client) approvals() []*github.PullRequestReview { + seen := make(map[string]bool, 0) approvals := f.Filtered(gh.reviews, func(approval *github.PullRequestReview) bool { + userName := approval.GetUser().GetLogin() + if _, ok := seen[userName]; ok { + // we only care about the most recent reviews for each user + return false + } else { + seen[userName] = true + } return approval.GetState() == "APPROVED" }) return approvals @@ -206,15 +217,17 @@ func (gh *Client) GetAlreadyReviewed() ([]string, error) { } func reviewerAlreadyReviewed(reviews []*github.PullRequestReview, userReviewerMap ghUserReviewerMap) []string { - reviewsReviewers := make([]string, 0, len(reviews)) + reviewsReviewers := make(map[string]bool, len(reviews)) for _, review := range reviews { reviewingUser := review.GetUser().GetLogin() if reviewers, ok := userReviewerMap[reviewingUser]; ok { - reviewsReviewers = append(reviewsReviewers, reviewers...) + for _, reviewer := range reviewers { + reviewsReviewers[reviewer] = true + } } } - return reviewsReviewers + return slices.Collect(maps.Keys(reviewsReviewers)) } func (gh *Client) GetCurrentlyRequested() ([]string, error) {