diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2023-07-27 10:36:54 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-27 10:36:54 +0800 |
commit | 666038a06df6356a06d309966a925bf00253e3fa (patch) | |
tree | eb05c8b8e0232c304678b235dcbad5bb0aa0dd79 /services | |
parent | 54614767a256923912c65bbdc35471f83c00cf66 (diff) | |
download | gitea-666038a06df6356a06d309966a925bf00253e3fa.tar.gz gitea-666038a06df6356a06d309966a925bf00253e3fa.zip |
Fix bug when pushing to a pull request which enabled dismiss approval automatically (#25882) (#26158)
Fix #25858
Backport #25882
The option `dissmiss stale approvals` was listed on protected branch but
never implemented. This PR fixes that.
<img width="1006" alt="图片"
src="https://github.com/go-gitea/gitea/assets/81045/60bfa968-4db7-4c24-b8be-2e5978f91bb9">
<img width="1021" alt="图片"
src="https://github.com/go-gitea/gitea/assets/81045/8dabc14d-2dfe-40c2-94ed-24fcbf6e0e8f">
Diffstat (limited to 'services')
-rw-r--r-- | services/pull/pull.go | 11 | ||||
-rw-r--r-- | services/pull/review.go | 61 |
2 files changed, 63 insertions, 9 deletions
diff --git a/services/pull/pull.go b/services/pull/pull.go index 8f2befa8ff..55c400947b 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -302,6 +302,17 @@ func AddTestPullRequestTask(doer *user_model.User, repoID int64, branch string, if err := issues_model.MarkReviewsAsStale(pr.IssueID); err != nil { log.Error("MarkReviewsAsStale: %v", err) } + + // dismiss all approval reviews if protected branch rule item enabled. + pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pr.BaseRepoID, pr.BaseBranch) + if err != nil { + log.Error("GetFirstMatchProtectedBranchRule: %v", err) + } + if pb != nil && pb.DismissStaleApprovals { + if err := DismissApprovalReviews(ctx, doer, pr); err != nil { + log.Error("DismissApprovalReviews: %v", err) + } + } } if err := issues_model.MarkReviewsAsNotStale(pr.IssueID, newCommitID); err != nil { log.Error("MarkReviewsAsNotStale: %v", err) diff --git a/services/pull/review.go b/services/pull/review.go index 6feffe4ec4..6b8373c089 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -316,6 +316,52 @@ func SubmitReview(ctx context.Context, doer *user_model.User, gitRepo *git.Repos return review, comm, nil } +// DismissApprovalReviews dismiss all approval reviews because of new commits +func DismissApprovalReviews(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest) error { + reviews, err := issues_model.FindReviews(ctx, issues_model.FindReviewOptions{ + ListOptions: db.ListOptions{ + ListAll: true, + }, + IssueID: pull.IssueID, + Type: issues_model.ReviewTypeApprove, + Dismissed: util.OptionalBoolFalse, + }) + if err != nil { + return err + } + + if err := reviews.LoadIssues(ctx); err != nil { + return err + } + + return db.WithTx(ctx, func(subCtx context.Context) error { + for _, review := range reviews { + if err := issues_model.DismissReview(subCtx, review, true); err != nil { + return err + } + + comment, err := issue_service.CreateComment(ctx, &issues_model.CreateCommentOptions{ + Doer: doer, + Content: "New commits pushed, approval review dismissed automatically according to repository settings", + Type: issues_model.CommentTypeDismissReview, + ReviewID: review.ID, + Issue: review.Issue, + Repo: review.Issue.Repo, + }) + if err != nil { + return err + } + + comment.Review = review + comment.Poster = doer + comment.Issue = review.Issue + + notification.NotifyPullReviewDismiss(ctx, doer, review, comment) + } + return nil + }) +} + // DismissReview dismissing stale review by repo admin func DismissReview(ctx context.Context, reviewID, repoID int64, message string, doer *user_model.User, isDismiss, dismissPriors bool) (comment *issues_model.Comment, err error) { review, err := issues_model.GetReviewByID(ctx, reviewID) @@ -337,12 +383,12 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string, return nil, fmt.Errorf("reviews's repository is not the same as the one we expect") } - if err = issues_model.DismissReview(review, isDismiss); err != nil { - return + if err := issues_model.DismissReview(ctx, review, isDismiss); err != nil { + return nil, err } if dismissPriors { - reviews, err := issues_model.GetReviews(ctx, &issues_model.GetReviewOptions{ + reviews, err := issues_model.FindReviews(ctx, issues_model.FindReviewOptions{ IssueID: review.IssueID, ReviewerID: review.ReviewerID, Dismissed: util.OptionalBoolFalse, @@ -351,7 +397,7 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string, return nil, err } for _, oldReview := range reviews { - if err = issues_model.DismissReview(oldReview, true); err != nil { + if err = issues_model.DismissReview(ctx, oldReview, true); err != nil { return nil, err } } @@ -361,11 +407,8 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string, return nil, nil } - if err = review.Issue.LoadPullRequest(ctx); err != nil { - return - } - if err = review.Issue.LoadAttributes(ctx); err != nil { - return + if err := review.Issue.LoadAttributes(ctx); err != nil { + return nil, err } comment, err = issue_service.CreateComment(ctx, &issues_model.CreateCommentOptions{ |