mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	backport #29143 Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -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"}} | ||||
| @@ -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}} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user