- 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/5977tags/v1.9.0-rc1
| @@ -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 | ||||
| @@ -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 | ||||
| @@ -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) | ||||
| } | } | ||||
| } | } | ||||