Support for status check pattern (#24633)
This PR is to allow users to specify status checks by patterns. Users can enter patterns in the "Status Check Pattern" `textarea` to match status checks and each line specifies a pattern. If "Status Check" is enabled, patterns cannot be empty and user must enter at least one pattern. Users will no longer be able to choose status checks from the table. But a __*`Matched`*__ mark will be added to the matched checks to help users enter patterns. Benefits: - Even if no status checks have been completed, users can specify necessary status checks in advance. - More flexible. Users can specify a series of status checks by one pattern. Before:  After:  --------- Co-authored-by: silverwind <me@silverwind.io>
This commit is contained in:
parent
9fb0945a09
commit
e7c2231dee
10 changed files with 268 additions and 79 deletions
|
@ -11,14 +11,46 @@ import (
|
|||
git_model "code.gitea.io/gitea/models/git"
|
||||
issues_model "code.gitea.io/gitea/models/issues"
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/structs"
|
||||
|
||||
"github.com/gobwas/glob"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// MergeRequiredContextsCommitStatus returns a commit status state for given required contexts
|
||||
func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, requiredContexts []string) structs.CommitStatusState {
|
||||
if len(requiredContexts) == 0 {
|
||||
// matchedCount is the number of `CommitStatus.Context` that match any context of `requiredContexts`
|
||||
matchedCount := 0
|
||||
returnedStatus := structs.CommitStatusSuccess
|
||||
|
||||
if len(requiredContexts) > 0 {
|
||||
requiredContextsGlob := make(map[string]glob.Glob, len(requiredContexts))
|
||||
for _, ctx := range requiredContexts {
|
||||
if gp, err := glob.Compile(ctx); err != nil {
|
||||
log.Error("glob.Compile %s failed. Error: %v", ctx, err)
|
||||
} else {
|
||||
requiredContextsGlob[ctx] = gp
|
||||
}
|
||||
}
|
||||
|
||||
for _, commitStatus := range commitStatuses {
|
||||
var targetStatus structs.CommitStatusState
|
||||
for _, gp := range requiredContextsGlob {
|
||||
if gp.Match(commitStatus.Context) {
|
||||
targetStatus = commitStatus.State
|
||||
matchedCount++
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if targetStatus != "" && targetStatus.NoBetterThan(returnedStatus) {
|
||||
returnedStatus = targetStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if matchedCount == 0 {
|
||||
status := git_model.CalcCommitStatus(commitStatuses)
|
||||
if status != nil {
|
||||
return status.State
|
||||
|
@ -26,28 +58,6 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus,
|
|||
return structs.CommitStatusSuccess
|
||||
}
|
||||
|
||||
returnedStatus := structs.CommitStatusSuccess
|
||||
for _, ctx := range requiredContexts {
|
||||
var targetStatus structs.CommitStatusState
|
||||
for _, commitStatus := range commitStatuses {
|
||||
if commitStatus.Context == ctx {
|
||||
targetStatus = commitStatus.State
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if targetStatus == "" {
|
||||
targetStatus = structs.CommitStatusPending
|
||||
commitStatuses = append(commitStatuses, &git_model.CommitStatus{
|
||||
State: targetStatus,
|
||||
Context: ctx,
|
||||
Description: "Pending",
|
||||
})
|
||||
}
|
||||
if targetStatus.NoBetterThan(returnedStatus) {
|
||||
returnedStatus = targetStatus
|
||||
}
|
||||
}
|
||||
return returnedStatus
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue