Skip to content

Commit 085f717

Browse files
kolaentelafrikszeripathlunny
authored
feat: notify doers of a merge when automerging (#21553)
I found myself wondering whether a PR I scheduled for automerge was actually merged. It was, but I didn't receive a mail notification for it - that makes sense considering I am the doer and usually don't want to receive such notifications. But ideally I want to receive a notification when a PR was merged because I scheduled it for automerge. This PR implements exactly that. The implementation works, but I wonder if there's a way to avoid passing the "This PR was automerged" state down so much. I tried solving this via the database (checking if there's an automerge scheduled for this PR when sending the notification) but that did not work reliably, probably because sending the notification happens async and the entry might have already been deleted. My implementation might be the most straightforward but maybe not the most elegant. Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: Lauris BH <[email protected]> Co-authored-by: Andrew Thornton <[email protected]> Co-authored-by: Lunny Xiao <[email protected]>
1 parent f17edfa commit 085f717

File tree

18 files changed

+87
-27
lines changed

18 files changed

+87
-27
lines changed

models/activities/action.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const (
6464
ActionPublishRelease // 24
6565
ActionPullReviewDismissed // 25
6666
ActionPullRequestReadyForReview // 26
67+
ActionAutoMergePullRequest // 27
6768
)
6869

6970
// Action represents user operation type and other information to
@@ -550,7 +551,7 @@ func notifyWatchers(ctx context.Context, actions ...*Action) error {
550551
if !permIssue[i] {
551552
continue
552553
}
553-
case ActionCreatePullRequest, ActionCommentPull, ActionMergePullRequest, ActionClosePullRequest, ActionReopenPullRequest:
554+
case ActionCreatePullRequest, ActionCommentPull, ActionMergePullRequest, ActionClosePullRequest, ActionReopenPullRequest, ActionAutoMergePullRequest:
554555
if !permPR[i] {
555556
continue
556557
}

modules/notification/action/action.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,20 @@ func (*actionNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer
283283
}
284284
}
285285

286+
func (*actionNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
287+
if err := activities_model.NotifyWatchers(&activities_model.Action{
288+
ActUserID: doer.ID,
289+
ActUser: doer,
290+
OpType: activities_model.ActionAutoMergePullRequest,
291+
Content: fmt.Sprintf("%d|%s", pr.Issue.Index, pr.Issue.Title),
292+
RepoID: pr.Issue.Repo.ID,
293+
Repo: pr.Issue.Repo,
294+
IsPrivate: pr.Issue.Repo.IsPrivate,
295+
}); err != nil {
296+
log.Error("NotifyWatchers [%d]: %v", pr.ID, err)
297+
}
298+
}
299+
286300
func (*actionNotifier) NotifyPullRevieweDismiss(doer *user_model.User, review *issues_model.Review, comment *issues_model.Comment) {
287301
reviewerName := review.Reviewer.Name
288302
if len(review.OriginalAuthor) > 0 {

modules/notification/base/notifier.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ type Notifier interface {
3434
NotifyIssueChangeLabels(doer *user_model.User, issue *issues_model.Issue,
3535
addedLabels, removedLabels []*issues_model.Label)
3636
NotifyNewPullRequest(pr *issues_model.PullRequest, mentions []*user_model.User)
37-
NotifyMergePullRequest(*issues_model.PullRequest, *user_model.User)
37+
NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User)
38+
NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User)
3839
NotifyPullRequestSynchronized(doer *user_model.User, pr *issues_model.PullRequest)
3940
NotifyPullRequestReview(pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User)
4041
NotifyPullRequestCodeComment(pr *issues_model.PullRequest, comment *issues_model.Comment, mentions []*user_model.User)

modules/notification/base/null.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ func (*NullNotifier) NotifyPullRequestCodeComment(pr *issues_model.PullRequest,
5454
func (*NullNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
5555
}
5656

57+
// NotifyAutoMergePullRequest places a place holder function
58+
func (*NullNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
59+
}
60+
5761
// NotifyPullRequestSynchronized places a place holder function
5862
func (*NullNotifier) NotifyPullRequestSynchronized(doer *user_model.User, pr *issues_model.PullRequest) {
5963
}

modules/notification/mail/mail.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,16 @@ func (m *mailNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer
153153
}
154154
}
155155

156+
func (m *mailNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
157+
if err := pr.LoadIssue(); err != nil {
158+
log.Error("pr.LoadIssue: %v", err)
159+
return
160+
}
161+
if err := mailer.MailParticipants(pr.Issue, doer, activities_model.ActionAutoMergePullRequest, nil); err != nil {
162+
log.Error("MailParticipants: %v", err)
163+
}
164+
}
165+
156166
func (m *mailNotifier) NotifyPullRequestPushCommits(doer *user_model.User, pr *issues_model.PullRequest, comment *issues_model.Comment) {
157167
ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().HammerContext(), fmt.Sprintf("mailNotifier.NotifyPullRequestPushCommits Pull[%d] #%d in [%d]", pr.ID, pr.Index, pr.BaseRepoID))
158168
defer finished()

modules/notification/notification.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ func NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User)
9898
}
9999
}
100100

