Browse Source

Various fixes for issue mail notifications (#7165)

- Send individual mails for actions and comments
- Send mail for new issues/prs without a comment
- Use correct sender for reopen/close actions
- Hopefully fixed all bugs related to missing mails

Fixes: https://github.com/go-gitea/gitea/issues/7124
Fixes: https://github.com/go-gitea/gitea/issues/5977
tags/v1.9.0-rc1
silverwind zeripath 6 years ago
parent
commit
ae6640998d
3 changed files with 41 additions and 19 deletions
  1. +13
    -6
      models/issue_comment.go
  2. +25
    -10
      models/issue_mail.go
  3. +3
    -3
      modules/notification/mail/mail.go

+ 13
- 6
models/issue_comment.go View File

@@ -403,16 +403,23 @@ func (c *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue) (e
return fmt.Errorf("UpdateIssueMentions [%d]: %v", c.IssueID, err) return fmt.Errorf("UpdateIssueMentions [%d]: %v", c.IssueID, err)
} }


content := c.Content
if len(c.Content) > 0 {
if err = mailIssueCommentToParticipants(e, issue, c.Poster, c.Content, c, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
}
}


switch opType { switch opType {
case ActionCloseIssue: case ActionCloseIssue:
content = fmt.Sprintf("Closed #%d", issue.Index)
ct := fmt.Sprintf("Closed #%d.", issue.Index)
if err = mailIssueCommentToParticipants(e, issue, c.Poster, ct, c, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
}
case ActionReopenIssue: case ActionReopenIssue:
content = fmt.Sprintf("Reopened #%d", issue.Index)
}
if err = mailIssueCommentToParticipants(e, issue, c.Poster, content, c, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
ct := fmt.Sprintf("Reopened #%d.", issue.Index)
if err = mailIssueCommentToParticipants(e, issue, c.Poster, ct, c, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
}
} }


return nil return nil


+ 25
- 10
models/issue_mail.go View File

@@ -118,26 +118,41 @@ func mailIssueCommentToParticipants(e Engine, issue *Issue, doer *User, content


// MailParticipants sends new issue thread created emails to repository watchers // MailParticipants sends new issue thread created emails to repository watchers
// and mentioned people. // and mentioned people.
func (issue *Issue) MailParticipants(opType ActionType) (err error) {
return issue.mailParticipants(x, opType)
func (issue *Issue) MailParticipants(doer *User, opType ActionType) (err error) {
return issue.mailParticipants(x, doer, opType)
} }


func (issue *Issue) mailParticipants(e Engine, opType ActionType) (err error) {
func (issue *Issue) mailParticipants(e Engine, doer *User, opType ActionType) (err error) {
mentions := markup.FindAllMentions(issue.Content) mentions := markup.FindAllMentions(issue.Content)

if err = UpdateIssueMentions(e, issue.ID, mentions); err != nil { if err = UpdateIssueMentions(e, issue.ID, mentions); err != nil {
return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err)
} }


var content = issue.Content
if len(issue.Content) > 0 {
if err = mailIssueCommentToParticipants(e, issue, doer, issue.Content, nil, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
}
}

switch opType { switch opType {
case ActionCreateIssue, ActionCreatePullRequest:
if len(issue.Content) == 0 {
ct := fmt.Sprintf("Created #%d.", issue.Index)
if err = mailIssueCommentToParticipants(e, issue, doer, ct, nil, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
}
}
case ActionCloseIssue, ActionClosePullRequest: case ActionCloseIssue, ActionClosePullRequest:
content = fmt.Sprintf("Closed #%d", issue.Index)
ct := fmt.Sprintf("Closed #%d.", issue.Index)
if err = mailIssueCommentToParticipants(e, issue, doer, ct, nil, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
}
case ActionReopenIssue, ActionReopenPullRequest: case ActionReopenIssue, ActionReopenPullRequest:
content = fmt.Sprintf("Reopened #%d", issue.Index)
}

if err = mailIssueCommentToParticipants(e, issue, issue.Poster, content, nil, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
ct := fmt.Sprintf("Reopened #%d.", issue.Index)
if err = mailIssueCommentToParticipants(e, issue, doer, ct, nil, mentions); err != nil {
log.Error("mailIssueCommentToParticipants: %v", err)
}
} }


return nil return nil


+ 3
- 3
modules/notification/mail/mail.go View File

@@ -42,7 +42,7 @@ func (m *mailNotifier) NotifyCreateIssueComment(doer *models.User, repo *models.
} }


func (m *mailNotifier) NotifyNewIssue(issue *models.Issue) { func (m *mailNotifier) NotifyNewIssue(issue *models.Issue) {
if err := issue.MailParticipants(models.ActionCreateIssue); err != nil {
if err := issue.MailParticipants(issue.Poster, models.ActionCreateIssue); err != nil {
log.Error("MailParticipants: %v", err) log.Error("MailParticipants: %v", err)
} }
} }
@@ -63,13 +63,13 @@ func (m *mailNotifier) NotifyIssueChangeStatus(doer *models.User, issue *models.
} }
} }


if err := issue.MailParticipants(actionType); err != nil {
if err := issue.MailParticipants(doer, actionType); err != nil {
log.Error("MailParticipants: %v", err) log.Error("MailParticipants: %v", err)
} }
} }


func (m *mailNotifier) NotifyNewPullRequest(pr *models.PullRequest) { func (m *mailNotifier) NotifyNewPullRequest(pr *models.PullRequest) {
if err := pr.Issue.MailParticipants(models.ActionCreatePullRequest); err != nil {
if err := pr.Issue.MailParticipants(pr.Issue.Poster, models.ActionCreatePullRequest); err != nil {
log.Error("MailParticipants: %v", err) log.Error("MailParticipants: %v", err)
} }
} }


Loading…
Cancel
Save