diff --git a/api/queries_pr.go b/api/queries_pr.go index b18022ddb..d20e7baf9 100644 --- a/api/queries_pr.go +++ b/api/queries_pr.go @@ -88,8 +88,6 @@ type PullRequest struct { ReactionGroups ReactionGroups Reviews PullRequestReviews ReviewRequests ReviewRequests - - ViewerMergeBodyText string } type ReviewRequests struct { @@ -578,7 +576,6 @@ func PullRequestByNumber(client *Client, repo ghrepo.Interface, number int) (*Pu milestone{ title } - viewerMergeBodyText ` + commentsFragment() + ` ` + reactionGroupsFragment() + ` } diff --git a/pkg/cmd/pr/merge/http.go b/pkg/cmd/pr/merge/http.go index 7261be806..f6c3d4c08 100644 --- a/pkg/cmd/pr/merge/http.go +++ b/pkg/cmd/pr/merge/http.go @@ -3,6 +3,7 @@ package merge import ( "context" "net/http" + "strings" "github.com/cli/cli/internal/ghinstance" "github.com/cli/cli/internal/ghrepo" @@ -98,3 +99,40 @@ func disableAutoMerge(client *http.Client, repo ghrepo.Interface, prID string) e gql := graphql.NewClient(ghinstance.GraphQLEndpoint(repo.RepoHost()), client) return gql.MutateNamed(context.Background(), "PullRequestAutoMergeDisable", &mutation, variables) } + +func getMergeText(client *http.Client, repo ghrepo.Interface, prID string, mergeMethod PullRequestMergeMethod) (string, error) { + var method githubv4.PullRequestMergeMethod + switch mergeMethod { + case PullRequestMergeMethodMerge: + method = githubv4.PullRequestMergeMethodMerge + case PullRequestMergeMethodRebase: + method = githubv4.PullRequestMergeMethodRebase + case PullRequestMergeMethodSquash: + method = githubv4.PullRequestMergeMethodSquash + } + + var query struct { + Node struct { + PullRequest struct { + ViewerMergeBodyText string `graphql:"viewerMergeBodyText(mergeType: $method)"` + } `graphql:"...on PullRequest"` + } `graphql:"node(id: $prID)"` + } + + variables := map[string]interface{}{ + "prID": githubv4.ID(prID), + "method": method, + } + + gql := graphql.NewClient(ghinstance.GraphQLEndpoint(repo.RepoHost()), client) + err := gql.QueryNamed(context.Background(), "PullRequestMergeText", &query, variables) + if err != nil { + // Tolerate this API missing in older GitHub Enterprise + if strings.Contains(err.Error(), "Field 'viewerMergeBodyText' doesn't exist") { + return "", nil + } + return "", err + } + + return query.Node.PullRequest.ViewerMergeBodyText, nil +} diff --git a/pkg/cmd/pr/merge/merge.go b/pkg/cmd/pr/merge/merge.go index 61353c950..70509e787 100644 --- a/pkg/cmd/pr/merge/merge.go +++ b/pkg/cmd/pr/merge/merge.go @@ -204,11 +204,10 @@ func mergeRun(opts *MergeOptions) error { return err } - if payload.commitBody == "" { - if payload.method == PullRequestMergeMethodMerge { - payload.commitBody = pr.Title - } else { - payload.commitBody = pr.ViewerMergeBodyText + if !payload.setCommitBody { + payload.commitBody, err = getMergeText(httpClient, baseRepo, pr.ID, payload.method) + if err != nil { + return err } } diff --git a/pkg/cmd/pr/merge/merge_test.go b/pkg/cmd/pr/merge/merge_test.go index 2f71eda32..ad289a143 100644 --- a/pkg/cmd/pr/merge/merge_test.go +++ b/pkg/cmd/pr/merge/merge_test.go @@ -703,6 +703,12 @@ func TestPRMerge_interactiveSquashEditCommitMsg(t *testing.T) { "rebaseMergeAllowed": true, "squashMergeAllowed": true } } }`)) + http.Register( + httpmock.GraphQL(`query PullRequestMergeText\b`), + httpmock.StringResponse(` + { "data": { "node": { + "viewerMergeBodyText": "" + } } }`)) http.Register( httpmock.GraphQL(`mutation PullRequestMerge\b`), httpmock.GraphQLMutation(`{}`, func(input map[string]interface{}) {