X Tutup
Skip to content

Commit 39bd9aa

Browse files
authored
pr merge: allow deleting remote branch if local branch does not exist (cli#4769)
1 parent 4866bec commit 39bd9aa

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

pkg/cmd/pr/merge/merge.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,10 @@ func mergeRun(opts *MergeOptions) error {
216216
deleteBranch := opts.DeleteBranch
217217
crossRepoPR := pr.HeadRepositoryOwner.Login != baseRepo.RepoOwner()
218218
autoMerge := opts.AutoMergeEnable && !isImmediatelyMergeable(pr.MergeStateStatus)
219+
localBranchExists := false
220+
if opts.CanDeleteLocalBranch {
221+
localBranchExists = git.HasLocalBranch(pr.HeadRefName)
222+
}
219223

220224
if !isPRAlreadyMerged {
221225
payload := mergePayload{
@@ -236,7 +240,7 @@ func mergeRun(opts *MergeOptions) error {
236240
if err != nil {
237241
return err
238242
}
239-
deleteBranch, err = deleteBranchSurvey(opts, crossRepoPR)
243+
deleteBranch, err = deleteBranchSurvey(opts, crossRepoPR, localBranchExists)
240244
if err != nil {
241245
return err
242246
}
@@ -317,7 +321,7 @@ func mergeRun(opts *MergeOptions) error {
317321

318322
branchSwitchString := ""
319323

320-
if opts.CanDeleteLocalBranch {
324+
if opts.CanDeleteLocalBranch && localBranchExists {
321325
currentBranch, err := opts.Branch()
322326
if err != nil {
323327
return err
@@ -335,20 +339,15 @@ func mergeRun(opts *MergeOptions) error {
335339
}
336340
}
337341

338-
localBranchExists := git.HasLocalBranch(pr.HeadRefName)
339-
if localBranchExists {
340-
err = git.DeleteLocalBranch(pr.HeadRefName)
341-
if err != nil {
342-
err = fmt.Errorf("failed to delete local branch %s: %w", cs.Cyan(pr.HeadRefName), err)
343-
return err
344-
}
342+
if err := git.DeleteLocalBranch(pr.HeadRefName); err != nil {
343+
err = fmt.Errorf("failed to delete local branch %s: %w", cs.Cyan(pr.HeadRefName), err)
344+
return err
345345
}
346346

347347
if branchToSwitchTo != "" {
348348
branchSwitchString = fmt.Sprintf(" and switched to branch %s", cs.Cyan(branchToSwitchTo))
349349
}
350350
}
351-
352351
if !isPRAlreadyMerged {
353352
err = api.BranchDeleteRemote(apiClient, baseRepo, pr.HeadRefName)
354353
var httpErr api.HTTPError
@@ -401,10 +400,10 @@ func mergeMethodSurvey(baseRepo *api.Repository) (PullRequestMergeMethod, error)
401400
return mergeOpts[result].method, err
402401
}
403402

404-
func deleteBranchSurvey(opts *MergeOptions, crossRepoPR bool) (bool, error) {
403+
func deleteBranchSurvey(opts *MergeOptions, crossRepoPR, localBranchExists bool) (bool, error) {
405404
if !crossRepoPR && !opts.IsDeleteBranchIndicated {
406405
var message string
407-
if opts.CanDeleteLocalBranch {
406+
if opts.CanDeleteLocalBranch && localBranchExists {
408407
message = "Delete the branch locally and on GitHub?"
409408
} else {
410409
message = "Delete the branch on GitHub?"

pkg/cmd/pr/merge/merge_test.go

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,11 @@ func TestPrMerge(t *testing.T) {
274274
assert.NotContains(t, input, "commitHeadline")
275275
}))
276276

277-
_, cmdTeardown := run.Stub()
277+
cs, cmdTeardown := run.Stub()
278278
defer cmdTeardown(t)
279279

280+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
281+
280282
output, err := runCommand(http, "master", true, "pr merge 1 --merge")
281283
if err != nil {
282284
t.Fatalf("error running command `pr merge`: %v", err)
@@ -343,9 +345,11 @@ func TestPrMerge_nontty(t *testing.T) {
343345
assert.NotContains(t, input, "commitHeadline")
344346
}))
345347

346-
_, cmdTeardown := run.Stub()
348+
cs, cmdTeardown := run.Stub()
347349
defer cmdTeardown(t)
348350

351+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
352+
349353
output, err := runCommand(http, "master", false, "pr merge 1 --merge")
350354
if err != nil {
351355
t.Fatalf("error running command `pr merge`: %v", err)
@@ -515,6 +519,7 @@ func Test_nonDivergingPullRequest(t *testing.T) {
515519
defer cmdTeardown(t)
516520

517521
cs.Register(`git .+ show .+ HEAD`, 0, "COMMITSHA1,title")
522+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
518523

519524
output, err := runCommand(http, "blueberries", true, "pr merge --merge")
520525
if err != nil {
@@ -554,6 +559,7 @@ func Test_divergingPullRequestWarning(t *testing.T) {
554559
defer cmdTeardown(t)
555560

556561
cs.Register(`git .+ show .+ HEAD`, 0, "COMMITSHA2,title")
562+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
557563

558564
output, err := runCommand(http, "blueberries", true, "pr merge --merge")
559565
if err != nil {
@@ -590,9 +596,11 @@ func Test_pullRequestWithoutCommits(t *testing.T) {
590596
assert.NotContains(t, input, "commitHeadline")
591597
}))
592598

593-
_, cmdTeardown := run.Stub()
599+
cs, cmdTeardown := run.Stub()
594600
defer cmdTeardown(t)
595601

602+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
603+
596604
output, err := runCommand(http, "blueberries", true, "pr merge --merge")
597605
if err != nil {
598606
t.Fatalf("error running command `pr merge`: %v", err)
@@ -627,9 +635,11 @@ func TestPrMerge_rebase(t *testing.T) {
627635
assert.NotContains(t, input, "commitHeadline")
628636
}))
629637

630-
_, cmdTeardown := run.Stub()
638+
cs, cmdTeardown := run.Stub()
631639
defer cmdTeardown(t)
632640

641+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
642+
633643
output, err := runCommand(http, "master", true, "pr merge 2 --rebase")
634644
if err != nil {
635645
t.Fatalf("error running command `pr merge`: %v", err)
@@ -666,9 +676,11 @@ func TestPrMerge_squash(t *testing.T) {
666676
assert.NotContains(t, input, "commitHeadline")
667677
}))
668678

669-
_, cmdTeardown := run.Stub()
679+
cs, cmdTeardown := run.Stub()
670680
defer cmdTeardown(t)
671681

682+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
683+
672684
output, err := runCommand(http, "master", true, "pr merge 3 --squash")
673685
if err != nil {
674686
t.Fatalf("error running command `pr merge`: %v", err)
@@ -730,9 +742,11 @@ func TestPrMerge_alreadyMerged_nonInteractive(t *testing.T) {
730742
baseRepo("OWNER", "REPO", "master"),
731743
)
732744

733-
_, cmdTeardown := run.Stub()
745+
cs, cmdTeardown := run.Stub()
734746
defer cmdTeardown(t)
735747

748+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
749+
736750
output, err := runCommand(http, "blueberries", true, "pr merge 4 --merge")
737751
if err != nil {
738752
t.Fatalf("Got unexpected error running `pr merge` %s", err)
@@ -774,9 +788,11 @@ func TestPRMerge_interactive(t *testing.T) {
774788
assert.NotContains(t, input, "commitHeadline")
775789
}))
776790

777-
_, cmdTeardown := run.Stub()
791+
cs, cmdTeardown := run.Stub()
778792
defer cmdTeardown(t)
779793

794+
cs.Register(`git rev-parse --verify refs/heads/blueberries`, 0, "")
795+
780796
as, surveyTeardown := prompt.InitAskStubber()
781797
defer surveyTeardown()
782798

@@ -932,9 +948,11 @@ func TestPRMerge_interactiveCancelled(t *testing.T) {
932948
"squashMergeAllowed": true
933949
} } }`))
934950

935-
_, cmdTeardown := run.Stub()
951+
cs, cmdTeardown := run.Stub()
936952
defer cmdTeardown(t)
937953

954+
cs.Register(`git rev-parse --verify refs/heads/`, 0, "")
955+
938956
as, surveyTeardown := prompt.InitAskStubber()
939957
defer surveyTeardown()
940958

0 commit comments

Comments
 (0)
X Tutup