@@ -1000,49 +1000,54 @@ func MergePullRequest(ctx *context.APIContext) {
10001000 }
10011001 log .Trace ("Pull request merged: %d" , pr .ID )
10021002
1003- if form .DeleteBranchAfterMerge {
1004- // Don't cleanup when there are other PR's that use this branch as head branch.
1005- exist , err := issues_model .HasUnmergedPullRequestsByHeadInfo (ctx , pr .HeadRepoID , pr .HeadBranch )
1006- if err != nil {
1007- ctx .ServerError ("HasUnmergedPullRequestsByHeadInfo" , err )
1008- return
1009- }
1010- if exist {
1011- ctx .Status (http .StatusOK )
1012- return
1013- }
1014-
1015- var headRepo * git.Repository
1016- if ctx .Repo != nil && ctx .Repo .Repository != nil && ctx .Repo .Repository .ID == pr .HeadRepoID && ctx .Repo .GitRepo != nil {
1017- headRepo = ctx .Repo .GitRepo
1018- } else {
1019- headRepo , err = gitrepo .OpenRepository (ctx , pr .HeadRepo )
1003+ // for agit flow, we should not delete the agit reference after merge
1004+ if form .DeleteBranchAfterMerge && pr .Flow == issues_model .PullRequestFlowGithub {
1005+ // check permission even it has been checked in repo_service.DeleteBranch so that we don't need to
1006+ // do RetargetChildrenOnMerge
1007+ if err := repo_service .CanDeleteBranch (ctx , pr .HeadRepo , pr .HeadBranch , ctx .Doer ); err == nil {
1008+ // Don't cleanup when there are other PR's that use this branch as head branch.
1009+ exist , err := issues_model .HasUnmergedPullRequestsByHeadInfo (ctx , pr .HeadRepoID , pr .HeadBranch )
10201010 if err != nil {
1021- ctx .ServerError (fmt . Sprintf ( "OpenRepository[%s]" , pr . HeadRepo . FullName ()) , err )
1011+ ctx .ServerError ("HasUnmergedPullRequestsByHeadInfo" , err )
10221012 return
10231013 }
1024- defer headRepo .Close ()
1025- }
1026- if err := pull_service .RetargetChildrenOnMerge (ctx , ctx .Doer , pr ); err != nil {
1027- ctx .Error (http .StatusInternalServerError , "RetargetChildrenOnMerge" , err )
1028- return
1029- }
1030- if err := repo_service .DeleteBranch (ctx , ctx .Doer , pr .HeadRepo , headRepo , pr .HeadBranch ); err != nil {
1031- switch {
1032- case git .IsErrBranchNotExist (err ):
1033- ctx .NotFound (err )
1034- case errors .Is (err , repo_service .ErrBranchIsDefault ):
1035- ctx .Error (http .StatusForbidden , "DefaultBranch" , fmt .Errorf ("can not delete default branch" ))
1036- case errors .Is (err , git_model .ErrBranchIsProtected ):
1037- ctx .Error (http .StatusForbidden , "IsProtectedBranch" , fmt .Errorf ("branch protected" ))
1038- default :
1039- ctx .Error (http .StatusInternalServerError , "DeleteBranch" , err )
1014+ if exist {
1015+ ctx .Status (http .StatusOK )
1016+ return
1017+ }
1018+
1019+ var headRepo * git.Repository
1020+ if ctx .Repo != nil && ctx .Repo .Repository != nil && ctx .Repo .Repository .ID == pr .HeadRepoID && ctx .Repo .GitRepo != nil {
1021+ headRepo = ctx .Repo .GitRepo
1022+ } else {
1023+ headRepo , err = gitrepo .OpenRepository (ctx , pr .HeadRepo )
1024+ if err != nil {
1025+ ctx .ServerError (fmt .Sprintf ("OpenRepository[%s]" , pr .HeadRepo .FullName ()), err )
1026+ return
1027+ }
1028+ defer headRepo .Close ()
1029+ }
1030+ if err := pull_service .RetargetChildrenOnMerge (ctx , ctx .Doer , pr ); err != nil {
1031+ ctx .Error (http .StatusInternalServerError , "RetargetChildrenOnMerge" , err )
1032+ return
1033+ }
1034+ if err := repo_service .DeleteBranch (ctx , ctx .Doer , pr .HeadRepo , headRepo , pr .HeadBranch ); err != nil {
1035+ switch {
1036+ case git .IsErrBranchNotExist (err ):
1037+ ctx .NotFound (err )
1038+ case errors .Is (err , repo_service .ErrBranchIsDefault ):
1039+ ctx .Error (http .StatusForbidden , "DefaultBranch" , fmt .Errorf ("can not delete default branch" ))
1040+ case errors .Is (err , git_model .ErrBranchIsProtected ):
1041+ ctx .Error (http .StatusForbidden , "IsProtectedBranch" , fmt .Errorf ("branch protected" ))
1042+ default :
1043+ ctx .Error (http .StatusInternalServerError , "DeleteBranch" , err )
1044+ }
1045+ return
1046+ }
1047+ if err := issues_model .AddDeletePRBranchComment (ctx , ctx .Doer , pr .BaseRepo , pr .Issue .ID , pr .HeadBranch ); err != nil {
1048+ // Do not fail here as branch has already been deleted
1049+ log .Error ("DeleteBranch: %v" , err )
10401050 }
1041- return
1042- }
1043- if err := issues_model .AddDeletePRBranchComment (ctx , ctx .Doer , pr .BaseRepo , pr .Issue .ID , pr .HeadBranch ); err != nil {
1044- // Do not fail here as branch has already been deleted
1045- log .Error ("DeleteBranch: %v" , err )
10461051 }
10471052 }
10481053
0 commit comments