diff --git a/pkg/cmd/pr/merge/http.go b/pkg/cmd/pr/merge/http.go index f6c3d4c08..ad1a9a78a 100644 --- a/pkg/cmd/pr/merge/http.go +++ b/pkg/cmd/pr/merge/http.go @@ -69,7 +69,7 @@ func mergePullRequest(client *http.Client, payload mergePayload) error { if payload.auto { var mutation struct { - AnablePullRequestAutoMerge struct { + EnablePullRequestAutoMerge struct { ClientMutationId string } `graphql:"enablePullRequestAutoMerge(input: $input)"` } diff --git a/pkg/cmd/pr/merge/merge.go b/pkg/cmd/pr/merge/merge.go index e204ce6cd..f2923573c 100644 --- a/pkg/cmd/pr/merge/merge.go +++ b/pkg/cmd/pr/merge/merge.go @@ -32,7 +32,7 @@ type MergeOptions struct { DeleteBranch bool MergeMethod PullRequestMergeMethod - AutoMerge bool + AutoMergeEnable bool AutoMergeDisable bool Body string @@ -115,7 +115,7 @@ func NewCmdMerge(f *cmdutil.Factory, runF func(*MergeOptions) error) *cobra.Comm cmd.Flags().BoolVarP(&flagMerge, "merge", "m", false, "Merge the commits with the base branch") cmd.Flags().BoolVarP(&flagRebase, "rebase", "r", false, "Rebase the commits onto the base branch") cmd.Flags().BoolVarP(&flagSquash, "squash", "s", false, "Squash the commits into one commit and merge it into the base branch") - cmd.Flags().BoolVar(&opts.AutoMerge, "auto", false, "Automatically merge only after necessary requirements are met") + cmd.Flags().BoolVar(&opts.AutoMergeEnable, "auto", false, "Automatically merge only after necessary requirements are met") cmd.Flags().BoolVar(&opts.AutoMergeDisable, "disable-auto", false, "Disable auto-merge for this pull request") return cmd } @@ -171,7 +171,7 @@ func mergeRun(opts *MergeOptions) error { repo: baseRepo, pullRequestID: pr.ID, method: opts.MergeMethod, - auto: opts.AutoMerge, + auto: opts.AutoMergeEnable, commitBody: opts.Body, setCommitBody: opts.BodySet, } @@ -254,7 +254,7 @@ func mergeRun(opts *MergeOptions) error { fmt.Fprintf(opts.IO.ErrOut, "%s %s pull request #%d (%s)\n", cs.SuccessIconWithColor(cs.Magenta), action, pr.Number, pr.Title) } } - } else if !opts.IsDeleteBranchIndicated && opts.InteractiveMode && !crossRepoPR && !opts.AutoMerge { + } else if !opts.IsDeleteBranchIndicated && opts.InteractiveMode && !crossRepoPR && !opts.AutoMergeEnable { err := prompt.SurveyAskOne(&survey.Confirm{ Message: fmt.Sprintf("Pull request #%d was already merged. Delete the branch locally?", pr.Number), Default: false, @@ -266,7 +266,7 @@ func mergeRun(opts *MergeOptions) error { fmt.Fprintf(opts.IO.ErrOut, "%s Pull request #%d was already merged\n", cs.WarningIcon(), pr.Number) } - if !deleteBranch || crossRepoPR || opts.AutoMerge { + if !deleteBranch || crossRepoPR || opts.AutoMergeEnable { return nil } diff --git a/pkg/cmd/pr/merge/merge_test.go b/pkg/cmd/pr/merge/merge_test.go index 38d66f909..90e8d69c2 100644 --- a/pkg/cmd/pr/merge/merge_test.go +++ b/pkg/cmd/pr/merge/merge_test.go @@ -801,3 +801,87 @@ func Test_mergeMethodSurvey(t *testing.T) { assert.Nil(t, err) assert.Equal(t, PullRequestMergeMethodRebase, method) } + +func TestMergeRun_autoMerge(t *testing.T) { + io, _, stdout, stderr := iostreams.Test() + io.SetStdoutTTY(true) + io.SetStderrTTY(true) + + tr := initFakeHTTP() + defer tr.Verify(t) + + tr.Register( + httpmock.GraphQL(`query PullRequestByNumber\b`), + httpmock.StringResponse(` + { "data": { "repository": { "pullRequest": { + "id": "THE-ID", + "number": 123, + "title": "The title of the PR", + "state": "OPEN", + "headRefName": "blueberries", + "headRepositoryOwner": {"login": "OWNER"} + } } } }`)) + tr.Register( + httpmock.GraphQL(`mutation PullRequestAutoMerge\b`), + httpmock.GraphQLMutation(`{}`, func(input map[string]interface{}) { + assert.Equal(t, "THE-ID", input["pullRequestId"].(string)) + assert.Equal(t, "SQUASH", input["mergeMethod"].(string)) + })) + + _, cmdTeardown := run.Stub() + defer cmdTeardown(t) + + err := mergeRun(&MergeOptions{ + IO: io, + HttpClient: func() (*http.Client, error) { + return &http.Client{Transport: tr}, nil + }, + SelectorArg: "https://github.com/OWNER/REPO/pull/123", + AutoMergeEnable: true, + MergeMethod: PullRequestMergeMethodSquash, + }) + assert.NoError(t, err) + + assert.Equal(t, "", stdout.String()) + assert.Equal(t, "✓ Pull request #123 will be automatically merged via squash when all requirements are met\n", stderr.String()) +} + +func TestMergeRun_disableAutoMerge(t *testing.T) { + io, _, stdout, stderr := iostreams.Test() + io.SetStdoutTTY(true) + io.SetStderrTTY(true) + + tr := initFakeHTTP() + defer tr.Verify(t) + + tr.Register( + httpmock.GraphQL(`query PullRequestByNumber\b`), + httpmock.StringResponse(` + { "data": { "repository": { "pullRequest": { + "id": "THE-ID", + "number": 123, + "title": "The title of the PR", + "state": "OPEN", + "headRefName": "blueberries", + "headRepositoryOwner": {"login": "OWNER"} + } } } }`)) + tr.Register( + httpmock.GraphQL(`mutation PullRequestAutoMergeDisable\b`), + httpmock.StringResponse(`{}`)) + + _, cmdTeardown := run.Stub() + defer cmdTeardown(t) + + err := mergeRun(&MergeOptions{ + IO: io, + HttpClient: func() (*http.Client, error) { + return &http.Client{Transport: tr}, nil + }, + SelectorArg: "https://github.com/OWNER/REPO/pull/123", + AutoMergeDisable: true, + }) + assert.NoError(t, err) + + assert.Equal(t, "", stdout.String()) + assert.Equal(t, "✓ Auto-merge disabled for pull request #123\n", stderr.String()) +}