backport #29143 Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>tags/v1.21.6
@@ -635,6 +635,24 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C | |||
} | |||
if pb != nil && pb.EnableStatusCheck { | |||
var missingRequiredChecks []string | |||
for _, requiredContext := range pb.StatusCheckContexts { | |||
contextFound := false | |||
matchesRequiredContext := createRequiredContextMatcher(requiredContext) | |||
for _, presentStatus := range commitStatuses { | |||
if matchesRequiredContext(presentStatus.Context) { | |||
contextFound = true | |||
break | |||
} | |||
} | |||
if !contextFound { | |||
missingRequiredChecks = append(missingRequiredChecks, requiredContext) | |||
} | |||
} | |||
ctx.Data["MissingRequiredChecks"] = missingRequiredChecks | |||
ctx.Data["is_context_required"] = func(context string) bool { | |||
for _, c := range pb.StatusCheckContexts { | |||
if c == context { | |||
@@ -703,6 +721,18 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C | |||
return compareInfo | |||
} | |||
func createRequiredContextMatcher(requiredContext string) func(string) bool { | |||
if gp, err := glob.Compile(requiredContext); err == nil { | |||
return func(contextToCheck string) bool { | |||
return gp.Match(contextToCheck) | |||
} | |||
} | |||
return func(contextToCheck string) bool { | |||
return requiredContext == contextToCheck | |||
} | |||
} | |||
type pullCommitList struct { | |||
Commits []pull_service.CommitInfo `json:"commits"` | |||
LastReviewCommitSha string `json:"last_review_commit_sha"` |
@@ -50,6 +50,10 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, | |||
} | |||
} | |||
if matchedCount != len(requiredContexts) { | |||
return structs.CommitStatusPending | |||
} | |||
if matchedCount == 0 { | |||
status := git_model.CalcCommitStatus(commitStatuses) | |||
if status != nil { |
@@ -1,7 +1,7 @@ | |||
{{if $.LatestCommitStatus}} | |||
{{if not $.Issue.PullRequest.HasMerged}} | |||
<div class="ui top attached header"> | |||
{{if eq .LatestCommitStatus.State "pending"}} | |||
{{if or (eq .LatestCommitStatus.State "pending") (.MissingRequiredChecks)}} | |||
{{ctx.Locale.Tr "repo.pulls.status_checking"}} | |||
{{else if eq .LatestCommitStatus.State "success"}} | |||
{{ctx.Locale.Tr "repo.pulls.status_checks_success"}} | |||
@@ -14,7 +14,7 @@ | |||
{{else}} | |||
{{ctx.Locale.Tr "repo.pulls.status_checking"}} | |||
{{end}} | |||
</div> | |||
</div> | |||
{{end}} | |||
{{range $.LatestCommitStatuses}} | |||
@@ -31,4 +31,15 @@ | |||
</div> | |||
</div> | |||
{{end}} | |||
{{range .MissingRequiredChecks}} | |||
<div class="ui attached segment pr-status"> | |||
{{svg "octicon-dot-fill" 18 "commit-status icon text yellow"}} | |||
<div class="status-context"> | |||
<span>{{.}}</span> | |||
<div class="ui status-details"> | |||
<div class="ui label">{{ctx.Locale.Tr "repo.pulls.status_checks_requested"}}</div> | |||
</div> | |||
</div> | |||
</div> | |||
{{end}} | |||
{{end}} |