mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Supports wildcard protected branch (#20825)
This PR introduce glob match for protected branch name. The separator is `/` and you can use `*` matching non-separator chars and use `**` across separator. It also supports input an exist or non-exist branch name as matching condition and branch name condition has high priority than glob rule. Should fix #2529 and #15705 screenshots <img width="1160" alt="image" src="https://user-images.githubusercontent.com/81045/205651179-ebb5492a-4ade-4bb4-a13c-965e8c927063.png"> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
		@@ -14,7 +14,7 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	git_model "code.gitea.io/gitea/models/git"
 | 
			
		||||
	issues_model "code.gitea.io/gitea/models/issues"
 | 
			
		||||
	"code.gitea.io/gitea/models/unit"
 | 
			
		||||
	"code.gitea.io/gitea/modules/container"
 | 
			
		||||
@@ -106,8 +106,8 @@ func TestPatch(pr *issues_model.PullRequest) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 3. Check for protected files changes
 | 
			
		||||
	if err = checkPullFilesProtection(pr, gitRepo); err != nil {
 | 
			
		||||
		return fmt.Errorf("pr.CheckPullFilesProtection(): %w", err)
 | 
			
		||||
	if err = checkPullFilesProtection(ctx, pr, gitRepo); err != nil {
 | 
			
		||||
		return fmt.Errorf("pr.CheckPullFilesProtection(): %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(pr.ChangedProtectedFiles) > 0 {
 | 
			
		||||
@@ -544,23 +544,23 @@ func CheckUnprotectedFiles(repo *git.Repository, oldCommitID, newCommitID string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// checkPullFilesProtection check if pr changed protected files and save results
 | 
			
		||||
func checkPullFilesProtection(pr *issues_model.PullRequest, gitRepo *git.Repository) error {
 | 
			
		||||
func checkPullFilesProtection(ctx context.Context, pr *issues_model.PullRequest, gitRepo *git.Repository) error {
 | 
			
		||||
	if pr.Status == issues_model.PullRequestStatusEmpty {
 | 
			
		||||
		pr.ChangedProtectedFiles = nil
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := pr.LoadProtectedBranch(db.DefaultContext); err != nil {
 | 
			
		||||
	pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pr.BaseRepoID, pr.BaseBranch)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if pr.ProtectedBranch == nil {
 | 
			
		||||
	if pb == nil {
 | 
			
		||||
		pr.ChangedProtectedFiles = nil
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	pr.ChangedProtectedFiles, err = CheckFileProtection(gitRepo, pr.MergeBase, "tracking", pr.ProtectedBranch.GetProtectedFilePatterns(), 10, os.Environ())
 | 
			
		||||
	pr.ChangedProtectedFiles, err = CheckFileProtection(gitRepo, pr.MergeBase, "tracking", pb.GetProtectedFilePatterns(), 10, os.Environ())
 | 
			
		||||
	if err != nil && !models.IsErrFilePathProtected(err) {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user