@ -19,15 +19,27 @@ func (issue *Issue) mailSubject() string {
}
// mailIssueCommentToParticipants can be used for both new issue creation and comment.
// This function sends two list of emails:
// 1. Repository watchers and users who are participated in comments.
// 2. Users who are not in 1. but get mentioned in current issue/comment.
func mailIssueCommentToParticipants ( issue * Issue , doer * User , mentions [ ] string ) error {
if ! setting . Service . EnableNotifyMail {
return nil
}
// Mail watchers.
watchers , err := GetWatchers ( issue . RepoID )
if err != nil {
return fmt . Errorf ( "GetWatchers [%d]: %v" , issue . RepoID , err )
return fmt . Errorf ( "GetWatchers [repo_id: %d]: %v" , issue . RepoID , err )
}
participants , err := GetParticipantsByIssueID ( issue . ID )
if err != nil {
return fmt . Errorf ( "GetParticipantsByIssueID [issue_id: %d]: %v" , issue . ID , err )
}
// In case the issue poster is not watching the repository,
// even if we have duplicated in watchers, can be safely filtered out.
if issue . PosterID != doer . ID {
participants = append ( participants , issue . Poster )
}
tos := make ( [ ] string , 0 , len ( watchers ) ) // List of email addresses.
@ -48,6 +60,16 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
tos = append ( tos , to . Email )
names = append ( names , to . Name )
}
for i := range participants {
if participants [ i ] . ID == doer . ID {
continue
} else if com . IsSliceContainsStr ( names , participants [ i ] . Name ) {
continue
}
tos = append ( tos , participants [ i ] . Email )
names = append ( names , participants [ i ] . Name )
}
SendIssueCommentMail ( issue , doer , tos )
// Mail mentioned people and exclude watchers.