mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Mark PR reviews as stale at push and allow to dismiss stale approvals (#9532)
Fix #5997. If a push causes the patch/diff of a PR towards target branch to change, all existing reviews for the PR will be set and shown as stale. New branch protection option to dismiss stale approvals are added. To show that a review is not based on the latest PR changes, an hourglass is shown
This commit is contained in:
		
				
					committed by
					
						
						zeripath
					
				
			
			
				
	
			
			
			
						parent
						
							5b2d9333f1
						
					
				
				
					commit
					25531c71a7
				
			@@ -32,21 +32,23 @@ type ProtectedBranch struct {
 | 
			
		||||
	BranchName                string `xorm:"UNIQUE(s)"`
 | 
			
		||||
	CanPush                   bool   `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	EnableWhitelist           bool
 | 
			
		||||
	WhitelistUserIDs          []int64            `xorm:"JSON TEXT"`
 | 
			
		||||
	WhitelistTeamIDs          []int64            `xorm:"JSON TEXT"`
 | 
			
		||||
	EnableMergeWhitelist      bool               `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	WhitelistDeployKeys       bool               `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	MergeWhitelistUserIDs     []int64            `xorm:"JSON TEXT"`
 | 
			
		||||
	MergeWhitelistTeamIDs     []int64            `xorm:"JSON TEXT"`
 | 
			
		||||
	EnableStatusCheck         bool               `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	StatusCheckContexts       []string           `xorm:"JSON TEXT"`
 | 
			
		||||
	EnableApprovalsWhitelist  bool               `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	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"`
 | 
			
		||||
	WhitelistUserIDs          []int64  `xorm:"JSON TEXT"`
 | 
			
		||||
	WhitelistTeamIDs          []int64  `xorm:"JSON TEXT"`
 | 
			
		||||
	EnableMergeWhitelist      bool     `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	WhitelistDeployKeys       bool     `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	MergeWhitelistUserIDs     []int64  `xorm:"JSON TEXT"`
 | 
			
		||||
	MergeWhitelistTeamIDs     []int64  `xorm:"JSON TEXT"`
 | 
			
		||||
	EnableStatusCheck         bool     `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	StatusCheckContexts       []string `xorm:"JSON TEXT"`
 | 
			
		||||
	EnableApprovalsWhitelist  bool     `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	ApprovalsWhitelistUserIDs []int64  `xorm:"JSON TEXT"`
 | 
			
		||||
	ApprovalsWhitelistTeamIDs []int64  `xorm:"JSON TEXT"`
 | 
			
		||||
	RequiredApprovals         int64    `xorm:"NOT NULL DEFAULT 0"`
 | 
			
		||||
	BlockOnRejectedReviews    bool     `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	DismissStaleApprovals     bool     `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
 | 
			
		||||
	CreatedUnix timeutil.TimeStamp `xorm:"created"`
 | 
			
		||||
	UpdatedUnix timeutil.TimeStamp `xorm:"updated"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsProtected returns if the branch is protected
 | 
			
		||||
@@ -155,10 +157,13 @@ func (protectBranch *ProtectedBranch) HasEnoughApprovals(pr *PullRequest) bool {
 | 
			
		||||
 | 
			
		||||
// GetGrantedApprovalsCount returns the number of granted approvals for pr. A granted approval must be authored by a user in an approval whitelist.
 | 
			
		||||
func (protectBranch *ProtectedBranch) GetGrantedApprovalsCount(pr *PullRequest) int64 {
 | 
			
		||||
	approvals, err := x.Where("issue_id = ?", pr.IssueID).
 | 
			
		||||
	sess := x.Where("issue_id = ?", pr.IssueID).
 | 
			
		||||
		And("type = ?", ReviewTypeApprove).
 | 
			
		||||
		And("official = ?", true).
 | 
			
		||||
		Count(new(Review))
 | 
			
		||||
		And("official = ?", true)
 | 
			
		||||
	if protectBranch.DismissStaleApprovals {
 | 
			
		||||
		sess = sess.And("stale = ?", false)
 | 
			
		||||
	}
 | 
			
		||||
	approvals, err := sess.Count(new(Review))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("GetGrantedApprovalsCount: %v", err)
 | 
			
		||||
		return 0
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user