From c61b9c5f3c533e34066d0a6b072d42f09cecf2ac Mon Sep 17 00:00:00 2001 From: Giteabot Date: Fri, 29 Sep 2023 09:31:35 +0800 Subject: [PATCH] Fix the approval count of PR when there is no protection branch rule (#27272) (#27343) Backport #27272 by @lng2020 As title ![ksnip_20230926-115158](https://github.com/go-gitea/gitea/assets/70063547/a60be44a-06ad-421e-ba27-e4e0adfa5db7) Co-authored-by: Nanguan Lin <70063547+lng2020@users.noreply.github.com> --- models/issues/review.go | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/models/issues/review.go b/models/issues/review.go index 931f1a2ba7..f7ef16f6c9 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -231,7 +231,7 @@ type CreateReviewOptions struct { } // IsOfficialReviewer check if at least one of the provided reviewers can make official reviews in issue (counts towards required approvals) -func IsOfficialReviewer(ctx context.Context, issue *Issue, reviewers ...*user_model.User) (bool, error) { +func IsOfficialReviewer(ctx context.Context, issue *Issue, reviewer *user_model.User) (bool, error) { pr, err := GetPullRequestByIssueID(ctx, issue.ID) if err != nil { return false, err @@ -242,14 +242,21 @@ func IsOfficialReviewer(ctx context.Context, issue *Issue, reviewers ...*user_mo return false, err } if rule == nil { - return false, nil + // if no rule is found, then user with write access can make official reviews + err := pr.LoadBaseRepo(ctx) + if err != nil { + return false, err + } + writeAccess, err := access_model.HasAccessUnit(ctx, reviewer, pr.BaseRepo, unit.TypeCode, perm.AccessModeWrite) + if err != nil { + return false, err + } + return writeAccess, nil } - for _, reviewer := range reviewers { - official, err := git_model.IsUserOfficialReviewer(ctx, rule, reviewer) - if official || err != nil { - return official, err - } + official, err := git_model.IsUserOfficialReviewer(ctx, rule, reviewer) + if official || err != nil { + return official, err } return false, nil @@ -578,7 +585,9 @@ func AddReviewRequest(ctx context.Context, issue *Issue, reviewer, doer *user_mo return nil, nil } - official, err := IsOfficialReviewer(ctx, issue, reviewer, doer) + // if the reviewer is an official reviewer, + // remove the official flag in the all previous reviews + official, err := IsOfficialReviewer(ctx, issue, reviewer) if err != nil { return nil, err } else if official {