Skip to content

Commit

Permalink
Disallow merge when required checked are missing (#29143) (#29268)
Browse files Browse the repository at this point in the history
backport #29143

Co-authored-by: wxiaoguang <[email protected]>
  • Loading branch information
MarkusAmshove and wxiaoguang authored Feb 19, 2024
1 parent c01b266 commit 78f41e4
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
30 changes: 30 additions & 0 deletions routers/web/repo/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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"`
Expand Down
4 changes: 4 additions & 0 deletions services/pull/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
15 changes: 13 additions & 2 deletions templates/repo/pulls/status.tmpl
Original file line number Diff line number Diff line change
@@ -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"}}
Expand All @@ -14,7 +14,7 @@
{{else}}
{{ctx.Locale.Tr "repo.pulls.status_checking"}}
{{end}}
</div>
</div>
{{end}}

{{range $.LatestCommitStatuses}}
Expand All @@ -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}}

0 comments on commit 78f41e4

Please sign in to comment.