Skip to content

Commit eceab9e

Browse files
noerwdelvh
andauthored
Allow users to self-request a PR review (#19030)
The review request feature was added in #10756, where the doer got explicitly excluded from available reviewers. I don't see a functionality or security related reason to forbid this case. As shown by GitHubs implementation, it may be useful to self-request a review, to be reminded oneselves about reviewing, while communicating to team mates that a review is missing. Co-authored-by: delvh <dev.lh@web.de>
1 parent e73c5fd commit eceab9e

File tree

3 files changed

+38
-15
lines changed

3 files changed

+38
-15
lines changed

models/repo.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,21 @@ func getReviewers(ctx context.Context, repo *repo_model.Repository, doerID, post
225225
// This a private repository:
226226
// Anyone who can read the repository is a requestable reviewer
227227
if err := e.
228-
SQL("SELECT * FROM `user` WHERE id in (SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? AND user_id NOT IN ( ?, ?)) ORDER BY name",
228+
SQL("SELECT * FROM `user` WHERE id in ("+
229+
"SELECT user_id FROM `access` WHERE repo_id = ? AND mode >= ? AND user_id != ?"+ // private org repos
230+
") ORDER BY name",
229231
repo.ID, perm.AccessModeRead,
230-
doerID, posterID).
232+
posterID).
231233
Find(&users); err != nil {
232234
return nil, err
233235
}
234236

237+
if repo.Owner.Type == user_model.UserTypeIndividual && repo.Owner.ID != posterID {
238+
// as private *user* repos don't generate an entry in the `access` table,
239+
// the owner of a private repo needs to be explicitly added.
240+
users = append(users, repo.Owner)
241+
}
242+
235243
return users, nil
236244
}
237245

@@ -244,11 +252,11 @@ func getReviewers(ctx context.Context, repo *repo_model.Repository, doerID, post
244252
"SELECT user_id FROM `watch` WHERE repo_id = ? AND mode IN (?, ?) "+
245253
"UNION "+
246254
"SELECT uid AS user_id FROM `org_user` WHERE org_id = ? "+
247-
") AND id NOT IN (?, ?) ORDER BY name",
255+
") AND id != ? ORDER BY name",
248256
repo.ID, perm.AccessModeRead,
249257
repo.ID, repo_model.WatchModeNormal, repo_model.WatchModeAuto,
250258
repo.OwnerID,
251-
doerID, posterID).
259+
posterID).
252260
Find(&users); err != nil {
253261
return nil, err
254262
}

models/repo_test.go

+26-3
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,34 @@ func TestRepoGetReviewers(t *testing.T) {
120120
assert.NoError(t, err)
121121
assert.Len(t, reviewers, 4)
122122

123-
// test private repo
123+
// should include doer if doer is not PR poster.
124+
reviewers, err = GetReviewers(repo1, 11, 2)
125+
assert.NoError(t, err)
126+
assert.Len(t, reviewers, 4)
127+
128+
// should not include PR poster, if PR poster would be otherwise eligible
129+
reviewers, err = GetReviewers(repo1, 11, 4)
130+
assert.NoError(t, err)
131+
assert.Len(t, reviewers, 3)
132+
133+
// test private user repo
124134
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
125-
reviewers, err = GetReviewers(repo2, 2, 2)
135+
136+
reviewers, err = GetReviewers(repo2, 2, 4)
137+
assert.NoError(t, err)
138+
assert.Len(t, reviewers, 1)
139+
assert.EqualValues(t, reviewers[0].ID, 2)
140+
141+
// test private org repo
142+
repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}).(*repo_model.Repository)
143+
144+
reviewers, err = GetReviewers(repo3, 2, 1)
145+
assert.NoError(t, err)
146+
assert.Len(t, reviewers, 2)
147+
148+
reviewers, err = GetReviewers(repo3, 2, 2)
126149
assert.NoError(t, err)
127-
assert.Empty(t, reviewers)
150+
assert.Len(t, reviewers, 1)
128151
}
129152

130153
func TestRepoGetReviewerTeams(t *testing.T) {

services/issue/assignee.go

-8
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,6 @@ func IsValidReviewRequest(reviewer, doer *user_model.User, isAdd bool, issue *mo
140140
}
141141
}
142142

143-
if doer.ID == reviewer.ID {
144-
return models.ErrNotValidReviewRequest{
145-
Reason: "doer can't be reviewer",
146-
UserID: doer.ID,
147-
RepoID: issue.Repo.ID,
148-
}
149-
}
150-
151143
if reviewer.ID == issue.PosterID && issue.OriginalAuthorID == 0 {
152144
return models.ErrNotValidReviewRequest{
153145
Reason: "poster of pr can't be reviewer",

0 commit comments

Comments
 (0)