From 559fc5542efd5bc2ef4053d81dde9996753e89e2 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Thu, 11 Jul 2013 11:47:40 +0900 Subject: [PATCH] Send notification email for new changes created by ChangeInserter New change notification was not being sent for changes created by the ChangeInserter. I.e. changes created by using the revert and cherry pick buttons on the Web UI. Update the ChangeInserter to send notification email to reviewers for new changes. Allow the caller to set extra CC recipients, or suppress sending of emails. Suppress mails from being sent from the ChangeInserter when called from ReceiveCommits. ReceiveCommits sends mails in a subthread and this functionality is not yet implemented in ChangeInserter. This is a rework of commit 41b51ccd9c740b4f93e0b94f8b9375b4f7a8d762 which did not work due to missing bind of request scope propagator. Change-Id: Id75645b7faf0f5553161cee2e2b2d945e2e1cc88 --- .../gerrit/server/change/ChangeInserter.java | 38 +++++++++++++++++++ .../gerrit/server/git/ReceiveCommits.java | 5 ++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java index dcda7f75e2..0d051a41e0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java @@ -30,6 +30,7 @@ import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.config.TrackingFooters; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; import com.google.gerrit.server.index.ChangeIndexer; +import com.google.gerrit.server.mail.CreateChangeSender; import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.project.RefControl; import com.google.gwtorm.server.OrmException; @@ -39,6 +40,8 @@ import com.google.inject.assistedinject.Assisted; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.Collections; import java.util.Set; @@ -48,12 +51,16 @@ public class ChangeInserter { ChangeInserter create(RefControl ctl, Change c, RevCommit rc); } + private static final Logger log = + LoggerFactory.getLogger(ChangeInserter.class); + private final Provider dbProvider; private final GitReferenceUpdated gitRefUpdated; private final ChangeHooks hooks; private final ApprovalsUtil approvalsUtil; private final TrackingFooters trackingFooters; private final ChangeIndexer indexer; + private final CreateChangeSender.Factory createChangeSenderFactory; private final RefControl refControl; private final Change change; @@ -63,7 +70,9 @@ public class ChangeInserter { private ChangeMessage changeMessage; private Set reviewers; + private Set extraCC; private boolean runHooks; + private boolean sendMail; @Inject ChangeInserter(Provider dbProvider, @@ -73,6 +82,7 @@ public class ChangeInserter { ApprovalsUtil approvalsUtil, TrackingFooters trackingFooters, ChangeIndexer indexer, + CreateChangeSender.Factory createChangeSenderFactory, @Assisted RefControl refControl, @Assisted Change change, @Assisted RevCommit commit) { @@ -82,11 +92,14 @@ public class ChangeInserter { this.approvalsUtil = approvalsUtil; this.trackingFooters = trackingFooters; this.indexer = indexer; + this.createChangeSenderFactory = createChangeSenderFactory; this.refControl = refControl; this.change = change; this.commit = commit; this.reviewers = Collections.emptySet(); + this.extraCC = Collections.emptySet(); this.runHooks = true; + this.sendMail = true; patchSet = new PatchSet(new PatchSet.Id(change.getId(), INITIAL_PATCH_SET_ID)); @@ -108,6 +121,11 @@ public class ChangeInserter { return this; } + public ChangeInserter setExtraCC(Set extraCC) { + this.extraCC = extraCC; + return this; + } + public ChangeInserter setDraft(boolean draft) { change.setStatus(draft ? Change.Status.DRAFT : Change.Status.NEW); patchSet.setDraft(draft); @@ -119,6 +137,11 @@ public class ChangeInserter { return this; } + public ChangeInserter setSendMail(boolean sendMail) { + this.sendMail = sendMail; + return this; + } + public PatchSet getPatchSet() { return patchSet; } @@ -149,8 +172,23 @@ public class ChangeInserter { indexer.index(change); gitRefUpdated.fire(change.getProject(), patchSet.getRefName(), ObjectId.zeroId(), commit); + if (runHooks) { hooks.doPatchsetCreatedHook(change, patchSet, db); } + + if (sendMail) { + try { + CreateChangeSender cm = + createChangeSenderFactory.create(change); + cm.setFrom(change.getOwner()); + cm.setPatchSet(patchSet, patchSetInfo); + cm.addReviewers(reviewers); + cm.addExtraCC(extraCC); + cm.send(); + } catch (Exception err) { + log.error("Cannot send email for new change " + change.getId(), err); + } + } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java index aed72ee9b2..f581c7d37f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java @@ -1523,7 +1523,10 @@ public class ReceiveCommits { recipients.add(getRecipientsFromFooters(accountResolver, ps, footerLines)); recipients.remove(me); - ins.setReviewers(recipients.getReviewers()).insert(); + ins + .setReviewers(recipients.getReviewers()) + .setSendMail(false) + .insert(); created = true; workQueue.getDefaultQueue()