mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	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:
		@@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user