Parses Reviews and ReviewRequests to show reviewers and their state

This commit is contained in:
Toshiya Doi 2020-04-07 23:53:34 +09:00
parent cef525a0a2
commit bc42228171

View file

@ -337,10 +337,13 @@ func printPrPreview(out io.Writer, pr *api.PullRequest) error {
pr.BaseRefName,
pr.HeadRefName,
)))
fmt.Fprintln(out)
// Metadata
// TODO: Reviewers
fmt.Fprintln(out)
if reviewers := prReviewerList(*pr); reviewers != "" {
fmt.Fprint(out, utils.Bold("Reviewers: "))
fmt.Fprintln(out, reviewers)
}
if assignees := prAssigneeList(*pr); assignees != "" {
fmt.Fprint(out, utils.Bold("Assignees: "))
fmt.Fprintln(out, assignees)
@ -374,6 +377,51 @@ func printPrPreview(out io.Writer, pr *api.PullRequest) error {
return nil
}
//
const requestedReviewState = "REQUESTED"
type reviewerState struct {
Name string
State string
}
// prReviewerList generates a reviewer list with their last state
func prReviewerList(pr api.PullRequest) string {
reviewerStates := parseReviewers(pr)
reviewers := make([]string, 0, len(reviewerStates))
for _, reviewer := range reviewerStates {
reviewers = append(reviewers, fmt.Sprintf("%s (%s)", reviewer.Name, strings.Title(strings.ToLower(reviewer.State))))
}
reviewerList := strings.Join(reviewers, ", ")
return reviewerList
}
// parseReviewers parses given Reviews and ReviewRequests
func parseReviewers(pr api.PullRequest) map[string]*reviewerState {
var reviewerStates = map[string]*reviewerState{}
for _, review := range pr.Reviews.Nodes {
if review.Author.Login != pr.Author.Login {
reviewerStates[review.Author.Login] = &reviewerState{
Name: review.Author.Login,
State: strings.Title(strings.ToLower(review.State)),
}
}
}
// Overwrite reviewer's state if a review request for the same reviewer exists.
for _, reviewRequest := range pr.ReviewRequests.Nodes {
reviewerStates[reviewRequest.RequestedReviewer.Login] = &reviewerState{
Name: reviewRequest.RequestedReviewer.Login,
State: requestedReviewState,
}
}
return reviewerStates
}
func prAssigneeList(pr api.PullRequest) string {
if len(pr.Assignees.Nodes) == 0 {
return ""