diff options
author | Markus Amshove <scm@amshove.dev> | 2024-02-19 10:57:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-19 09:57:08 +0000 |
commit | a11ccc9fcd61fb25ffb1c37b87a0df4ee9efd84e (patch) | |
tree | 3c392ad019ae85286769e46d7c6d2082dec65da8 /routers/web | |
parent | 0ea8de2d0729e1e1d0ea9de1e59fbcb673e87fd2 (diff) | |
download | gitea-a11ccc9fcd61fb25ffb1c37b87a0df4ee9efd84e.tar.gz gitea-a11ccc9fcd61fb25ffb1c37b87a0df4ee9efd84e.zip |
Disallow merge when required checked are missing (#29143)
fixes #21892
This PR disallows merging a PR when not all commit status contexts
configured in the branch protection are met.
Previously, the PR was happy to merge when one commit status was
successful and the other contexts weren't reported.
Any feedback is welcome, first time Go :-)
I'm also not sure if the changes in the template break something else
Given the following branch protection:
![branch_protection](https://github.com/go-gitea/gitea/assets/2401875/f871b4e4-138b-435a-b496-f9ad432e3dec)
This was shown before the change:
![before](https://github.com/go-gitea/gitea/assets/2401875/60424ff0-ee09-4fa0-856e-64e6e3fb0612)
With the change, it is now shown as this:
![after](https://github.com/go-gitea/gitea/assets/2401875/4e464142-efb1-4889-8166-eb3be26c8f3d)
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'routers/web')
-rw-r--r-- | routers/web/repo/pull.go | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 365d9bf258..7052467e64 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -652,6 +652,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 { @@ -720,6 +738,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"` |