Skip to content

Commit 1260d96

Browse files
Thomas StrombergThomas Stromberg
authored andcommitted
refactor reviewers to preserve state
1 parent 4909e1a commit 1260d96

File tree

3 files changed

+58
-11
lines changed

3 files changed

+58
-11
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ type PullRequest struct {
110110
Additions int `json:"additions"`
111111
Deletions int `json:"deletions"`
112112
ChangedFiles int `json:"changed_files"`
113-
Assignees []string `json:"assignees,omitempty"`
114-
RequestedReviewers []string `json:"requested_reviewers,omitempty"`
115-
Labels []string `json:"labels,omitempty"`
113+
Assignees []string `json:"assignees,omitempty"`
114+
Reviewers map[string]ReviewState `json:"reviewers,omitempty"`
115+
Labels []string `json:"labels,omitempty"`
116116
TestSummary *TestSummary `json:"test_summary,omitempty"`
117117
CheckSummary *CheckSummary `json:"check_summary,omitempty"`
118118
}

pkg/prx/graphql_complete.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,18 +1028,54 @@ func (c *Client) convertGraphQLToPullRequest(ctx context.Context, data *graphQLP
10281028
pr.Labels = append(pr.Labels, label.Name)
10291029
}
10301030

1031-
// Requested reviewers
1031+
// Build reviewers map from review requests and actual reviews
1032+
pr.Reviewers = buildReviewersMap(data)
1033+
1034+
return pr
1035+
}
1036+
1037+
// buildReviewersMap constructs a map of reviewer login to their review state.
1038+
// It combines data from review requests (pending) and actual reviews (approved/changes_requested/commented).
1039+
func buildReviewersMap(data *graphQLPullRequestComplete) map[string]ReviewState {
1040+
reviewers := make(map[string]ReviewState)
1041+
1042+
// First, add all requested reviewers as pending
10321043
for _, request := range data.ReviewRequests.Nodes {
10331044
reviewer := request.RequestedReviewer
10341045
// Teams have "name", users have "login"
10351046
if reviewer.Login != "" {
1036-
pr.RequestedReviewers = append(pr.RequestedReviewers, reviewer.Login)
1047+
reviewers[reviewer.Login] = ReviewStatePending
10371048
} else if reviewer.Name != "" {
1038-
pr.RequestedReviewers = append(pr.RequestedReviewers, reviewer.Name)
1049+
reviewers[reviewer.Name] = ReviewStatePending
10391050
}
10401051
}
10411052

1042-
return pr
1053+
// Then, update with actual review states (latest review wins)
1054+
for i := range data.Reviews.Nodes {
1055+
review := &data.Reviews.Nodes[i]
1056+
if review.Author.Login == "" {
1057+
continue
1058+
}
1059+
1060+
// Map GraphQL review state to our ReviewState
1061+
var state ReviewState
1062+
switch strings.ToUpper(review.State) {
1063+
case "APPROVED":
1064+
state = ReviewStateApproved
1065+
case "CHANGES_REQUESTED":
1066+
state = ReviewStateChangesRequested
1067+
case "COMMENTED":
1068+
state = ReviewStateCommented
1069+
default:
1070+
// Skip unknown states
1071+
continue
1072+
}
1073+
1074+
// Update the reviewer's state (latest review wins)
1075+
reviewers[review.Author.Login] = state
1076+
}
1077+
1078+
return reviewers
10431079
}
10441080

10451081
// convertGraphQLToEvents converts GraphQL data to Events.

pkg/prx/pullrequest.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@ const (
1414
TestStatePending = "pending" // Some tests are pending
1515
)
1616

17+
// ReviewState represents the current state of a reviewer's review.
18+
type ReviewState string
19+
20+
// Review state constants.
21+
const (
22+
ReviewStatePending ReviewState = "pending" // Review requested but not yet submitted
23+
ReviewStateApproved ReviewState = "approved" // Approved
24+
ReviewStateChangesRequested ReviewState = "changes_requested" // Changes requested
25+
ReviewStateCommented ReviewState = "commented" // Reviewed with comments only
26+
)
27+
1728
// PullRequest represents a GitHub pull request with its essential metadata.
1829
//
1930
//nolint:govet // fieldalignment: Struct fields ordered for JSON clarity and API compatibility
@@ -27,10 +38,10 @@ type PullRequest struct {
2738
ApprovalSummary *ApprovalSummary `json:"approval_summary,omitempty"`
2839
CheckSummary *CheckSummary `json:"check_summary,omitempty"`
2940
Mergeable *bool `json:"mergeable"`
30-
// 24-byte slice fields
31-
Assignees []string `json:"assignees,omitempty"`
32-
Labels []string `json:"labels,omitempty"`
33-
RequestedReviewers []string `json:"requested_reviewers,omitempty"`
41+
// 24-byte slice/map fields
42+
Assignees []string `json:"assignees,omitempty"`
43+
Labels []string `json:"labels,omitempty"`
44+
Reviewers map[string]ReviewState `json:"reviewers,omitempty"`
3445
// 16-byte string fields
3546
MergeableState string `json:"mergeable_state"`
3647
MergeableStateDescription string `json:"mergeable_state_description,omitempty"`

0 commit comments

Comments
 (0)