@@ -2,6 +2,7 @@ package api
22
33import (
44 "fmt"
5+ "strings"
56)
67
78type PullRequestsPayload struct {
@@ -116,7 +117,7 @@ type Repo interface {
116117 RepoOwner () string
117118}
118119
119- func PullRequests (client * Client , ghRepo Repo , currentBranch , currentUsername string ) (* PullRequestsPayload , error ) {
120+ func PullRequests (client * Client , ghRepo Repo , currentPRNumber int , currentPRHeadRef , currentUsername string ) (* PullRequestsPayload , error ) {
120121 type edges struct {
121122 Edges []struct {
122123 Node PullRequest
@@ -130,18 +131,18 @@ func PullRequests(client *Client, ghRepo Repo, currentBranch, currentUsername st
130131 type response struct {
131132 Repository struct {
132133 PullRequests edges
134+ PullRequest * PullRequest
133135 }
134136 ViewerCreated edges
135137 ReviewRequested edges
136138 }
137139
138- query := `
140+ fragments := `
139141 fragment pr on PullRequest {
140142 number
141143 title
142144 url
143145 headRefName
144- headRefName
145146 headRepositoryOwner {
146147 login
147148 }
@@ -170,16 +171,32 @@ func PullRequests(client *Client, ghRepo Repo, currentBranch, currentUsername st
170171 ...pr
171172 reviewDecision
172173 }
173- query($owner: String!, $repo: String!, $headRefName: String!, $viewerQuery: String!, $reviewerQuery: String!, $per_page: Int = 10) {
174- repository(owner: $owner, name: $repo) {
175- pullRequests(headRefName: $headRefName, states: OPEN, first: 1) {
176- edges {
177- node {
178- ...prWithReviews
179- }
180- }
181- }
182- }
174+ `
175+
176+ queryPrefix := `
177+ query($owner: String!, $repo: String!, $headRefName: String!, $viewerQuery: String!, $reviewerQuery: String!, $per_page: Int = 10) {
178+ repository(owner: $owner, name: $repo) {
179+ pullRequests(headRefName: $headRefName, states: OPEN, first: $per_page) {
180+ edges {
181+ node {
182+ ...prWithReviews
183+ }
184+ }
185+ }
186+ }
187+ `
188+ if currentPRNumber > 0 {
189+ queryPrefix = `
190+ query($owner: String!, $repo: String!, $number: Int!, $viewerQuery: String!, $reviewerQuery: String!, $per_page: Int = 10) {
191+ repository(owner: $owner, name: $repo) {
192+ pullRequest(number: $number) {
193+ ...prWithReviews
194+ }
195+ }
196+ `
197+ }
198+
199+ query := fragments + queryPrefix + `
183200 viewerCreated: search(query: $viewerQuery, type: ISSUE, first: $per_page) {
184201 edges {
185202 node {
@@ -201,20 +218,26 @@ func PullRequests(client *Client, ghRepo Repo, currentBranch, currentUsername st
201218 }
202219 }
203220 }
204- `
221+ `
205222
206223 owner := ghRepo .RepoOwner ()
207224 repo := ghRepo .RepoName ()
208225
209226 viewerQuery := fmt .Sprintf ("repo:%s/%s state:open is:pr author:%s" , owner , repo , currentUsername )
210227 reviewerQuery := fmt .Sprintf ("repo:%s/%s state:open review-requested:%s" , owner , repo , currentUsername )
211228
229+ branchWithoutOwner := currentPRHeadRef
230+ if idx := strings .Index (currentPRHeadRef , ":" ); idx >= 0 {
231+ branchWithoutOwner = currentPRHeadRef [idx + 1 :]
232+ }
233+
212234 variables := map [string ]interface {}{
213235 "viewerQuery" : viewerQuery ,
214236 "reviewerQuery" : reviewerQuery ,
215237 "owner" : owner ,
216238 "repo" : repo ,
217- "headRefName" : currentBranch ,
239+ "headRefName" : branchWithoutOwner ,
240+ "number" : currentPRNumber ,
218241 }
219242
220243 var resp response
@@ -233,9 +256,13 @@ func PullRequests(client *Client, ghRepo Repo, currentBranch, currentUsername st
233256 reviewRequested = append (reviewRequested , edge .Node )
234257 }
235258
236- var currentPR * PullRequest
237- for _ , edge := range resp .Repository .PullRequests .Edges {
238- currentPR = & edge .Node
259+ var currentPR = resp .Repository .PullRequest
260+ if currentPR == nil {
261+ for _ , edge := range resp .Repository .PullRequests .Edges {
262+ if edge .Node .HeadLabel () == currentPRHeadRef {
263+ currentPR = & edge .Node
264+ }
265+ }
239266 }
240267
241268 payload := PullRequestsPayload {
@@ -289,36 +316,42 @@ func PullRequestByNumber(client *Client, ghRepo Repo, number int) (*PullRequest,
289316 return & resp .Repository .PullRequest , nil
290317}
291318
292- func PullRequestsForBranch (client * Client , ghRepo Repo , branch string ) ([] PullRequest , error ) {
319+ func PullRequestForBranch (client * Client , ghRepo Repo , branch string ) (* PullRequest , error ) {
293320 type response struct {
294321 Repository struct {
295322 PullRequests struct {
296- Edges []struct {
297- Node PullRequest
298- }
323+ Nodes []PullRequest
299324 }
300325 }
301326 }
302327
303328 query := `
304- query($owner: String!, $repo: String!, $headRefName: String!) {
305- repository(owner: $owner, name: $repo) {
306- pullRequests(headRefName: $headRefName, states: OPEN, first: 1) {
307- edges {
308- node {
309- number
310- title
311- url
312- }
313- }
314- }
315- }
316- }`
329+ query($owner: String!, $repo: String!, $headRefName: String!) {
330+ repository(owner: $owner, name: $repo) {
331+ pullRequests(headRefName: $headRefName, states: OPEN, first: 30) {
332+ nodes {
333+ number
334+ title
335+ url
336+ headRefName
337+ headRepositoryOwner {
338+ login
339+ }
340+ isCrossRepository
341+ }
342+ }
343+ }
344+ }`
345+
346+ branchWithoutOwner := branch
347+ if idx := strings .Index (branch , ":" ); idx >= 0 {
348+ branchWithoutOwner = branch [idx + 1 :]
349+ }
317350
318351 variables := map [string ]interface {}{
319352 "owner" : ghRepo .RepoOwner (),
320353 "repo" : ghRepo .RepoName (),
321- "headRefName" : branch ,
354+ "headRefName" : branchWithoutOwner ,
322355 }
323356
324357 var resp response
@@ -327,12 +360,13 @@ func PullRequestsForBranch(client *Client, ghRepo Repo, branch string) ([]PullRe
327360 return nil , err
328361 }
329362
330- prs := []PullRequest {}
331- for _ , edge := range resp .Repository .PullRequests .Edges {
332- prs = append (prs , edge .Node )
363+ for _ , pr := range resp .Repository .PullRequests .Nodes {
364+ if pr .HeadLabel () == branch {
365+ return & pr , nil
366+ }
333367 }
334368
335- return prs , nil
369+ return nil , fmt . Errorf ( "no open pull requests found for branch %q" , branch )
336370}
337371
338372func CreatePullRequest (client * Client , ghRepo Repo , params map [string ]interface {}) (* PullRequest , error ) {
0 commit comments