@@ -8,15 +8,47 @@ package pull
88import (
99 "code.gitea.io/gitea/models"
1010 "code.gitea.io/gitea/modules/git"
11+ "code.gitea.io/gitea/modules/structs"
12+
1113 "github.com/pkg/errors"
1214)
1315
16+ // MergeRequiredContextsCommitStatus returns a commit status state for given required contexts
17+ func MergeRequiredContextsCommitStatus (commitStatuses []* models.CommitStatus , requiredContexts []string ) structs.CommitStatusState {
18+ if len (requiredContexts ) == 0 {
19+ status := models .CalcCommitStatus (commitStatuses )
20+ if status != nil {
21+ return status .State
22+ }
23+ return structs .CommitStatusSuccess
24+ }
25+
26+ var returnedStatus = structs .CommitStatusPending
27+ for _ , ctx := range requiredContexts {
28+ var targetStatus structs.CommitStatusState
29+ for _ , commitStatus := range commitStatuses {
30+ if commitStatus .Context == ctx {
31+ targetStatus = commitStatus .State
32+ break
33+ }
34+ }
35+
36+ if targetStatus == "" {
37+ targetStatus = structs .CommitStatusPending
38+ }
39+ if targetStatus .NoBetterThan (returnedStatus ) {
40+ returnedStatus = targetStatus
41+ }
42+ }
43+ return returnedStatus
44+ }
45+
1446// IsCommitStatusContextSuccess returns true if all required status check contexts succeed.
1547func IsCommitStatusContextSuccess (commitStatuses []* models.CommitStatus , requiredContexts []string ) bool {
1648 // If no specific context is required, require that last commit status is a success
1749 if len (requiredContexts ) == 0 {
1850 status := models .CalcCommitStatus (commitStatuses )
19- if status == nil || status .State != models .CommitStatusSuccess {
51+ if status == nil || status .State != structs .CommitStatusSuccess {
2052 return false
2153 }
2254 return true
@@ -26,7 +58,7 @@ func IsCommitStatusContextSuccess(commitStatuses []*models.CommitStatus, require
2658 var found bool
2759 for _ , commitStatus := range commitStatuses {
2860 if commitStatus .Context == ctx {
29- if commitStatus .State != models .CommitStatusSuccess {
61+ if commitStatus .State != structs .CommitStatusSuccess {
3062 return false
3163 }
3264
@@ -50,30 +82,39 @@ func IsPullCommitStatusPass(pr *models.PullRequest) (bool, error) {
5082 return true , nil
5183 }
5284
85+ state , err := GetPullRequestCommitStatusState (pr )
86+ if err != nil {
87+ return false , err
88+ }
89+ return state .IsSuccess (), nil
90+ }
91+
92+ // GetPullRequestCommitStatusState returns pull request merged commit status state
93+ func GetPullRequestCommitStatusState (pr * models.PullRequest ) (structs.CommitStatusState , error ) {
5394 // check if all required status checks are successful
5495 headGitRepo , err := git .OpenRepository (pr .HeadRepo .RepoPath ())
5596 if err != nil {
56- return false , errors .Wrap (err , "OpenRepository" )
97+ return "" , errors .Wrap (err , "OpenRepository" )
5798 }
5899 defer headGitRepo .Close ()
59100
60101 if ! headGitRepo .IsBranchExist (pr .HeadBranch ) {
61- return false , errors .New ("Head branch does not exist, can not merge" )
102+ return "" , errors .New ("Head branch does not exist, can not merge" )
62103 }
63104
64105 sha , err := headGitRepo .GetBranchCommitID (pr .HeadBranch )
65106 if err != nil {
66- return false , errors .Wrap (err , "GetBranchCommitID" )
107+ return "" , errors .Wrap (err , "GetBranchCommitID" )
67108 }
68109
69110 if err := pr .LoadBaseRepo (); err != nil {
70- return false , errors .Wrap (err , "LoadBaseRepo" )
111+ return "" , errors .Wrap (err , "LoadBaseRepo" )
71112 }
72113
73114 commitStatuses , err := models .GetLatestCommitStatus (pr .BaseRepo , sha , 0 )
74115 if err != nil {
75- return false , errors .Wrap (err , "GetLatestCommitStatus" )
116+ return "" , errors .Wrap (err , "GetLatestCommitStatus" )
76117 }
77118
78- return IsCommitStatusContextSuccess (commitStatuses , pr .ProtectedBranch .StatusCheckContexts ), nil
119+ return MergeRequiredContextsCommitStatus (commitStatuses , pr .ProtectedBranch .StatusCheckContexts ), nil
79120}
0 commit comments