From a924a90349a78ebe8e7eb560e435a7ddc1de9b84 Mon Sep 17 00:00:00 2001
From: 6543 <6543@obermui.de>
Date: Thu, 27 Feb 2020 11:07:05 +0100
Subject: [PATCH] [BugFix] Avoid mailing explicit unwatched (#10475)

* Avoid mailing explicit unwatched

* CI.restart()

* back to normal

Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com>
---
 models/issue_watch.go         |  6 +++---
 services/mailer/mail_issue.go | 10 +++++++++-
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/models/issue_watch.go b/models/issue_watch.go
index 9046e4d2f..dea6aa5a5 100644
--- a/models/issue_watch.go
+++ b/models/issue_watch.go
@@ -64,11 +64,11 @@ func getIssueWatch(e Engine, userID, issueID int64) (iw *IssueWatch, exists bool
 	return
 }
 
-// GetIssueWatchersIDs returns IDs of subscribers to a given issue id
+// GetIssueWatchersIDs returns IDs of subscribers or explicit unsubscribers to a given issue id
 // but avoids joining with `user` for performance reasons
 // User permissions must be verified elsewhere if required
-func GetIssueWatchersIDs(issueID int64) ([]int64, error) {
-	return getIssueWatchersIDs(x, issueID, true)
+func GetIssueWatchersIDs(issueID int64, watching bool) ([]int64, error) {
+	return getIssueWatchersIDs(x, issueID, watching)
 }
 
 func getIssueWatchersIDs(e Engine, issueID int64, watching bool) ([]int64, error) {
diff --git a/services/mailer/mail_issue.go b/services/mailer/mail_issue.go
index 696adfadd..1030a9548 100644
--- a/services/mailer/mail_issue.go
+++ b/services/mailer/mail_issue.go
@@ -62,7 +62,7 @@ func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []int64) e
 	unfiltered = append(unfiltered, ids...)
 
 	// =========== Issue watchers ===========
-	ids, err = models.GetIssueWatchersIDs(ctx.Issue.ID)
+	ids, err = models.GetIssueWatchersIDs(ctx.Issue.ID, true)
 	if err != nil {
 		return fmt.Errorf("GetIssueWatchersIDs(%d): %v", ctx.Issue.ID, err)
 	}
@@ -80,6 +80,14 @@ func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []int64) e
 
 	// Avoid mailing the doer
 	visited[ctx.Doer.ID] = true
+	// Avoid mailing explicit unwatched
+	ids, err = models.GetIssueWatchersIDs(ctx.Issue.ID, false)
+	if err != nil {
+		return fmt.Errorf("GetIssueWatchersIDs(%d): %v", ctx.Issue.ID, err)
+	}
+	for _, i := range ids {
+		visited[i] = true
+	}
 
 	if err = mailIssueCommentBatch(ctx, unfiltered, visited, false); err != nil {
 		return fmt.Errorf("mailIssueCommentBatch(): %v", err)