@@ -95,7 +95,6 @@ func ListPullRequests(ctx *context.APIContext) {
95
95
Labels : ctx .FormStrings ("labels" ),
96
96
MilestoneID : ctx .FormInt64 ("milestone" ),
97
97
})
98
-
99
98
if err != nil {
100
99
ctx .Error (http .StatusInternalServerError , "PullRequests" , err )
101
100
return
@@ -724,13 +723,12 @@ func MergePullRequest(ctx *context.APIContext) {
724
723
return
725
724
}
726
725
727
- if err = pr .LoadHeadRepo (); err != nil {
726
+ if err : = pr .LoadHeadRepo (); err != nil {
728
727
ctx .Error (http .StatusInternalServerError , "LoadHeadRepo" , err )
729
728
return
730
729
}
731
730
732
- err = pr .LoadIssue ()
733
- if err != nil {
731
+ if err := pr .LoadIssue (); err != nil {
734
732
ctx .Error (http .StatusInternalServerError , "LoadIssue" , err )
735
733
return
736
734
}
@@ -744,29 +742,33 @@ func MergePullRequest(ctx *context.APIContext) {
744
742
}
745
743
}
746
744
747
- if pr .Issue .IsClosed {
748
- ctx .NotFound ()
749
- return
750
- }
745
+ manuallMerge := repo_model .MergeStyle (form .Do ) == repo_model .MergeStyleManuallyMerged
746
+ force := form .ForceMerge != nil && * form .ForceMerge
751
747
752
- allowedMerge , err := pull_service .IsUserAllowedToMerge (pr , ctx .Repo .Permission , ctx .User )
753
- if err != nil {
754
- ctx .Error (http .StatusInternalServerError , "IsUSerAllowedToMerge" , err )
755
- return
756
- }
757
- if ! allowedMerge {
758
- ctx .Error (http .StatusMethodNotAllowed , "Merge" , "User not allowed to merge PR" )
759
- return
760
- }
761
-
762
- if pr .HasMerged {
763
- ctx .Error (http .StatusMethodNotAllowed , "PR already merged" , "" )
748
+ if err := pull_service .CheckPullMergable (ctx , ctx .User , & ctx .Repo .Permission , pr , manuallMerge , force ); err != nil {
749
+ if errors .Is (err , pull_service .ErrIsClosed ) {
750
+ ctx .NotFound ()
751
+ } else if errors .Is (err , pull_service .ErrUserNotAllowedToMerge ) {
752
+ ctx .Error (http .StatusMethodNotAllowed , "Merge" , "User not allowed to merge PR" )
753
+ } else if errors .Is (err , pull_service .ErrHasMerged ) {
754
+ ctx .Error (http .StatusMethodNotAllowed , "PR already merged" , "" )
755
+ } else if errors .Is (err , pull_service .ErrIsWorkInProgress ) {
756
+ ctx .Error (http .StatusMethodNotAllowed , "PR is a work in progress" , "Work in progress PRs cannot be merged" )
757
+ } else if errors .Is (err , pull_service .ErrNotMergableState ) {
758
+ ctx .Error (http .StatusMethodNotAllowed , "PR not in mergeable state" , "Please try again later" )
759
+ } else if models .IsErrNotAllowedToMerge (err ) {
760
+ ctx .Error (http .StatusMethodNotAllowed , "PR is not ready to be merged" , err )
761
+ } else if asymkey_service .IsErrWontSign (err ) {
762
+ ctx .Error (http .StatusMethodNotAllowed , fmt .Sprintf ("Protected branch %s requires signed commits but this merge would not be signed" , pr .BaseBranch ), err )
763
+ } else {
764
+ ctx .InternalServerError (err )
765
+ }
764
766
return
765
767
}
766
768
767
769
// handle manually-merged mark
768
- if repo_model . MergeStyle ( form . Do ) == repo_model . MergeStyleManuallyMerged {
769
- if err = pull_service .MergedManually (pr , ctx .User , ctx .Repo .GitRepo , form .MergeCommitID ); err != nil {
770
+ if manuallMerge {
771
+ if err : = pull_service .MergedManually (pr , ctx .User , ctx .Repo .GitRepo , form .MergeCommitID ); err != nil {
770
772
if models .IsErrInvalidMergeStyle (err ) {
771
773
ctx .Error (http .StatusMethodNotAllowed , "Invalid merge style" , fmt .Errorf ("%s is not allowed an allowed merge style for this repository" , repo_model .MergeStyle (form .Do )))
772
774
return
@@ -782,63 +784,13 @@ func MergePullRequest(ctx *context.APIContext) {
782
784
return
783
785
}
784
786
785
- if ! pr .CanAutoMerge () {
786
- ctx .Error (http .StatusMethodNotAllowed , "PR not in mergeable state" , "Please try again later" )
787
- return
788
- }
789
-
790
- if pr .IsWorkInProgress () {
791
- ctx .Error (http .StatusMethodNotAllowed , "PR is a work in progress" , "Work in progress PRs cannot be merged" )
787
+ // set defaults to propagate needed fields
788
+ if err := form .SetDefaults (pr ); err != nil {
789
+ ctx .ServerError ("SetDefaults" , fmt .Errorf ("SetDefaults: %v" , err ))
792
790
return
793
791
}
794
792
795
- if err := pull_service .CheckPRReadyToMerge (pr , false ); err != nil {
796
- if ! models .IsErrNotAllowedToMerge (err ) {
797
- ctx .Error (http .StatusInternalServerError , "CheckPRReadyToMerge" , err )
798
- return
799
- }
800
- if form .ForceMerge != nil && * form .ForceMerge {
801
- if isRepoAdmin , err := models .IsUserRepoAdmin (pr .BaseRepo , ctx .User ); err != nil {
802
- ctx .Error (http .StatusInternalServerError , "IsUserRepoAdmin" , err )
803
- return
804
- } else if ! isRepoAdmin {
805
- ctx .Error (http .StatusMethodNotAllowed , "Merge" , "Only repository admin can merge if not all checks are ok (force merge)" )
806
- }
807
- } else {
808
- ctx .Error (http .StatusMethodNotAllowed , "PR is not ready to be merged" , err )
809
- return
810
- }
811
- }
812
-
813
- if _ , err := pull_service .IsSignedIfRequired (pr , ctx .User ); err != nil {
814
- if ! asymkey_service .IsErrWontSign (err ) {
815
- ctx .Error (http .StatusInternalServerError , "IsSignedIfRequired" , err )
816
- return
817
- }
818
- ctx .Error (http .StatusMethodNotAllowed , fmt .Sprintf ("Protected branch %s requires signed commits but this merge would not be signed" , pr .BaseBranch ), err )
819
- return
820
- }
821
-
822
- if len (form .Do ) == 0 {
823
- form .Do = string (repo_model .MergeStyleMerge )
824
- }
825
-
826
- message := strings .TrimSpace (form .MergeTitleField )
827
- if len (message ) == 0 {
828
- if repo_model .MergeStyle (form .Do ) == repo_model .MergeStyleMerge {
829
- message = pr .GetDefaultMergeMessage ()
830
- }
831
- if repo_model .MergeStyle (form .Do ) == repo_model .MergeStyleSquash {
832
- message = pr .GetDefaultSquashMessage ()
833
- }
834
- }
835
-
836
- form .MergeMessageField = strings .TrimSpace (form .MergeMessageField )
837
- if len (form .MergeMessageField ) > 0 {
838
- message += "\n \n " + form .MergeMessageField
839
- }
840
-
841
- if err := pull_service .Merge (pr , ctx .User , ctx .Repo .GitRepo , repo_model .MergeStyle (form .Do ), form .HeadCommitID , message ); err != nil {
793
+ if err := pull_service .Merge (pr , ctx .User , ctx .Repo .GitRepo , repo_model .MergeStyle (form .Do ), form .HeadCommitID , form .MergeTitleField ); err != nil {
842
794
if models .IsErrInvalidMergeStyle (err ) {
843
795
ctx .Error (http .StatusMethodNotAllowed , "Invalid merge style" , fmt .Errorf ("%s is not allowed an allowed merge style for this repository" , repo_model .MergeStyle (form .Do )))
844
796
return
0 commit comments