Skip to content

Commit e47fa23

Browse files
mfenniakGusted
authored andcommitted
fix: PR not blocked by review request for a whitelisted team (go-gitea#8511)
Fixes go-gitea#8491. Previous behavior always updated the newly created review to set the `official` flag to false. This logic is now removed. The most likely reason that this logic existed was that team reviews were being marked as official based upon `doer`, rather than the target team, which seems undesirable. The expected behavior was retained by removing the check for `IsOfficialReviewer(..., doer)`, ensuring that when making a review request for a team, it doesn't matter *who* makes the request. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8511 Reviewed-by: Earl Warren <[email protected]> Reviewed-by: Gusted <[email protected]> Co-authored-by: Mathieu Fenniak <[email protected]> Co-committed-by: Mathieu Fenniak <[email protected]>
1 parent e186b5c commit e47fa23

File tree

5 files changed

+134
-10
lines changed

5 files changed

+134
-10
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-
2+
id: 23
3+
repo_id: 2
4+
index: 3
5+
poster_id: 2
6+
original_author_id: 0
7+
name: protected branch pull
8+
content: pull request to a protected branch
9+
milestone_id: 0
10+
priority: 0
11+
is_pull: true
12+
is_closed: false
13+
num_comments: 0
14+
created_unix: 1707270422
15+
updated_unix: 1707270422
16+
is_locked: false
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- id: 1
2+
repo_id: 2
3+
branch_name: protected-main
4+
can_push: false
5+
enable_whitelist: true
6+
whitelist_user_i_ds: [1]
7+
whitelist_team_i_ds: []
8+
enable_merge_whitelist: true
9+
whitelist_deploy_keys: false
10+
merge_whitelist_user_i_ds: [1]
11+
merge_whitelist_team_i_ds: []
12+
enable_status_check: false
13+
status_check_contexts: []
14+
enable_approvals_whitelist: true
15+
approvals_whitelist_user_i_ds: []
16+
approvals_whitelist_team_i_ds: [1]
17+
required_approvals: 1
18+
block_on_rejected_reviews: true
19+
block_on_official_review_requests: true
20+
block_on_outdated_branch: true
21+
dismiss_stale_approvals: true
22+
ignore_stale_approvals: false
23+
require_signed_commits: false
24+
protected_file_patterns: ""
25+
unprotected_file_patterns: ""
26+
apply_to_admins: true
27+
created_unix: 1752513073
28+
updated_unix: 1752513073
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-
2+
id: 11
3+
type: 0 # gitea pull request
4+
status: 2 # mergeable
5+
issue_id: 23
6+
index: 3
7+
head_repo_id: 2
8+
base_repo_id: 2
9+
head_branch: feature/protected-branch-pr
10+
base_branch: protected-main
11+
merge_base: 4a357436d925b5c974181ff12a994538ddc5a269
12+
has_merged: false

models/issues/review.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -781,10 +781,6 @@ func AddTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organizat
781781
official, err := IsOfficialReviewerTeam(ctx, issue, reviewer)
782782
if err != nil {
783783
return nil, fmt.Errorf("isOfficialReviewerTeam(): %w", err)
784-
} else if !official {
785-
if official, err = IsOfficialReviewer(ctx, issue, doer); err != nil {
786-
return nil, fmt.Errorf("isOfficialReviewer(): %w", err)
787-
}
788784
}
789785

790786
if review, err = CreateReview(ctx, CreateReviewOptions{
@@ -797,12 +793,6 @@ func AddTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organizat
797793
return nil, err
798794
}
799795

800-
if official {
801-
if _, err := db.Exec(ctx, "UPDATE `review` SET official=? WHERE issue_id=? AND reviewer_team_id=?", false, issue.ID, reviewer.ID); err != nil {
802-
return nil, err
803-
}
804-
}
805-
806796
comment, err := CreateComment(ctx, &CreateCommentOptions{
807797
Type: CommentTypeReviewRequest,
808798
Doer: doer,

models/issues/review_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"forgejo.org/models/db"
1010
issues_model "forgejo.org/models/issues"
11+
organization_model "forgejo.org/models/organization"
1112
repo_model "forgejo.org/models/repo"
1213
"forgejo.org/models/unittest"
1314
user_model "forgejo.org/models/user"
@@ -319,3 +320,80 @@ func TestAddReviewRequest(t *testing.T) {
319320
require.Error(t, err)
320321
assert.True(t, issues_model.IsErrReviewRequestOnClosedPR(err))
321322
}
323+
324+
func TestAddTeamReviewRequest(t *testing.T) {
325+
defer unittest.OverrideFixtures("models/fixtures/TestAddTeamReviewRequest")()
326+
require.NoError(t, unittest.PrepareTestDatabase())
327+
328+
setupForProtectedBranch := func() (*issues_model.Issue, *user_model.User) {
329+
// From override models/fixtures/TestAddTeamReviewRequest/issue.yml; issue #23 is a PR into a protected branch
330+
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 23})
331+
require.NoError(t, issue.LoadRepo(db.DefaultContext))
332+
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
333+
return issue, doer
334+
}
335+
336+
t.Run("Protected branch, not official team", func(t *testing.T) {
337+
issue, doer := setupForProtectedBranch()
338+
// Team 2 is not part of the whitelist for this protected branch
339+
team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 2})
340+
341+
comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
342+
require.NoError(t, err)
343+
require.NotNil(t, comment)
344+
345+
review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
346+
require.NoError(t, err)
347+
require.NotNil(t, review)
348+
assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
349+
assert.Equal(t, team.ID, review.ReviewerTeamID)
350+
// This review request should not be marked official because it is not a request for a team in the branch
351+
// protection rule's whitelist...
352+
assert.False(t, review.Official)
353+
})
354+
355+
t.Run("Protected branch, official team", func(t *testing.T) {
356+
issue, doer := setupForProtectedBranch()
357+
// Team 1 is part of the whitelist for this protected branch
358+
team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 1})
359+
360+
comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
361+
require.NoError(t, err)
362+
require.NotNil(t, comment)
363+
364+
review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
365+
require.NoError(t, err)
366+
require.NotNil(t, review)
367+
assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
368+
assert.Equal(t, team.ID, review.ReviewerTeamID)
369+
// Expected to be considered official because team 1 is in the review whitelist for this protected branch
370+
assert.True(t, review.Official)
371+
})
372+
373+
t.Run("Unprotected branch, official team", func(t *testing.T) {
374+
// Working on a PR into a branch that is not protected, issue #2
375+
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
376+
require.NoError(t, issue.LoadRepo(db.DefaultContext))
377+
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
378+
// team is a team that has write perms against the repo
379+
team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 1})
380+
381+
comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
382+
require.NoError(t, err)
383+
require.NotNil(t, comment)
384+
385+
review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
386+
require.NoError(t, err)
387+
require.NotNil(t, review)
388+
assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
389+
assert.Equal(t, team.ID, review.ReviewerTeamID)
390+
// Will not be marked as official because PR #2 there's no branch protection rule that enables whitelist
391+
// approvals (verifying logic in `IsOfficialReviewerTeam` indirectly)
392+
assert.False(t, review.Official)
393+
394+
// Adding the same team review request again should be a noop
395+
comment, err = issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
396+
require.NoError(t, err)
397+
require.Nil(t, comment)
398+
})
399+
}

0 commit comments

Comments
 (0)