@@ -1057,49 +1057,54 @@ func MergePullRequest(ctx *context.APIContext) {
10571057 }
10581058 log .Trace ("Pull request merged: %d" , pr .ID )
10591059
1060- if form .DeleteBranchAfterMerge {
1061- // Don't cleanup when there are other PR's that use this branch as head branch.
1062- exist , err := issues_model .HasUnmergedPullRequestsByHeadInfo (ctx , pr .HeadRepoID , pr .HeadBranch )
1063- if err != nil {
1064- ctx .ServerError ("HasUnmergedPullRequestsByHeadInfo" , err )
1065- return
1066- }
1067- if exist {
1068- ctx .Status (http .StatusOK )
1069- return
1070- }
1071-
1072- var headRepo * git.Repository
1073- if ctx .Repo != nil && ctx .Repo .Repository != nil && ctx .Repo .Repository .ID == pr .HeadRepoID && ctx .Repo .GitRepo != nil {
1074- headRepo = ctx .Repo .GitRepo
1075- } else {
1076- headRepo , err = gitrepo .OpenRepository (ctx , pr .HeadRepo )
1060+ // for agit flow, we should not delete the agit reference after merge
1061+ if form .DeleteBranchAfterMerge && pr .Flow == issues_model .PullRequestFlowGithub {
1062+ // check permission even it has been checked in repo_service.DeleteBranch so that we don't need to
1063+ // do RetargetChildrenOnMerge
1064+ if err := repo_service .CanDeleteBranch (ctx , pr .HeadRepo , pr .HeadBranch , ctx .Doer ); err == nil {
1065+ // Don't cleanup when there are other PR's that use this branch as head branch.
1066+ exist , err := issues_model .HasUnmergedPullRequestsByHeadInfo (ctx , pr .HeadRepoID , pr .HeadBranch )
10771067 if err != nil {
1078- ctx .ServerError (fmt . Sprintf ( "OpenRepository[%s]" , pr . HeadRepo . FullName ()) , err )
1068+ ctx .ServerError ("HasUnmergedPullRequestsByHeadInfo" , err )
10791069 return
10801070 }
1081- defer headRepo .Close ()
1082- }
1083- if err := pull_service .RetargetChildrenOnMerge (ctx , ctx .Doer , pr ); err != nil {
1084- ctx .Error (http .StatusInternalServerError , "RetargetChildrenOnMerge" , err )
1085- return
1086- }
1087- if err := repo_service .DeleteBranch (ctx , ctx .Doer , pr .HeadRepo , headRepo , pr .HeadBranch ); err != nil {
1088- switch {
1089- case git .IsErrBranchNotExist (err ):
1090- ctx .NotFound (err )
1091- case errors .Is (err , repo_service .ErrBranchIsDefault ):
1092- ctx .Error (http .StatusForbidden , "DefaultBranch" , fmt .Errorf ("can not delete default branch" ))
1093- case errors .Is (err , git_model .ErrBranchIsProtected ):
1094- ctx .Error (http .StatusForbidden , "IsProtectedBranch" , fmt .Errorf ("branch protected" ))
1095- default :
1096- ctx .Error (http .StatusInternalServerError , "DeleteBranch" , err )
1071+ if exist {
1072+ ctx .Status (http .StatusOK )
1073+ return
1074+ }
1075+
1076+ var headRepo * git.Repository
1077+ if ctx .Repo != nil && ctx .Repo .Repository != nil && ctx .Repo .Repository .ID == pr .HeadRepoID && ctx .Repo .GitRepo != nil {
1078+ headRepo = ctx .Repo .GitRepo
1079+ } else {
1080+ headRepo , err = gitrepo .OpenRepository (ctx , pr .HeadRepo )
1081+ if err != nil {
1082+ ctx .ServerError (fmt .Sprintf ("OpenRepository[%s]" , pr .HeadRepo .FullName ()), err )
1083+ return
1084+ }
1085+ defer headRepo .Close ()
1086+ }
1087+ if err := pull_service .RetargetChildrenOnMerge (ctx , ctx .Doer , pr ); err != nil {
1088+ ctx .Error (http .StatusInternalServerError , "RetargetChildrenOnMerge" , err )
1089+ return
1090+ }
1091+ if err := repo_service .DeleteBranch (ctx , ctx .Doer , pr .HeadRepo , headRepo , pr .HeadBranch ); err != nil {
1092+ switch {
1093+ case git .IsErrBranchNotExist (err ):
1094+ ctx .NotFound (err )
1095+ case errors .Is (err , repo_service .ErrBranchIsDefault ):
1096+ ctx .Error (http .StatusForbidden , "DefaultBranch" , fmt .Errorf ("can not delete default branch" ))
1097+ case errors .Is (err , git_model .ErrBranchIsProtected ):
1098+ ctx .Error (http .StatusForbidden , "IsProtectedBranch" , fmt .Errorf ("branch protected" ))
1099+ default :
1100+ ctx .Error (http .StatusInternalServerError , "DeleteBranch" , err )
1101+ }
1102+ return
1103+ }
1104+ if err := issues_model .AddDeletePRBranchComment (ctx , ctx .Doer , pr .BaseRepo , pr .Issue .ID , pr .HeadBranch ); err != nil {
1105+ // Do not fail here as branch has already been deleted
1106+ log .Error ("DeleteBranch: %v" , err )
10971107 }
1098- return
1099- }
1100- if err := issues_model .AddDeletePRBranchComment (ctx , ctx .Doer , pr .BaseRepo , pr .Issue .ID , pr .HeadBranch ); err != nil {
1101- // Do not fail here as branch has already been deleted
1102- log .Error ("DeleteBranch: %v" , err )
11031108 }
11041109 }
11051110
0 commit comments