101+
// NotifyAutoMergePullRequest notifies merge pull request to notifiers
102+
func NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
103+
for _, notifier := range notifiers {
104+
notifier.NotifyAutoMergePullRequest(pr, doer)
105+
}
106+
}
107+
101108
// NotifyNewPullRequest notifies new pull request to notifiers
102109
func NotifyNewPullRequest(pr *issues_model.PullRequest, mentions []*user_model.User) {
103110
for _, notifier := range notifiers {

modules/notification/ui/ui.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ func (ns *notificationService) NotifyMergePullRequest(pr *issues_model.PullReque
119119
})
120120
}
121121

122+
func (ns *notificationService) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
123+
ns.NotifyMergePullRequest(pr, doer)
124+
}
125+
122126
func (ns *notificationService) NotifyNewPullRequest(pr *issues_model.PullRequest, mentions []*user_model.User) {
123127
if err := pr.LoadIssue(); err != nil {
124128
log.Error("Unable to load issue: %d for pr: %d: Error: %v", pr.IssueID, pr.ID, err)

modules/notification/webhook/webhook.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,11 @@ func (m *webhookNotifier) NotifyPushCommits(pusher *user_model.User, repo *repo_
632632
}
633633
}
634634

635+
func (m *webhookNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
636+
// just redirect to the NotifyMergePullRequest
637+
m.NotifyMergePullRequest(pr, doer)
638+
}
639+
635640
func (*webhookNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
636641
ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().HammerContext(), fmt.Sprintf("webhook.NotifyMergePullRequest Pull[%d] #%d in [%d]", pr.ID, pr.Index, pr.BaseRepoID))
637642
defer finished()

modules/templates/helper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ func ActionIcon(opType activities_model.ActionType) string {
905905
return "git-pull-request"
906906
case activities_model.ActionCommentIssue, activities_model.ActionCommentPull:
907907
return "comment-discussion"
908-
case activities_model.ActionMergePullRequest:
908+
case activities_model.ActionMergePullRequest, activities_model.ActionAutoMergePullRequest:
909909
return "git-merge"
910910
case activities_model.ActionCloseIssue, activities_model.ActionClosePullRequest:
911911
return "issue-closed"

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3003,6 +3003,7 @@ reopen_pull_request = `reopened pull request <a href="%[1]s">%[3]s#%[2]s</a>`
30033003
comment_issue = `commented on issue <a href="%[1]s">%[3]s#%[2]s</a>`
30043004
comment_pull = `commented on pull request <a href="%[1]s">%[3]s#%[2]s</a>`
30053005
merge_pull_request = `merged pull request <a href="%[1]s">%[3]s#%[2]s</a>`
3006+
auto_merge_pull_request = `automatically merged pull request <a href="%[1]s">%[3]s#%[2]s</a>`
30063007
transfer_repo = transferred repository <code>%s</code> to <a href="%s">%s</a>
30073008
push_tag = pushed tag <a href="%[2]s">%[3]s</a> to <a href="%[1]s">%[4]s</a>
30083009
delete_tag = deleted tag %[2]s from <a href="%[1]s">%[3]s</a>

0 commit comments

Comments
 (0)