]> source.dussan.org Git - gitea.git/commitdiff
Move merge actions to notification (#9024)
authorLunny Xiao <xiaolunwen@gmail.com>
Thu, 21 Nov 2019 17:08:42 +0000 (01:08 +0800)
committertechknowlogick <techknowlogick@gitea.io>
Thu, 21 Nov 2019 17:08:42 +0000 (12:08 -0500)
* Move merge actions to notification

* Add missing mail notification

models/pull.go
modules/notification/action/action.go
modules/notification/mail/mail.go
modules/notification/webhook/webhook.go
routers/repo/pull.go
services/pull/merge.go

index b25c52571d77e9b55559381ee7404ca11b92be4b..174faee97ab089438961ea2b220a8b8ceb7c6dfc 100644 (file)
@@ -152,6 +152,9 @@ func (pr *PullRequest) loadIssue(e Engine) (err error) {
        }
 
        pr.Issue, err = getIssueByID(e, pr.IssueID)
+       if err == nil {
+               pr.Issue.PullRequest = pr
+       }
        return err
 }
 
index dd4dc0ae323bcce2476644734bc43d418c8d08a7..70ab9975b23655735c2991e21de75b93b67868f3 100644 (file)
@@ -10,6 +10,7 @@ import (
        "strings"
 
        "code.gitea.io/gitea/models"
+       "code.gitea.io/gitea/modules/git"
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/notification/base"
 )
@@ -191,3 +192,17 @@ func (a *actionNotifier) NotifyPullRequestReview(pr *models.PullRequest, review
                log.Error("notify watchers '%d/%d': %v", review.Reviewer.ID, review.Issue.RepoID, err)
        }
 }
+
+func (*actionNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *models.User, baseRepo *git.Repository) {
+       if err := models.NotifyWatchers(&models.Action{
+               ActUserID: doer.ID,
+               ActUser:   doer,
+               OpType:    models.ActionMergePullRequest,
+               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)
+       }
+}
index 24f68bd642883eab3f8f93069edccdb56eaa4c08..558c9a6243bb5662e48824fa417cc5ae4c9ae7e0 100644 (file)
@@ -8,6 +8,7 @@ import (
        "fmt"
 
        "code.gitea.io/gitea/models"
+       "code.gitea.io/gitea/modules/git"
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/notification/base"
        "code.gitea.io/gitea/services/mailer"
@@ -98,3 +99,14 @@ func (m *mailNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *model
                mailer.SendIssueAssignedMail(issue, doer, ct, comment, []string{assignee.Email})
        }
 }
+
+func (m *mailNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *models.User, baseRepo *git.Repository) {
+       if err := pr.LoadIssue(); err != nil {
+               log.Error("pr.LoadIssue: %v", err)
+               return
+       }
+
+       if err := mailer.MailParticipants(pr.Issue, doer, models.ActionClosePullRequest); err != nil {
+               log.Error("MailParticipants: %v", err)
+       }
+}
index 43be0d2e1cb400254e7fb4732442227a4efc0569..213e33c0968580e44dad730c9b00dbdc5a8cd4ae 100644 (file)
@@ -521,6 +521,44 @@ func (m *webhookNotifier) NotifyPushCommits(pusher *models.User, repo *models.Re
        }
 }
 
+func (*webhookNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *models.User, baseRepo *git.Repository) {
+       // Reload pull request information.
+       if err := pr.LoadAttributes(); err != nil {
+               log.Error("LoadAttributes: %v", err)
+               return
+       }
+
+       if err := pr.LoadIssue(); err != nil {
+               log.Error("LoadAttributes: %v", err)
+               return
+       }
+
+       if err := pr.Issue.LoadRepo(); err != nil {
+               log.Error("pr.Issue.LoadRepo: %v", err)
+               return
+       }
+
+       mode, err := models.AccessLevel(doer, pr.Issue.Repo)
+       if err != nil {
+               log.Error("models.AccessLevel: %v", err)
+               return
+       }
+
+       // Merge pull request calls issue.changeStatus so we need to handle separately.
+       apiPullRequest := &api.PullRequestPayload{
+               Index:       pr.Issue.Index,
+               PullRequest: pr.APIFormat(),
+               Repository:  pr.Issue.Repo.APIFormat(mode),
+               Sender:      doer.APIFormat(),
+               Action:      api.HookIssueClosed,
+       }
+
+       err = webhook_module.PrepareWebhooks(pr.Issue.Repo, models.HookEventPullRequest, apiPullRequest)
+       if err != nil {
+               log.Error("PrepareWebhooks: %v", err)
+       }
+}
+
 func (m *webhookNotifier) NotifyPullRequestReview(pr *models.PullRequest, review *models.Review, comment *models.Comment) {
        var reviewHookType models.HookEventType
 
index a1a4e5e2bbe1a324d0091e711386eb2cc1078c58..0ff077b462d3fb935e127a869766d0f9e6667915 100644 (file)
@@ -716,8 +716,6 @@ func MergePullRequest(ctx *context.Context, form auth.MergePullRequestForm) {
                return
        }
 
-       notification.NotifyMergePullRequest(pr, ctx.User, ctx.Repo.GitRepo)
-
        log.Trace("Pull request merged: %d", pr.ID)
        ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(pr.Index))
 }
index 8ae5f029e8f205f8af862b66212189f34420a85a..e5563a89b9e98c4a497b8c277bdbb8d65c8235fc 100644 (file)
@@ -426,29 +426,11 @@ func Merge(pr *models.PullRequest, doer *models.User, baseGitRepo *git.Repositor
                log.Error("setMerged [%d]: %v", pr.ID, err)
        }
 
-       if err := models.NotifyWatchers(&models.Action{
-               ActUserID: doer.ID,
-               ActUser:   doer,
-               OpType:    models.ActionMergePullRequest,
-               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)
-       }
+       notification.NotifyMergePullRequest(pr, doer, baseGitRepo)
 
        // Reset cached commit count
        cache.Remove(pr.Issue.Repo.GetCommitsCountCacheKey(pr.BaseBranch, true))
 
-       // Reload pull request information.
-       if err = pr.LoadAttributes(); err != nil {
-               log.Error("LoadAttributes: %v", err)
-               return nil
-       }
-
-       notification.NotifyIssueChangeStatus(doer, pr.Issue, true)
-
        // Resolve cross references
        refs, err := pr.ResolveCrossReferences()
        if err != nil {