Skip to content

Commit c0f5111

Browse files
authored
Dismiss prior pull reviews if done via web in review dismiss (go-gitea#20197)
1 parent e519249 commit c0f5111

File tree

6 files changed

+58
-6
lines changed

6 files changed

+58
-6
lines changed

models/issues/review.go

+30
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"code.gitea.io/gitea/modules/base"
2020
"code.gitea.io/gitea/modules/structs"
2121
"code.gitea.io/gitea/modules/timeutil"
22+
"code.gitea.io/gitea/modules/util"
2223

2324
"xorm.io/builder"
2425
)
@@ -474,6 +475,35 @@ func SubmitReview(doer *user_model.User, issue *Issue, reviewType ReviewType, co
474475
return review, comm, committer.Commit()
475476
}
476477

478+
// GetReviewOptions represent filter options for GetReviews
479+
type GetReviewOptions struct {
480+
IssueID int64
481+
ReviewerID int64
482+
Dismissed util.OptionalBool
483+
}
484+
485+
// GetReviews return reviews based on GetReviewOptions
486+
func GetReviews(ctx context.Context, opts *GetReviewOptions) ([]*Review, error) {
487+
if opts == nil {
488+
return nil, fmt.Errorf("opts are nil")
489+
}
490+
491+
sess := db.GetEngine(ctx)
492+
493+
if opts.IssueID != 0 {
494+
sess = sess.Where("issue_id=?", opts.IssueID)
495+
}
496+
if opts.ReviewerID != 0 {
497+
sess = sess.Where("reviewer_id=?", opts.ReviewerID)
498+
}
499+
if !opts.Dismissed.IsNone() {
500+
sess = sess.Where("dismissed=?", opts.Dismissed.IsTrue())
501+
}
502+
503+
reviews := make([]*Review, 0, 4)
504+
return reviews, sess.Find(&reviews)
505+
}
506+
477507
// GetReviewersByIssueID gets the latest review of each reviewer for a pull request
478508
func GetReviewersByIssueID(issueID int64) ([]*Review, error) {
479509
reviews := make([]*Review, 0, 10)

modules/structs/pull_review.go

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ type SubmitPullReviewOptions struct {
9797
// DismissPullReviewOptions are options to dismiss a pull review
9898
type DismissPullReviewOptions struct {
9999
Message string `json:"message"`
100+
Priors bool `json:"priors"`
100101
}
101102

102103
// PullReviewRequestOptions are options to add or remove pull review requests

routers/api/v1/repo/pull_review.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@ func DismissPullReview(ctx *context.APIContext) {
823823
// "422":
824824
// "$ref": "#/responses/validationError"
825825
opts := web.GetForm(ctx).(*api.DismissPullReviewOptions)
826-
dismissReview(ctx, opts.Message, true)
826+
dismissReview(ctx, opts.Message, true, opts.Priors)
827827
}
828828

829829
// UnDismissPullReview cancel to dismiss a review for a pull request
@@ -863,10 +863,10 @@ func UnDismissPullReview(ctx *context.APIContext) {
863863
// "$ref": "#/responses/forbidden"
864864
// "422":
865865
// "$ref": "#/responses/validationError"
866-
dismissReview(ctx, "", false)
866+
dismissReview(ctx, "", false, false)
867867
}
868868

869-
func dismissReview(ctx *context.APIContext, msg string, isDismiss bool) {
869+
func dismissReview(ctx *context.APIContext, msg string, isDismiss, dismissPriors bool) {
870870
if !ctx.Repo.IsAdmin() {
871871
ctx.Error(http.StatusForbidden, "", "Must be repo admin")
872872
return
@@ -886,7 +886,7 @@ func dismissReview(ctx *context.APIContext, msg string, isDismiss bool) {
886886
return
887887
}
888888

889-
_, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss)
889+
_, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss, dismissPriors)
890890
if err != nil {
891891
ctx.Error(http.StatusInternalServerError, "pull_service.DismissReview", err)
892892
return

routers/web/repo/pull_review.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ func SubmitReview(ctx *context.Context) {
242242
// DismissReview dismissing stale review by repo admin
243243
func DismissReview(ctx *context.Context) {
244244
form := web.GetForm(ctx).(*forms.DismissReviewForm)
245-
comm, err := pull_service.DismissReview(ctx, form.ReviewID, ctx.Repo.Repository.ID, form.Message, ctx.Doer, true)
245+
comm, err := pull_service.DismissReview(ctx, form.ReviewID, ctx.Repo.Repository.ID, form.Message, ctx.Doer, true, true)
246246
if err != nil {
247247
ctx.ServerError("pull_service.DismissReview", err)
248248
return

services/pull/review.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"code.gitea.io/gitea/modules/log"
2121
"code.gitea.io/gitea/modules/notification"
2222
"code.gitea.io/gitea/modules/setting"
23+
"code.gitea.io/gitea/modules/util"
2324
)
2425

2526
// CreateCodeComment creates a comment on the code line
@@ -271,7 +272,7 @@ func SubmitReview(ctx context.Context, doer *user_model.User, gitRepo *git.Repos
271272
}
272273

273274
// DismissReview dismissing stale review by repo admin
274-
func DismissReview(ctx context.Context, reviewID, repoID int64, message string, doer *user_model.User, isDismiss bool) (comment *issues_model.Comment, err error) {
275+
func DismissReview(ctx context.Context, reviewID, repoID int64, message string, doer *user_model.User, isDismiss, dismissPriors bool) (comment *issues_model.Comment, err error) {
275276
review, err := issues_model.GetReviewByID(ctx, reviewID)
276277
if err != nil {
277278
return
@@ -295,6 +296,22 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string,
295296
return
296297
}
297298

299+
if dismissPriors {
300+
reviews, err := issues_model.GetReviews(ctx, &issues_model.GetReviewOptions{
301+
IssueID: review.IssueID,
302+
ReviewerID: review.ReviewerID,
303+
Dismissed: util.OptionalBoolFalse,
304+
})
305+
if err != nil {
306+
return nil, err
307+
}
308+
for _, oldReview := range reviews {
309+
if err = issues_model.DismissReview(oldReview, true); err != nil {
310+
return nil, err
311+
}
312+
}
313+
}
314+
298315
if !isDismiss {
299316
return nil, nil
300317
}

templates/swagger/v1_json.tmpl

+4
Original file line numberDiff line numberDiff line change
@@ -14864,6 +14864,10 @@
1486414864
"message": {
1486514865
"type": "string",
1486614866
"x-go-name": "Message"
14867+
},
14868+
"priors": {
14869+
"type": "boolean",
14870+
"x-go-name": "Priors"
1486714871
}
1486814872
},
1486914873
"x-go-package": "code.gitea.io/gitea/modules/structs"

0 commit comments

Comments
 (0)