diff --git a/pkg/cmd/pr/merge/merge.go b/pkg/cmd/pr/merge/merge.go index e3d1a14ee..6696fac85 100644 --- a/pkg/cmd/pr/merge/merge.go +++ b/pkg/cmd/pr/merge/merge.go @@ -241,7 +241,14 @@ 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 { + return fmt.Errorf("%s Cannot use `-d` or `--delete-branch` when merge queue enabled", m.cs.FailureIcon()) + } + // 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..f1c2e37fe 100644 --- a/pkg/cmd/pr/merge/merge_test.go +++ b/pkg/cmd/pr/merge/merge_test.go @@ -659,6 +659,29 @@ 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"), + ) + + _, err := runCommand(http, nil, "blueberries", true, `pr merge --merge --delete-branch`) + assert.Contains(t, err.Error(), "X Cannot use `-d` or `--delete-branch` when merge queue enabled") +} + func TestPrMerge_deleteBranch_nonDefault(t *testing.T) { http := initFakeHTTP() defer http.Verify(t)