From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Sat, 30 Apr 2016 04:19:14 -0400
Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates

---
 src/main/java/com/gitblit/tickets/TicketNotifier.java |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/gitblit/tickets/TicketNotifier.java b/src/main/java/com/gitblit/tickets/TicketNotifier.java
index 313f1a7..5979cf2 100644
--- a/src/main/java/com/gitblit/tickets/TicketNotifier.java
+++ b/src/main/java/com/gitblit/tickets/TicketNotifier.java
@@ -135,6 +135,7 @@
 			StringBuilder html = new StringBuilder();
 			html.append("<head>");
 			html.append(readStyle());
+			html.append(readViewTicketAction(ticket));
 			html.append("</head>");
 			html.append("<body>");
 			html.append(MarkdownUtils.transformGFM(settings, markdown, ticket.repository));
@@ -204,7 +205,9 @@
 			} catch (Exception e) {
 				Logger.getLogger(getClass()).error("failed to get changed paths", e);
 			} finally {
-				repo.close();
+				if (repo != null) {
+					repo.close();
+				}
 			}
 
 			String compareUrl = ticketService.getCompareUrl(ticket, base, patchset.tip);
@@ -489,6 +492,7 @@
 		instructions = instructions.replace("${ticketRef}", ticketBranch);
 		instructions = instructions.replace("${patchsetRef}", patchsetBranch);
 		instructions = instructions.replace("${reviewBranch}", reviewBranch);
+		instructions = instructions.replace("${ticketBranch}", ticketBranch);
 
 		return instructions;
 	}
@@ -519,9 +523,16 @@
 
 		//
 		// Direct TO recipients
+		// reporter & responsible
 		//
+		Set<String> tos = new TreeSet<String>();
+		tos.add(ticket.createdBy);
+		if (!StringUtils.isEmpty(ticket.responsible)) {
+			tos.add(ticket.responsible);
+		}
+
 		Set<String> toAddresses = new TreeSet<String>();
-		for (String name : ticket.getParticipants()) {
+		for (String name : tos) {
 			UserModel user = userManager.getUserModel(name);
 			if (user != null && !user.disabled) {
 				if (!StringUtils.isEmpty(user.emailAddress)) {
@@ -535,12 +546,16 @@
 				}
 			}
 		}
-		mailing.setRecipients(toAddresses);
 
 		//
 		// CC recipients
 		//
 		Set<String> ccs = new TreeSet<String>();
+
+		// repository owners
+		if (!ArrayUtils.isEmpty(repository.owners)) {
+			ccs.addAll(repository.owners);
+		}
 
 		// cc users mentioned in last comment
 		Change lastChange = ticket.changes.get(ticket.changes.size() - 1);
@@ -580,6 +595,14 @@
 		}
 		ccAddresses.addAll(settings.getStrings(Keys.mail.mailingLists));
 
+		// respect the author's email preference
+		UserModel lastAuthor = userManager.getUserModel(lastChange.author);
+		if (lastAuthor != null && !lastAuthor.getPreferences().isEmailMeOnMyTicketChanges()) {
+			toAddresses.remove(lastAuthor.emailAddress);
+			ccAddresses.remove(lastAuthor.emailAddress);
+		}
+
+		mailing.setRecipients(toAddresses);
 		mailing.setCCs(ccAddresses);
 	}
 
@@ -591,6 +614,12 @@
 		return sb.toString();
 	}
 
+	protected String readViewTicketAction(TicketModel ticket) {
+		String action = readResource("viewTicket.html");
+		action = action.replace("${url}", ticketService.getTicketUrl(ticket));
+		return action;
+	}
+
 	protected String readResource(String resource) {
 		StringBuilder sb = new StringBuilder();
 		InputStream is = null;

--
Gitblit v1.9.1