Skip to content

Commit b8a298d

Browse files
committed
Merge branch 'also_auto-merge_on_review_updates' of github.com:6543-forks/gitea into 6543-forks-also_auto-merge_on_review_updates
2 parents 370b1bd + 56b7c0a commit b8a298d

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

models/issues/review.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,14 @@ func (r *Review) LoadCodeComments(ctx context.Context) (err error) {
155155
if r.CodeComments != nil {
156156
return err
157157
}
158-
if err = r.loadIssue(ctx); err != nil {
158+
if err = r.LoadIssue(ctx); err != nil {
159159
return err
160160
}
161161
r.CodeComments, err = fetchCodeCommentsByReview(ctx, r.Issue, nil, r, false)
162162
return err
163163
}
164164

165-
func (r *Review) loadIssue(ctx context.Context) (err error) {
165+
func (r *Review) LoadIssue(ctx context.Context) (err error) {
166166
if r.Issue != nil {
167167
return err
168168
}
@@ -199,7 +199,7 @@ func (r *Review) LoadReviewerTeam(ctx context.Context) (err error) {
199199

200200
// LoadAttributes loads all attributes except CodeComments
201201
func (r *Review) LoadAttributes(ctx context.Context) (err error) {
202-
if err = r.loadIssue(ctx); err != nil {
202+
if err = r.LoadIssue(ctx); err != nil {
203203
return err
204204
}
205205
if err = r.LoadCodeComments(ctx); err != nil {

services/automerge/automerge.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"code.gitea.io/gitea/modules/log"
2323
"code.gitea.io/gitea/modules/process"
2424
"code.gitea.io/gitea/modules/queue"
25+
notify_service "code.gitea.io/gitea/services/notify"
2526
pull_service "code.gitea.io/gitea/services/pull"
2627
)
2728

@@ -30,6 +31,8 @@ var prAutoMergeQueue *queue.WorkerPoolQueue[string]
3031

3132
// Init runs the task queue to that handles auto merges
3233
func Init() error {
34+
notify_service.RegisterNotifier(NewNotifier())
35+
3336
prAutoMergeQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "pr_auto_merge", handler)
3437
if prAutoMergeQueue == nil {
3538
return fmt.Errorf("unable to create pr_auto_merge queue")
@@ -95,8 +98,8 @@ func RemoveScheduledAutoMerge(ctx context.Context, doer *user_model.User, pull *
9598
})
9699
}
97100

98-
// MergeScheduledPullRequest merges a previously scheduled pull request when all checks succeeded
99-
func MergeScheduledPullRequest(ctx context.Context, sha string, repo *repo_model.Repository) error {
101+
// MergeScheduledPullRequestsBySha merges a previously scheduled pull request(s) when all checks succeeded
102+
func MergeScheduledPullRequestsBySha(ctx context.Context, sha string, repo *repo_model.Repository) error {
100103
pulls, err := getPullRequestsByHeadSHA(ctx, sha, repo, func(pr *issues_model.PullRequest) bool {
101104
return !pr.HasMerged && pr.CanAutoMerge()
102105
})
@@ -111,6 +114,15 @@ func MergeScheduledPullRequest(ctx context.Context, sha string, repo *repo_model
111114
return nil
112115
}
113116

117+
// MergeScheduledPullRequest merges a previously scheduled pull request when all checks succeeded
118+
func MergeScheduledPullRequest(pull *issues_model.PullRequest) {
119+
if pull == nil || pull.HasMerged || !pull.CanAutoMerge() {
120+
return
121+
}
122+
123+
addToQueue(pull, pull.HeadCommitID)
124+
}
125+
114126
func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) {
115127
gitRepo, err := gitrepo.OpenRepository(ctx, repo)
116128
if err != nil {

services/automerge/notify.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package automerge
5+
6+
import (
7+
"context"
8+
9+
issues_model "code.gitea.io/gitea/models/issues"
10+
user_model "code.gitea.io/gitea/models/user"
11+
"code.gitea.io/gitea/modules/log"
12+
notify_service "code.gitea.io/gitea/services/notify"
13+
)
14+
15+
type automergeNotifier struct {
16+
notify_service.NullNotifier
17+
}
18+
19+
var _ notify_service.Notifier = &automergeNotifier{}
20+
21+
// NewNotifier create a new automergeNotifier notifier
22+
func NewNotifier() notify_service.Notifier {
23+
return &automergeNotifier{}
24+
}
25+
26+
func (n *automergeNotifier) PullRequestReview(ctx context.Context, pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User) {
27+
// as a missing / blocking reviews could have blocked a pending automerge let's recheck
28+
if review.Type == issues_model.ReviewTypeApprove {
29+
MergeScheduledPullRequest(pr)
30+
}
31+
}
32+
33+
func (n *automergeNotifier) PullReviewDismiss(ctx context.Context, doer *user_model.User, review *issues_model.Review, comment *issues_model.Comment) {
34+
if err := review.LoadIssue(ctx); err != nil {
35+
log.Error("LoadIssue: %v", err)
36+
return
37+
}
38+
if err := review.Issue.LoadPullRequest(ctx); err != nil {
39+
log.Error("LoadPullRequest: %v", err)
40+
return
41+
}
42+
// as reviews could have blocked a pending automerge let's recheck
43+
MergeScheduledPullRequest(review.Issue.PullRequest)
44+
}

services/repository/commitstatus/commitstatus.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato
117117
}
118118

119119
if status.State.IsSuccess() {
120-
if err := automerge.MergeScheduledPullRequest(ctx, sha, repo); err != nil {
120+
if err := automerge.MergeScheduledPullRequestsBySha(ctx, sha, repo); err != nil {
121121
return fmt.Errorf("MergeScheduledPullRequest[repo_id: %d, user_id: %d, sha: %s]: %w", repo.ID, creator.ID, sha, err)
122122
}
123123
}

0 commit comments

Comments
 (0)