@@ -1026,49 +1026,54 @@ func MergePullRequest(ctx *context.APIContext) {
10261026 }
10271027 log .Trace ("Pull request merged: %d" , pr .ID )
10281028
1029- if form .DeleteBranchAfterMerge {
1030- // Don't cleanup when there are other PR's that use this branch as head branch.
1031- exist , err := issues_model .HasUnmergedPullRequestsByHeadInfo (ctx , pr .HeadRepoID , pr .HeadBranch )
1032- if err != nil {
1033- ctx .ServerError ("HasUnmergedPullRequestsByHeadInfo" , err )
1034- return
1035- }
1036- if exist {
1037- ctx .Status (http .StatusOK )
1038- return
1039- }
1040-
1041- var headRepo * git.Repository
1042- if ctx .Repo != nil && ctx .Repo .Repository != nil && ctx .Repo .Repository .ID == pr .HeadRepoID && ctx .Repo .GitRepo != nil {
1043- headRepo = ctx .Repo .GitRepo
1044- } else {
1045- headRepo , err = gitrepo .OpenRepository (ctx , pr .HeadRepo )
1029+ // for agit flow, we should not delete the agit reference after merge
1030+ if form .DeleteBranchAfterMerge && pr .Flow == issues_model .PullRequestFlowGithub {
1031+ // check permission even it has been checked in repo_service.DeleteBranch so that we don't need to
1032+ // do RetargetChildrenOnMerge
1033+ if err := repo_service .CanDeleteBranch (ctx , pr .HeadRepo , pr .HeadBranch , ctx .Doer ); err == nil {
1034+ // Don't cleanup when there are other PR's that use this branch as head branch.
1035+ exist , err := issues_model .HasUnmergedPullRequestsByHeadInfo (ctx , pr .HeadRepoID , pr .HeadBranch )
10461036 if err != nil {
1047- ctx .ServerError (fmt . Sprintf ( "OpenRepository[%s]" , pr . HeadRepo . FullName ()) , err )
1037+ ctx .ServerError ("HasUnmergedPullRequestsByHeadInfo" , err )
10481038 return
10491039 }
1050- defer headRepo .Close ()
1051- }
1052- if err := pull_service .RetargetChildrenOnMerge (ctx , ctx .Doer , pr ); err != nil {
1053- ctx .Error (http .StatusInternalServerError , "RetargetChildrenOnMerge" , err )
1054- return
1055- }
1056- if err := repo_service .DeleteBranch (ctx , ctx .Doer , pr .HeadRepo , headRepo , pr .HeadBranch ); err != nil {
1057- switch {
1058- case git .IsErrBranchNotExist (err ):
1059- ctx .NotFound (err )
1060- case errors .Is (err , repo_service .ErrBranchIsDefault ):
1061- ctx .Error (http .StatusForbidden , "DefaultBranch" , fmt .Errorf ("can not delete default branch" ))
1062- case errors .Is (err , git_model .ErrBranchIsProtected ):
1063- ctx .Error (http .StatusForbidden , "IsProtectedBranch" , fmt .Errorf ("branch protected" ))
1064- default :
1065- ctx .Error (http .StatusInternalServerError , "DeleteBranch" , err )
1040+ if exist {
1041+ ctx .Status (http .StatusOK )
1042+ return
1043+ }
1044+
1045+ var headRepo * git.Repository
1046+ if ctx .Repo != nil && ctx .Repo .Repository != nil && ctx .Repo .Repository .ID == pr .HeadRepoID && ctx .Repo .GitRepo != nil {
1047+ headRepo = ctx .Repo .GitRepo
1048+ } else {
1049+ headRepo , err = gitrepo .OpenRepository (ctx , pr .HeadRepo )
1050+ if err != nil {
1051+ ctx .ServerError (fmt .Sprintf ("OpenRepository[%s]" , pr .HeadRepo .FullName ()), err )
1052+ return
1053+ }
1054+ defer headRepo .Close ()
1055+ }
1056+ if err := pull_service .RetargetChildrenOnMerge (ctx , ctx .Doer , pr ); err != nil {
1057+ ctx .Error (http .StatusInternalServerError , "RetargetChildrenOnMerge" , err )
1058+ return
1059+ }
1060+ if err := repo_service .DeleteBranch (ctx , ctx .Doer , pr .HeadRepo , headRepo , pr .HeadBranch ); err != nil {
1061+ switch {
1062+ case git .IsErrBranchNotExist (err ):
1063+ ctx .NotFound (err )
1064+ case errors .Is (err , repo_service .ErrBranchIsDefault ):
1065+ ctx .Error (http .StatusForbidden , "DefaultBranch" , fmt .Errorf ("can not delete default branch" ))
1066+ case errors .Is (err , git_model .ErrBranchIsProtected ):
1067+ ctx .Error (http .StatusForbidden , "IsProtectedBranch" , fmt .Errorf ("branch protected" ))
1068+ default :
1069+ ctx .Error (http .StatusInternalServerError , "DeleteBranch" , err )
1070+ }
1071+ return
1072+ }
1073+ if err := issues_model .AddDeletePRBranchComment (ctx , ctx .Doer , pr .BaseRepo , pr .Issue .ID , pr .HeadBranch ); err != nil {
1074+ // Do not fail here as branch has already been deleted
1075+ log .Error ("DeleteBranch: %v" , err )
10661076 }
1067- return
1068- }
1069- if err := issues_model .AddDeletePRBranchComment (ctx , ctx .Doer , pr .BaseRepo , pr .Issue .ID , pr .HeadBranch ); err != nil {
1070- // Do not fail here as branch has already been deleted
1071- log .Error ("DeleteBranch: %v" , err )
10721077 }
10731078 }
10741079
0 commit comments