@@ -1057,49 +1057,54 @@ func MergePullRequest(ctx *context.APIContext) {
1057
1057
}
1058
1058
log .Trace ("Pull request merged: %d" , pr .ID )
1059
1059
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 )
1077
1067
if err != nil {
1078
- ctx .ServerError (fmt . Sprintf ( "OpenRepository[%s]" , pr . HeadRepo . FullName ()) , err )
1068
+ ctx .ServerError ("HasUnmergedPullRequestsByHeadInfo" , err )
1079
1069
return
1080
1070
}
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 )
1097
1107
}
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 )
1103
1108
}
1104
1109
}
1105
1110
0 commit comments