PostReviewers: Add notify handling for reviewers added email

Change-Id: I99fa47548e2bd80584260e5f4e7093d246b27539
This commit is contained in:
Sven Selberg 2016-09-26 16:15:02 +02:00
parent 8178e0e3f2
commit 4d64f9764a
4 changed files with 32 additions and 13 deletions

View File

@ -5632,6 +5632,11 @@ Whether adding the reviewer is confirmed. +
The Gerrit server may be configured to
link:config-gerrit.html#addreviewer.maxWithoutConfirmation[require a
confirmation] when adding a group as reviewer that has many members.
|`notify` |optional|
Notify handling that defines to whom email notifications should be sent
after the reviewer is added. +
Allowed values are `NONE`, `OWNER`, `OWNER_REVIEWERS` and `ALL`. +
If not set, the default is `ALL`.
|===========================
[[revision-info]]

View File

@ -24,6 +24,7 @@ public class AddReviewerInput {
public String reviewer;
public Boolean confirmed;
public ReviewerState state;
public NotifyHandling notify;
public boolean confirmed() {
return (confirmed != null) ? confirmed : false;

View File

@ -25,6 +25,7 @@ import com.google.gerrit.common.data.GroupDescription;
import com.google.gerrit.common.errors.NoSuchGroupException;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
import com.google.gerrit.extensions.api.changes.AddReviewerResult;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.api.changes.ReviewerInfo;
import com.google.gerrit.extensions.client.ReviewerState;
import com.google.gerrit.extensions.restapi.BadRequestException;
@ -169,16 +170,17 @@ public class PostReviewers
}
}
return putAccount(input.reviewer, reviewerFactory.create(rsrc, accountId),
input.state());
input.state(), input.notify);
}
private Addition putAccount(String reviewer, ReviewerResource rsrc,
ReviewerState state) throws UnprocessableEntityException {
ReviewerState state, NotifyHandling notify)
throws UnprocessableEntityException {
Account member = rsrc.getReviewerUser().getAccount();
ChangeControl control = rsrc.getReviewerControl();
if (isValidReviewer(member, control)) {
return new Addition(reviewer, rsrc.getChangeResource(),
ImmutableMap.of(member.getId(), control), state);
ImmutableMap.of(member.getId(), control), state, notify);
}
if (member.isActive()) {
throw new UnprocessableEntityException(
@ -235,7 +237,8 @@ public class PostReviewers
}
}
return new Addition(input.reviewer, rsrc, reviewers, input.state());
return new Addition(input.reviewer, rsrc, reviewers, input.state(),
input.notify);
}
private boolean isValidReviewer(Account member, ChangeControl control) {
@ -266,11 +269,12 @@ public class PostReviewers
private final Map<Account.Id, ChangeControl> reviewers;
protected Addition(String reviewer) {
this(reviewer, null, null, REVIEWER);
this(reviewer, null, null, REVIEWER, null);
}
protected Addition(String reviewer, ChangeResource rsrc,
Map<Account.Id, ChangeControl> reviewers, ReviewerState state) {
Map<Account.Id, ChangeControl> reviewers, ReviewerState state,
NotifyHandling notify) {
result = new AddReviewerResult(reviewer);
if (reviewers == null) {
this.reviewers = ImmutableMap.of();
@ -278,7 +282,7 @@ public class PostReviewers
return;
}
this.reviewers = reviewers;
op = new Op(rsrc, reviewers, state);
op = new Op(rsrc, reviewers, state, notify);
}
void gatherResults() throws OrmException {
@ -308,6 +312,7 @@ public class PostReviewers
class Op extends BatchUpdate.Op {
final Map<Account.Id, ChangeControl> reviewers;
final ReviewerState state;
final NotifyHandling notify;
List<PatchSetApproval> addedReviewers;
Collection<Account.Id> addedCCs;
@ -315,10 +320,11 @@ public class PostReviewers
private PatchSet patchSet;
Op(ChangeResource rsrc, Map<Account.Id, ChangeControl> reviewers,
ReviewerState state) {
ReviewerState state, NotifyHandling notify) {
this.rsrc = rsrc;
this.reviewers = reviewers;
this.state = state;
this.notify = notify;
}
@Override
@ -354,7 +360,7 @@ public class PostReviewers
if (addedCCs == null) {
addedCCs = new ArrayList<>();
}
emailReviewers(rsrc.getChange(), addedReviewers, addedCCs);
emailReviewers(rsrc.getChange(), addedReviewers, addedCCs, notify);
if (!addedReviewers.isEmpty()) {
List<Account.Id> reviewers =
Lists.transform(addedReviewers, PatchSetApproval::getAccountId);
@ -366,7 +372,7 @@ public class PostReviewers
}
private void emailReviewers(Change change, List<PatchSetApproval> added,
Collection<Account.Id> copied) {
Collection<Account.Id> copied, NotifyHandling notify) {
if (added.isEmpty() && copied.isEmpty()) {
return;
}
@ -393,7 +399,7 @@ public class PostReviewers
try {
AddReviewerSender cm = addReviewerSenderFactory
.create(change.getProject(), change.getId());
.create(change.getProject(), change.getId(), notify);
cm.setFrom(userId);
cm.addReviewers(toMail);
cm.addExtraCC(toCopy);

View File

@ -14,7 +14,9 @@
package com.google.gerrit.server.mail;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwtorm.server.OrmException;
@ -24,15 +26,20 @@ import com.google.inject.assistedinject.Assisted;
/** Asks a user to review a change. */
public class AddReviewerSender extends NewChangeSender {
public interface Factory {
AddReviewerSender create(Project.NameKey project, Change.Id id);
AddReviewerSender create(Project.NameKey project, Change.Id id,
NotifyHandling notify);
}
@Inject
public AddReviewerSender(EmailArguments ea,
@Assisted Project.NameKey project,
@Assisted Change.Id id)
@Assisted Change.Id id,
@Assisted @Nullable NotifyHandling notify)
throws OrmException {
super(ea, newChangeData(ea, project, id));
if (notify != null) {
setNotify(notify);
}
}
@Override