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:
		@@ -760,12 +760,12 @@ func IsUserAllowedToMerge(ctx context.Context, pr *issues_model.PullRequest, p a
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := pr.LoadProtectedBranch(ctx)
 | 
			
		||||
	pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pr.BaseRepoID, pr.BaseBranch)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p.CanWrite(unit.TypeCode) && pr.ProtectedBranch == nil) || (pr.ProtectedBranch != nil && git_model.IsUserMergeWhitelisted(ctx, pr.ProtectedBranch, user.ID, p)) {
 | 
			
		||||
	if (p.CanWrite(unit.TypeCode) && pb == nil) || (pb != nil && git_model.IsUserMergeWhitelisted(ctx, pb, user.ID, p)) {
 | 
			
		||||
		return true, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -778,10 +778,11 @@ func CheckPullBranchProtections(ctx context.Context, pr *issues_model.PullReques
 | 
			
		||||
		return fmt.Errorf("LoadBaseRepo: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = pr.LoadProtectedBranch(ctx); err != nil {
 | 
			
		||||
		return fmt.Errorf("LoadProtectedBranch: %w", err)
 | 
			
		||||
	pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pr.BaseRepoID, pr.BaseBranch)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("LoadProtectedBranch: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if pr.ProtectedBranch == nil {
 | 
			
		||||
	if pb == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -795,23 +796,23 @@ func CheckPullBranchProtections(ctx context.Context, pr *issues_model.PullReques
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !issues_model.HasEnoughApprovals(ctx, pr.ProtectedBranch, pr) {
 | 
			
		||||
	if !issues_model.HasEnoughApprovals(ctx, pb, pr) {
 | 
			
		||||
		return models.ErrDisallowedToMerge{
 | 
			
		||||
			Reason: "Does not have enough approvals",
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if issues_model.MergeBlockedByRejectedReview(ctx, pr.ProtectedBranch, pr) {
 | 
			
		||||
	if issues_model.MergeBlockedByRejectedReview(ctx, pb, pr) {
 | 
			
		||||
		return models.ErrDisallowedToMerge{
 | 
			
		||||
			Reason: "There are requested changes",
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if issues_model.MergeBlockedByOfficialReviewRequests(ctx, pr.ProtectedBranch, pr) {
 | 
			
		||||
	if issues_model.MergeBlockedByOfficialReviewRequests(ctx, pb, pr) {
 | 
			
		||||
		return models.ErrDisallowedToMerge{
 | 
			
		||||
			Reason: "There are official review requests",
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if issues_model.MergeBlockedByOutdatedBranch(pr.ProtectedBranch, pr) {
 | 
			
		||||
	if issues_model.MergeBlockedByOutdatedBranch(pb, pr) {
 | 
			
		||||
		return models.ErrDisallowedToMerge{
 | 
			
		||||
			Reason: "The head branch is behind the base branch",
 | 
			
		||||
		}
 | 
			
		||||
@@ -821,7 +822,7 @@ func CheckPullBranchProtections(ctx context.Context, pr *issues_model.PullReques
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if pr.ProtectedBranch.MergeBlockedByProtectedFiles(pr.ChangedProtectedFiles) {
 | 
			
		||||
	if pb.MergeBlockedByProtectedFiles(pr.ChangedProtectedFiles) {
 | 
			
		||||
		return models.ErrDisallowedToMerge{
 | 
			
		||||
			Reason: "Changed protected files",
 | 
			
		||||
		}
 | 
			
		||||
@@ -836,6 +837,9 @@ func MergedManually(pr *issues_model.PullRequest, doer *user_model.User, baseGit
 | 
			
		||||
	defer pullWorkingPool.CheckOut(fmt.Sprint(pr.ID))
 | 
			
		||||
 | 
			
		||||
	if err := db.WithTx(db.DefaultContext, func(ctx context.Context) error {
 | 
			
		||||
		if err := pr.LoadBaseRepo(ctx); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user