diff --git a/pkg/cmd/pr/merge/merge.go b/pkg/cmd/pr/merge/merge.go index e3d1a14ee..d27943be5 100644 --- a/pkg/cmd/pr/merge/merge.go +++ b/pkg/cmd/pr/merge/merge.go @@ -241,7 +241,15 @@ func (m *mergeContext) warnIfDiverged() { // Check if the current state of the pull request allows for merging func (m *mergeContext) canMerge() error { if m.mergeQueueRequired { - // a pull request can always be added to the merge queue + // Requesting branch deletion on a PR with a merge queue + // policy is not allowed. Doing so can unexpectedly + // delete branches before merging, close the PR, and remove + // the PR from the merge queue. + if m.opts.DeleteBranch { + fmt.Fprintf(m.opts.IO.ErrOut, "%s Cannot use `-d` or `--delete-branch` when merge queue enabled\n", m.cs.FailureIcon()) + return cmdutil.SilentError + } + // Otherwise, a pull request can always be added to the merge queue return nil } diff --git a/pkg/cmd/pr/merge/merge_test.go b/pkg/cmd/pr/merge/merge_test.go index 21df882b4..9faadf7b9 100644 --- a/pkg/cmd/pr/merge/merge_test.go +++ b/pkg/cmd/pr/merge/merge_test.go @@ -659,6 +659,34 @@ func TestPrMerge_deleteBranch(t *testing.T) { `), output.Stderr()) } +func TestPrMerge_deleteBranch_mergeQueue(t *testing.T) { + http := initFakeHTTP() + defer http.Verify(t) + + shared.RunCommandFinder( + "", + &api.PullRequest{ + ID: "PR_10", + Number: 10, + State: "OPEN", + Title: "Blueberries are a good fruit", + HeadRefName: "blueberries", + BaseRefName: "main", + MergeStateStatus: "CLEAN", + IsMergeQueueEnabled: true, + }, + baseRepo("OWNER", "REPO", "main"), + ) + + output, err := runCommand(http, nil, "blueberries", true, `pr merge --merge --delete-branch`) + assert.ErrorIs(t, err, cmdutil.SilentError) + + assert.Equal(t, "", output.String()) + assert.Equal(t, heredoc.Docf(` + X Cannot use %[1]s-d%[1]s or %[1]s--delete-branch%[1]s when merge queue enabled + `, "`"), output.Stderr()) +} + func TestPrMerge_deleteBranch_nonDefault(t *testing.T) { http := initFakeHTTP() defer http.Verify(t)