MCPcopy
hub / github.com/cli/cli / findForRefs

Function findForRefs

pkg/cmd/pr/shared/finder.go:386–442  ·  view source on GitHub ↗
(httpClient *http.Client, prRefs PRFindRefs, stateFilters, fields []string)

Source from the content-addressed store, hash-verified

384}
385
386func 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

Callers 1

FindMethod · 0.85

Calls 15

NewStringSetFunction · 0.92
PullRequestGraphQLFunction · 0.92
NewClientFromHTTPFunction · 0.92
AddValuesMethod · 0.80
GraphQLMethod · 0.80
MatchesMethod · 0.80
HeadLabelMethod · 0.80
ToSliceMethod · 0.65
RepoOwnerMethod · 0.65
BaseRepoMethod · 0.65
RepoNameMethod · 0.65
UnqualifiedHeadRefMethod · 0.65

Tested by

no test coverage detected