summaryrefslogtreecommitdiffstats
path: root/modules/notification
diff options
context:
space:
mode:
authorkolaente <k@knt.li>2022-11-03 16:49:00 +0100
committerGitHub <noreply@github.com>2022-11-03 23:49:00 +0800
commit085f717529008c31b147f76ea7eeaf06ca8801bd (patch)
tree673e6904f488d1c2cd0def082d4ff979c72a3de2 /modules/notification
parentf17edfaf5a31ea3f4e9152424b75c2c4986acbe3 (diff)
downloadgitea-085f717529008c31b147f76ea7eeaf06ca8801bd.tar.gz
gitea-085f717529008c31b147f76ea7eeaf06ca8801bd.zip
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 <art27@cantab.net> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Diffstat (limited to 'modules/notification')
-rw-r--r--modules/notification/action/action.go14
-rw-r--r--modules/notification/base/notifier.go3
-rw-r--r--modules/notification/base/null.go4
-rw-r--r--modules/notification/mail/mail.go10
-rw-r--r--modules/notification/notification.go7
-rw-r--r--modules/notification/ui/ui.go4
-rw-r--r--modules/notification/webhook/webhook.go5
7 files changed, 46 insertions, 1 deletions
diff --git a/modules/notification/action/action.go b/modules/notification/action/action.go
index d3ff8b156e..44d115f3d7 100644
--- a/modules/notification/action/action.go
+++ b/modules/notification/action/action.go
@@ -283,6 +283,20 @@ func (*actionNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer
}
}
+func (*actionNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
+ if err := activities_model.NotifyWatchers(&activities_model.Action{
+ ActUserID: doer.ID,
+ ActUser: doer,
+ OpType: activities_model.ActionAutoMergePullRequest,
+ Content: fmt.Sprintf("%d|%s", pr.Issue.Index, pr.Issue.Title),
+ RepoID: pr.Issue.Repo.ID,
+ Repo: pr.Issue.Repo,
+ IsPrivate: pr.Issue.Repo.IsPrivate,
+ }); err != nil {
+ log.Error("NotifyWatchers [%d]: %v", pr.ID, err)
+ }
+}
+
func (*actionNotifier) NotifyPullRevieweDismiss(doer *user_model.User, review *issues_model.Review, comment *issues_model.Comment) {
reviewerName := review.Reviewer.Name
if len(review.OriginalAuthor) > 0 {
diff --git a/modules/notification/base/notifier.go b/modules/notification/base/notifier.go
index d6cec92e19..9edab8213f 100644
--- a/modules/notification/base/notifier.go
+++ b/modules/notification/base/notifier.go
@@ -34,7 +34,8 @@ type Notifier interface {
NotifyIssueChangeLabels(doer *user_model.User, issue *issues_model.Issue,
addedLabels, removedLabels []*issues_model.Label)
NotifyNewPullRequest(pr *issues_model.PullRequest, mentions []*user_model.User)
- NotifyMergePullRequest(*issues_model.PullRequest, *user_model.User)
+ NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User)
+ NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User)
NotifyPullRequestSynchronized(doer *user_model.User, pr *issues_model.PullRequest)
NotifyPullRequestReview(pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User)
NotifyPullRequestCodeComment(pr *issues_model.PullRequest, comment *issues_model.Comment, mentions []*user_model.User)
diff --git a/modules/notification/base/null.go b/modules/notification/base/null.go
index b113ae79e1..f051fbc26f 100644
--- a/modules/notification/base/null.go
+++ b/modules/notification/base/null.go
@@ -54,6 +54,10 @@ func (*NullNotifier) NotifyPullRequestCodeComment(pr *issues_model.PullRequest,
func (*NullNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
}
+// NotifyAutoMergePullRequest places a place holder function
+func (*NullNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
+}
+
// NotifyPullRequestSynchronized places a place holder function
func (*NullNotifier) NotifyPullRequestSynchronized(doer *user_model.User, pr *issues_model.PullRequest) {
}
diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go
index 100b4eb36f..54f561839d 100644
--- a/modules/notification/mail/mail.go
+++ b/modules/notification/mail/mail.go
@@ -153,6 +153,16 @@ func (m *mailNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer
}
}
+func (m *mailNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
+ if err := pr.LoadIssue(); err != nil {
+ log.Error("pr.LoadIssue: %v", err)
+ return
+ }
+ if err := mailer.MailParticipants(pr.Issue, doer, activities_model.ActionAutoMergePullRequest, nil); err != nil {
+ log.Error("MailParticipants: %v", err)
+ }
+}
+
func (m *mailNotifier) NotifyPullRequestPushCommits(doer *user_model.User, pr *issues_model.PullRequest, comment *issues_model.Comment) {
ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().HammerContext(), fmt.Sprintf("mailNotifier.NotifyPullRequestPushCommits Pull[%d] #%d in [%d]", pr.ID, pr.Index, pr.BaseRepoID))
defer finished()
diff --git a/modules/notification/notification.go b/modules/notification/notification.go
index 693c7f5c22..7bdc0a04c4 100644
--- a/modules/notification/notification.go
+++ b/modules/notification/notification.go
@@ -98,6 +98,13 @@ func NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User)
}
}
+// NotifyAutoMergePullRequest notifies merge pull request to notifiers
+func NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
+ for _, notifier := range notifiers {
+ notifier.NotifyAutoMergePullRequest(pr, doer)
+ }
+}
+
// NotifyNewPullRequest notifies new pull request to notifiers
func NotifyNewPullRequest(pr *issues_model.PullRequest, mentions []*user_model.User) {
for _, notifier := range notifiers {
diff --git a/modules/notification/ui/ui.go b/modules/notification/ui/ui.go
index 4d96a6b0ed..0e2b3e67c7 100644
--- a/modules/notification/ui/ui.go
+++ b/modules/notification/ui/ui.go
@@ -119,6 +119,10 @@ func (ns *notificationService) NotifyMergePullRequest(pr *issues_model.PullReque
})
}
+func (ns *notificationService) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
+ ns.NotifyMergePullRequest(pr, doer)
+}
+
func (ns *notificationService) NotifyNewPullRequest(pr *issues_model.PullRequest, mentions []*user_model.User) {
if err := pr.LoadIssue(); err != nil {
log.Error("Unable to load issue: %d for pr: %d: Error: %v", pr.IssueID, pr.ID, err)
diff --git a/modules/notification/webhook/webhook.go b/modules/notification/webhook/webhook.go
index 630b565984..c591e1e34d 100644
--- a/modules/notification/webhook/webhook.go
+++ b/modules/notification/webhook/webhook.go
@@ -632,6 +632,11 @@ func (m *webhookNotifier) NotifyPushCommits(pusher *user_model.User, repo *repo_
}
}
+func (m *webhookNotifier) NotifyAutoMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
+ // just redirect to the NotifyMergePullRequest
+ m.NotifyMergePullRequest(pr, doer)
+}
+
func (*webhookNotifier) NotifyMergePullRequest(pr *issues_model.PullRequest, doer *user_model.User) {
ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().HammerContext(), fmt.Sprintf("webhook.NotifyMergePullRequest Pull[%d] #%d in [%d]", pr.ID, pr.Index, pr.BaseRepoID))
defer finished()