mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	Add branch protection option to block merge on requested changes. (#9592)
* Add branch protection option to block merge on requested changes. * Add migration step * Fix check to correct negation * Apply suggestions from code review Language improvement. Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com> * Copyright year. Co-authored-by: John Olheiser <42128690+jolheiser@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		
				
					committed by
					
						
						Lauris BH
					
				
			
			
				
	
			
			
			
						parent
						
							b39fab41c8
						
					
				
				
					commit
					ea707f5a77
				
			@@ -44,6 +44,7 @@ type ProtectedBranch struct {
 | 
			
		||||
	ApprovalsWhitelistUserIDs []int64            `xorm:"JSON TEXT"`
 | 
			
		||||
	ApprovalsWhitelistTeamIDs []int64            `xorm:"JSON TEXT"`
 | 
			
		||||
	RequiredApprovals         int64              `xorm:"NOT NULL DEFAULT 0"`
 | 
			
		||||
	BlockOnRejectedReviews    bool               `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	CreatedUnix               timeutil.TimeStamp `xorm:"created"`
 | 
			
		||||
	UpdatedUnix               timeutil.TimeStamp `xorm:"updated"`
 | 
			
		||||
}
 | 
			
		||||
@@ -166,6 +167,23 @@ func (protectBranch *ProtectedBranch) GetGrantedApprovalsCount(pr *PullRequest)
 | 
			
		||||
	return approvals
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MergeBlockedByRejectedReview returns true if merge is blocked by rejected reviews
 | 
			
		||||
func (protectBranch *ProtectedBranch) MergeBlockedByRejectedReview(pr *PullRequest) bool {
 | 
			
		||||
	if !protectBranch.BlockOnRejectedReviews {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	rejectExist, err := x.Where("issue_id = ?", pr.IssueID).
 | 
			
		||||
		And("type = ?", ReviewTypeReject).
 | 
			
		||||
		And("official = ?", true).
 | 
			
		||||
		Exist(new(Review))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("MergeBlockedByRejectedReview: %v", err)
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return rejectExist
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetProtectedBranchByRepoID getting protected branch by repo ID
 | 
			
		||||
func GetProtectedBranchByRepoID(repoID int64) ([]*ProtectedBranch, error) {
 | 
			
		||||
	protectedBranches := make([]*ProtectedBranch, 0)
 | 
			
		||||
@@ -340,7 +358,7 @@ func (repo *Repository) IsProtectedBranchForMerging(pr *PullRequest, branchName
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return true, err
 | 
			
		||||
	} else if has {
 | 
			
		||||
		return !protectedBranch.CanUserMerge(doer.ID) || !protectedBranch.HasEnoughApprovals(pr), nil
 | 
			
		||||
		return !protectedBranch.CanUserMerge(doer.ID) || !protectedBranch.HasEnoughApprovals(pr) || protectedBranch.MergeBlockedByRejectedReview(pr), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -288,6 +288,8 @@ var migrations = []Migration{
 | 
			
		||||
	NewMigration("add user_id prefix to existing user avatar name", renameExistingUserAvatarName),
 | 
			
		||||
	// v116 -> v117
 | 
			
		||||
	NewMigration("Extend TrackedTimes", extendTrackedTimes),
 | 
			
		||||
	// v117 -> v118
 | 
			
		||||
	NewMigration("Add block on rejected reviews branch protection", addBlockOnRejectedReviews),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Migrate database to current version
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								models/migrations/v117.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								models/migrations/v117.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
// Copyright 2020 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package migrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"xorm.io/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func addBlockOnRejectedReviews(x *xorm.Engine) error {
 | 
			
		||||
	type ProtectedBranch struct {
 | 
			
		||||
		BlockOnRejectedReviews bool `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return x.Sync2(new(ProtectedBranch))
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user