diff --git a/internal/featuredetection/feature_detection.go b/internal/featuredetection/feature_detection.go index 17254bb4f..45800a8d7 100644 --- a/internal/featuredetection/feature_detection.go +++ b/internal/featuredetection/feature_detection.go @@ -24,12 +24,14 @@ type PullRequestFeatures struct { ReviewDecision bool StatusCheckRollup bool BranchProtectionRule bool + MergeQueue bool } var allPullRequestFeatures = PullRequestFeatures{ ReviewDecision: true, StatusCheckRollup: true, BranchProtectionRule: true, + MergeQueue: true, } type RepositoryFeatures struct { @@ -74,7 +76,34 @@ func (d *detector) PullRequestFeatures() (PullRequestFeatures, error) { return allPullRequestFeatures, nil } - return allPullRequestFeatures, nil + features := PullRequestFeatures{ + ReviewDecision: true, + StatusCheckRollup: true, + BranchProtectionRule: true, + } + + var featureDetection struct { + PullRequest struct { + Fields []struct { + Name string + } `graphql:"fields(includeDeprecated: true)"` + } `graphql:"PullRequest: __type(name: \"PullRequest\")"` + } + + gql := graphql.NewClient(ghinstance.GraphQLEndpoint(d.host), d.httpClient) + + err := gql.QueryNamed(context.Background(), "PullRequest_fields", &featureDetection, nil) + if err != nil { + return features, err + } + + for _, field := range featureDetection.PullRequest.Fields { + if field.Name == "isInMergeQueue" { + features.MergeQueue = true + } + } + + return features, nil } func (d *detector) RepositoryFeatures() (RepositoryFeatures, error) { diff --git a/internal/featuredetection/feature_detection_test.go b/internal/featuredetection/feature_detection_test.go index b7aa2673f..ae8695482 100644 --- a/internal/featuredetection/feature_detection_test.go +++ b/internal/featuredetection/feature_detection_test.go @@ -24,16 +24,26 @@ func TestPullRequestFeatures(t *testing.T) { ReviewDecision: true, StatusCheckRollup: true, BranchProtectionRule: true, + MergeQueue: true, }, wantErr: false, }, { name: "GHE", hostname: "git.my.org", + queryResponse: map[string]string{ + `query PullRequest_fields\b`: heredoc.Doc(` + { "data": { "PullRequest": { "fields": [ + {"name": "isInMergeQueue"}, + {"name": "isMergeQueueEnabled"} + ] } } } + `), + }, wantFeatures: PullRequestFeatures{ ReviewDecision: true, StatusCheckRollup: true, BranchProtectionRule: true, + MergeQueue: true, }, wantErr: false, }, diff --git a/pkg/cmd/pr/shared/finder.go b/pkg/cmd/pr/shared/finder.go index 79d001027..a3c6fa721 100644 --- a/pkg/cmd/pr/shared/finder.go +++ b/pkg/cmd/pr/shared/finder.go @@ -14,6 +14,7 @@ import ( "github.com/cli/cli/v2/api" remotes "github.com/cli/cli/v2/context" "github.com/cli/cli/v2/git" + fd "github.com/cli/cli/v2/internal/featuredetection" "github.com/cli/cli/v2/internal/ghinstance" "github.com/cli/cli/v2/internal/ghrepo" "github.com/cli/cli/v2/pkg/cmdutil" @@ -139,6 +140,18 @@ func (f *finder) Find(opts FindOptions) (*api.PullRequest, ghrepo.Interface, err numberFieldOnly := fields.Len() == 1 && fields.Contains("number") fields.Add("id") // for additional preload queries below + if fields.Contains("isInMergeQueue") || fields.Contains("isMergeQueueEnabled") { + detector := fd.NewDetector(httpClient, f.repo.RepoHost()) + prFeatures, err := detector.PullRequestFeatures() + if err != nil { + return nil, nil, err + } + if !prFeatures.MergeQueue { + fields.Remove("isInMergeQueue") + fields.Remove("isMergeQueueEnabled") + } + } + var pr *api.PullRequest if f.prNumber > 0 { if numberFieldOnly {