(httpClient *http.Client, prRefs PRFindRefs, stateFilters, fields []string)
| 384 | } |
| 385 | |
| 386 | func findForRefs(httpClient *http.Client, prRefs PRFindRefs, stateFilters, fields []string) (*api.PullRequest, error) { |
| 387 | type response struct { |
| 388 | Repository struct { |
| 389 | PullRequests struct { |
| 390 | Nodes []api.PullRequest |
| 391 | } |
| 392 | DefaultBranchRef struct { |
| 393 | Name string |
| 394 | } |
| 395 | } |
| 396 | } |
| 397 | |
| 398 | fieldSet := set.NewStringSet() |
| 399 | fieldSet.AddValues(fields) |
| 400 | // these fields are required for filtering below |
| 401 | fieldSet.AddValues([]string{"state", "baseRefName", "headRefName", "isCrossRepository", "headRepositoryOwner"}) |
| 402 | |
| 403 | query := fmt.Sprintf(` |
| 404 | query PullRequestForBranch($owner: String!, $repo: String!, $headRefName: String!, $states: [PullRequestState!]) { |
| 405 | repository(owner: $owner, name: $repo) { |
| 406 | pullRequests(headRefName: $headRefName, states: $states, first: 30, orderBy: { field: CREATED_AT, direction: DESC }) { |
| 407 | nodes {%s} |
| 408 | } |
| 409 | defaultBranchRef { name } |
| 410 | } |
| 411 | }`, api.PullRequestGraphQL(fieldSet.ToSlice())) |
| 412 | |
| 413 | variables := map[string]interface{}{ |
| 414 | "owner": prRefs.BaseRepo().RepoOwner(), |
| 415 | "repo": prRefs.BaseRepo().RepoName(), |
| 416 | "headRefName": prRefs.UnqualifiedHeadRef(), |
| 417 | "states": stateFilters, |
| 418 | } |
| 419 | |
| 420 | var resp response |
| 421 | client := api.NewClientFromHTTP(httpClient) |
| 422 | err := client.GraphQL(prRefs.BaseRepo().RepoHost(), query, variables, &resp) |
| 423 | if err != nil { |
| 424 | return nil, err |
| 425 | } |
| 426 | |
| 427 | prs := resp.Repository.PullRequests.Nodes |
| 428 | sort.SliceStable(prs, func(a, b int) bool { |
| 429 | return prs[a].State == "OPEN" && prs[b].State != "OPEN" |
| 430 | }) |
| 431 | |
| 432 | for _, pr := range prs { |
| 433 | // When the head is the default branch, it doesn't really make sense to show merged or closed PRs. |
| 434 | // https://github.com/cli/cli/issues/4263 |
| 435 | isNotClosedOrMergedWhenHeadIsDefault := pr.State == "OPEN" || resp.Repository.DefaultBranchRef.Name != prRefs.QualifiedHeadRef() |
| 436 | if prRefs.Matches(pr.BaseRefName, pr.HeadLabel()) && isNotClosedOrMergedWhenHeadIsDefault { |
| 437 | return &pr, nil |
| 438 | } |
| 439 | } |
| 440 | |
| 441 | return nil, &NotFoundError{fmt.Errorf("no pull requests found for branch %q", prRefs.QualifiedHeadRef())} |
| 442 | } |
| 443 |
no test coverage detected