Puts completed reviews before review requests and sort reviewer names alphabetically
This commit is contained in:
parent
5c261e2318
commit
6223a2c198
5 changed files with 172 additions and 10 deletions
|
|
@ -3,7 +3,6 @@ package api
|
|||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/cli/cli/internal/ghrepo"
|
||||
)
|
||||
|
|
@ -76,9 +75,7 @@ type PullRequest struct {
|
|||
Author struct {
|
||||
Login string
|
||||
}
|
||||
State string
|
||||
CreatedAt time.Time
|
||||
PublishedAt time.Time
|
||||
State string
|
||||
}
|
||||
}
|
||||
Assignees struct {
|
||||
|
|
@ -392,8 +389,6 @@ func PullRequestByNumber(client *Client, repo ghrepo.Interface, number int) (*Pu
|
|||
login
|
||||
}
|
||||
state
|
||||
createdAt
|
||||
publishedAt
|
||||
}
|
||||
totalCount
|
||||
}
|
||||
|
|
@ -497,8 +492,6 @@ func PullRequestForBranch(client *Client, repo ghrepo.Interface, baseBranch, hea
|
|||
login
|
||||
}
|
||||
state
|
||||
createdAt
|
||||
publishedAt
|
||||
}
|
||||
totalCount
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import (
|
|||
"fmt"
|
||||
"io"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
|
|
@ -411,17 +412,20 @@ func prReviewerList(pr api.PullRequest) string {
|
|||
reviewerStates := parseReviewers(pr)
|
||||
reviewers := make([]string, 0, len(reviewerStates))
|
||||
|
||||
sortReviewerStates(reviewerStates)
|
||||
|
||||
for _, reviewer := range reviewerStates {
|
||||
stateColorFunc := colorFuncForReviewerState(reviewer.State)
|
||||
reviewers = append(reviewers, fmt.Sprintf("%s (%s)", reviewer.Name, stateColorFunc(strings.ReplaceAll(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 {
|
||||
func parseReviewers(pr api.PullRequest) []*reviewerState {
|
||||
var reviewerStates = map[string]*reviewerState{}
|
||||
|
||||
for _, review := range pr.Reviews.Nodes {
|
||||
|
|
@ -441,7 +445,29 @@ func parseReviewers(pr api.PullRequest) map[string]*reviewerState {
|
|||
}
|
||||
}
|
||||
|
||||
return reviewerStates
|
||||
// Convert map to slice for ease of sort
|
||||
result := []*reviewerState{}
|
||||
for _, reviewer := range reviewerStates {
|
||||
result = append(result, reviewer)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// sortReviewerStates puts completed reviews before review requests and sort names alphabetically
|
||||
func sortReviewerStates(reviewerStates []*reviewerState) {
|
||||
sort.Slice(reviewerStates, func(i, j int) bool {
|
||||
if reviewerStates[i].State == requestedReviewState &&
|
||||
reviewerStates[j].State != requestedReviewState {
|
||||
return false
|
||||
}
|
||||
if reviewerStates[j].State == requestedReviewState &&
|
||||
reviewerStates[i].State != requestedReviewState {
|
||||
return true
|
||||
}
|
||||
|
||||
return reviewerStates[i].Name < reviewerStates[j].Name
|
||||
})
|
||||
}
|
||||
|
||||
func prAssigneeList(pr api.PullRequest) string {
|
||||
|
|
|
|||
|
|
@ -427,6 +427,7 @@ func TestPRView_Preview(t *testing.T) {
|
|||
expectedOutputs: []string{
|
||||
`Blueberries are from a fork`,
|
||||
`Open • nobody wants to merge 12 commits into master from blueberries`,
|
||||
`Reviewers: 2 \(Approved\), 3 \(Commented\), 1 \(Requested\)\n`,
|
||||
`Assignees: marseilles, monaco\n`,
|
||||
`Labels: one, two, three, four, five\n`,
|
||||
`Projects: Project 1 \(column A\), Project 2 \(column B\), Project 3 \(column C\)\n`,
|
||||
|
|
@ -435,6 +436,17 @@ func TestPRView_Preview(t *testing.T) {
|
|||
`View this pull request on GitHub: https://github.com/OWNER/REPO/pull/12\n`,
|
||||
},
|
||||
},
|
||||
"Open PR with reviewers by number": {
|
||||
ownerRepo: "master",
|
||||
args: "pr view 12",
|
||||
fixture: "../test/fixtures/prViewPreviewWithReviewersByNumber.json",
|
||||
expectedOutputs: []string{
|
||||
`Blueberries are from a fork`,
|
||||
`Reviewers: DEF \(Commented\), def \(Changes requested\), xyz \(Approved\), 123 \(Requested\), abc \(Requested\)\n`,
|
||||
`blueberries taste good`,
|
||||
`View this pull request on GitHub: https://github.com/OWNER/REPO/pull/12\n`,
|
||||
},
|
||||
},
|
||||
"Open PR with metadata by branch": {
|
||||
ownerRepo: "master",
|
||||
args: "pr view blueberries",
|
||||
|
|
|
|||
|
|
@ -10,6 +10,39 @@
|
|||
"author": {
|
||||
"login": "nobody"
|
||||
},
|
||||
"reviewRequests": {
|
||||
"nodes": [
|
||||
{
|
||||
"requestedReviewer": {
|
||||
"__typename": "user",
|
||||
"login": "1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"totalcount": 1
|
||||
},
|
||||
"reviews": {
|
||||
"nodes": [
|
||||
{
|
||||
"author": {
|
||||
"login": "3"
|
||||
},
|
||||
"state": "COMMENTED"
|
||||
},
|
||||
{
|
||||
"author": {
|
||||
"login": "2"
|
||||
},
|
||||
"state": "APPROVED"
|
||||
},
|
||||
{
|
||||
"author": {
|
||||
"login": "1"
|
||||
},
|
||||
"state": "CHANGES_REQUESTED"
|
||||
}
|
||||
]
|
||||
},
|
||||
"assignees": {
|
||||
"nodes": [
|
||||
{
|
||||
|
|
|
|||
98
test/fixtures/prViewPreviewWithReviewersByNumber.json
vendored
Normal file
98
test/fixtures/prViewPreviewWithReviewersByNumber.json
vendored
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
{
|
||||
"data": {
|
||||
"repository": {
|
||||
"pullRequest": {
|
||||
"number": 12,
|
||||
"title": "Blueberries are from a fork",
|
||||
"state": "OPEN",
|
||||
"body": "**blueberries taste good**",
|
||||
"url": "https://github.com/OWNER/REPO/pull/12",
|
||||
"author": {
|
||||
"login": "nobody"
|
||||
},
|
||||
"reviewRequests": {
|
||||
"nodes": [
|
||||
{
|
||||
"requestedReviewer": {
|
||||
"__typename": "user",
|
||||
"login": "123"
|
||||
}
|
||||
},
|
||||
{
|
||||
"requestedReviewer": {
|
||||
"__typename": "user",
|
||||
"login": "abc"
|
||||
}
|
||||
}
|
||||
],
|
||||
"totalcount": 1
|
||||
},
|
||||
"reviews": {
|
||||
"nodes": [
|
||||
{
|
||||
"author": {
|
||||
"login": "123"
|
||||
},
|
||||
"state": "COMMENTED"
|
||||
},
|
||||
{
|
||||
"author": {
|
||||
"login": "def"
|
||||
},
|
||||
"state": "CHANGES_REQUESTED"
|
||||
},
|
||||
{
|
||||
"author": {
|
||||
"login": "abc"
|
||||
},
|
||||
"state": "APPROVED"
|
||||
},
|
||||
{
|
||||
"author": {
|
||||
"login": "DEF"
|
||||
},
|
||||
"state": "COMMENTED"
|
||||
},
|
||||
{
|
||||
"author": {
|
||||
"login": "xyz"
|
||||
},
|
||||
"state": "APPROVED"
|
||||
}
|
||||
]
|
||||
},
|
||||
"assignees": {
|
||||
"nodes": [],
|
||||
"totalcount": 0
|
||||
},
|
||||
"labels": {
|
||||
"nodes": [],
|
||||
"totalcount": 0
|
||||
},
|
||||
"projectcards": {
|
||||
"nodes": [],
|
||||
"totalcount": 0
|
||||
},
|
||||
"milestone": {},
|
||||
"participants": {
|
||||
"nodes": [
|
||||
{
|
||||
"login": "marseilles"
|
||||
}
|
||||
],
|
||||
"totalcount": 1
|
||||
},
|
||||
"commits": {
|
||||
"totalCount": 12
|
||||
},
|
||||
"baseRefName": "master",
|
||||
"headRefName": "blueberries",
|
||||
"headRepositoryOwner": {
|
||||
"login": "hubot"
|
||||
},
|
||||
"isCrossRepository": true,
|
||||
"isDraft": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue