@@ -8,15 +8,47 @@ package pull
8
8
import (
9
9
"code.gitea.io/gitea/models"
10
10
"code.gitea.io/gitea/modules/git"
11
+ "code.gitea.io/gitea/modules/structs"
12
+
11
13
"github.com/pkg/errors"
12
14
)
13
15
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
+
14
46
// IsCommitStatusContextSuccess returns true if all required status check contexts succeed.
15
47
func IsCommitStatusContextSuccess (commitStatuses []* models.CommitStatus , requiredContexts []string ) bool {
16
48
// If no specific context is required, require that last commit status is a success
17
49
if len (requiredContexts ) == 0 {
18
50
status := models .CalcCommitStatus (commitStatuses )
19
- if status == nil || status .State != models .CommitStatusSuccess {
51
+ if status == nil || status .State != structs .CommitStatusSuccess {
20
52
return false
21
53
}
22
54
return true
@@ -26,7 +58,7 @@ func IsCommitStatusContextSuccess(commitStatuses []*models.CommitStatus, require
26
58
var found bool
27
59
for _ , commitStatus := range commitStatuses {
28
60
if commitStatus .Context == ctx {
29
- if commitStatus .State != models .CommitStatusSuccess {
61
+ if commitStatus .State != structs .CommitStatusSuccess {
30
62
return false
31
63
}
32
64
@@ -50,30 +82,39 @@ func IsPullCommitStatusPass(pr *models.PullRequest) (bool, error) {
50
82
return true , nil
51
83
}
52
84
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 ) {
53
94
// check if all required status checks are successful
54
95
headGitRepo , err := git .OpenRepository (pr .HeadRepo .RepoPath ())
55
96
if err != nil {
56
- return false , errors .Wrap (err , "OpenRepository" )
97
+ return "" , errors .Wrap (err , "OpenRepository" )
57
98
}
58
99
defer headGitRepo .Close ()
59
100
60
101
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" )
62
103
}
63
104
64
105
sha , err := headGitRepo .GetBranchCommitID (pr .HeadBranch )
65
106
if err != nil {
66
- return false , errors .Wrap (err , "GetBranchCommitID" )
107
+ return "" , errors .Wrap (err , "GetBranchCommitID" )
67
108
}
68
109
69
110
if err := pr .LoadBaseRepo (); err != nil {
70
- return false , errors .Wrap (err , "LoadBaseRepo" )
111
+ return "" , errors .Wrap (err , "LoadBaseRepo" )
71
112
}
72
113
73
114
commitStatuses , err := models .GetLatestCommitStatus (pr .BaseRepo , sha , 0 )
74
115
if err != nil {
75
- return false , errors .Wrap (err , "GetLatestCommitStatus" )
116
+ return "" , errors .Wrap (err , "GetLatestCommitStatus" )
76
117
}
77
118
78
- return IsCommitStatusContextSuccess (commitStatuses , pr .ProtectedBranch .StatusCheckContexts ), nil
119
+ return MergeRequiredContextsCommitStatus (commitStatuses , pr .ProtectedBranch .StatusCheckContexts ), nil
79
120
}
0 commit comments