diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index 4b481790fb..109778761b 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -17,6 +17,7 @@ import ( api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/automerge" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/convert" issue_service "code.gitea.io/gitea/services/issue" @@ -381,6 +382,11 @@ func CreatePullReview(ctx *context.APIContext) { return } + // as a missing / blocking reviews could have blocked a pending automerge let's recheck + if reviewType == issues_model.ReviewTypeApprove { + automerge.MergeScheduledPullRequest(pr) + } + // convert response apiReview, err := convert.ToPullReview(ctx, review, ctx.Doer) if err != nil { @@ -473,6 +479,11 @@ func SubmitPullReview(ctx *context.APIContext) { return } + // as a missing / blocking reviews could have blocked a pending automerge let's recheck + if review.Type == issues_model.ReviewTypeApprove { + automerge.MergeScheduledPullRequest(pr) + } + // convert response apiReview, err := convert.ToPullReview(ctx, review, ctx.Doer) if err != nil { @@ -888,7 +899,7 @@ func dismissReview(ctx *context.APIContext, msg string, isDismiss, dismissPriors ctx.Error(http.StatusForbidden, "", "Must be repo admin") return } - review, _, isWrong := prepareSingleReview(ctx) + review, pr, isWrong := prepareSingleReview(ctx) if isWrong { return } @@ -898,7 +909,12 @@ func dismissReview(ctx *context.APIContext, msg string, isDismiss, dismissPriors return } - _, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss, dismissPriors) + if pr.Issue.IsClosed { + ctx.Error(http.StatusForbidden, "", "not need to dismiss this review because this pr is closed") + return + } + + comm, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss, dismissPriors) if err != nil { if pull_service.IsErrDismissRequestOnClosedPR(err) { ctx.Error(http.StatusForbidden, "", err) @@ -908,6 +924,9 @@ func dismissReview(ctx *context.APIContext, msg string, isDismiss, dismissPriors return } + // as reviews could have blocked a pending automerge let's recheck + automerge.MergeScheduledPullRequest(comm.Issue.PullRequest) + if review, err = issues_model.GetReviewByID(ctx, review.ID); err != nil { ctx.Error(http.StatusInternalServerError, "GetReviewByID", err) return diff --git a/routers/web/repo/pull_review.go b/routers/web/repo/pull_review.go index 62f6d71c5e..0da67ec623 100644 --- a/routers/web/repo/pull_review.go +++ b/routers/web/repo/pull_review.go @@ -16,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/automerge" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/context/upload" "code.gitea.io/gitea/services/forms" @@ -271,6 +272,16 @@ func SubmitReview(ctx *context.Context) { } return } + + // as a missing / blocking reviews could have blocked a pending automerge let's recheck + if reviewType == issues_model.ReviewTypeApprove { + if err := issue.LoadPullRequest(ctx); err != nil { + ctx.ServerError("GetPullRequest", err) + return + } + automerge.MergeScheduledPullRequest(issue.PullRequest) + } + ctx.JSONRedirect(fmt.Sprintf("%s/pulls/%d#%s", ctx.Repo.RepoLink, issue.Index, comm.HashTag())) } @@ -287,6 +298,9 @@ func DismissReview(ctx *context.Context) { return } + // as reviews could have blocked a pending automerge let's recheck + automerge.MergeScheduledPullRequest(comm.Issue.PullRequest) + ctx.Redirect(fmt.Sprintf("%s/pulls/%d#%s", ctx.Repo.RepoLink, comm.Issue.Index, comm.HashTag())) }