Add assignee as CC/Reviewer

When a user is added as assignee it should also be added as reviewer.

Change-Id: I249a2f3f057999154dc29c155bf2b0608494bd0d
This commit is contained in:
Sven Selberg
2016-09-26 16:40:03 +02:00
parent 4d64f9764a
commit 456e43a8b6
4 changed files with 59 additions and 5 deletions

View File

@@ -18,10 +18,12 @@ import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.TruthJUnit.assume;
import static java.util.concurrent.TimeUnit.SECONDS;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.extensions.api.changes.AssigneeInput;
import com.google.gerrit.extensions.client.ReviewerState;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.testutil.TestTimeUtil;
@@ -80,6 +82,27 @@ public class AssigneeIT extends AbstractDaemonTest {
assertThat(itr.next()._accountId).isEqualTo(admin.getId().get());
}
@Test
public void testAssigneeAddedAsReviewer() throws Exception {
ReviewerState state;
// Assignee is added as CC, if back-end is reviewDb (that does not support
// CC) CC is stored as REVIEWER
if (notesMigration.readChanges()) {
state = ReviewerState.CC;
} else {
state = ReviewerState.REVIEWER;
}
PushOneCommit.Result r = createChange();
Iterable<AccountInfo> reviewers = getReviewers(r, state);
assertThat(reviewers).isNull();
assertThat(setAssignee(r, user.email)._accountId)
.isEqualTo(user.getId().get());
reviewers = getReviewers(r, state);
assertThat(reviewers).hasSize(1);
AccountInfo reviewer = Iterables.getFirst(reviewers, null);
assertThat(reviewer._accountId).isEqualTo(user.getId().get());
}
@Test
public void testSetAlreadyExistingAssignee() throws Exception {
PushOneCommit.Result r = createChange();
@@ -112,6 +135,11 @@ public class AssigneeIT extends AbstractDaemonTest {
return gApi.changes().id(r.getChange().getId().get()).getPastAssignees();
}
private Iterable<AccountInfo> getReviewers(PushOneCommit.Result r,
ReviewerState state) throws Exception {
return get(r.getChangeId()).reviewers.get(state);
}
private AccountInfo setAssignee(PushOneCommit.Result r, String identifieer)
throws Exception {
AssigneeInput input = new AssigneeInput();

View File

@@ -425,7 +425,7 @@ class ChangeApiImpl implements ChangeApi {
throws RestApiException {
try {
return putAssignee.apply(change, input).value();
} catch (UpdateException e) {
} catch (UpdateException | IOException | OrmException e) {
throw new RestApiException("Cannot set assignee", e);
}
}

View File

@@ -262,7 +262,7 @@ public class PostReviewers
return addition;
}
class Addition {
public class Addition {
final AddReviewerResult result;
final Op op;
@@ -309,7 +309,7 @@ public class PostReviewers
}
}
class Op extends BatchUpdate.Op {
public class Op extends BatchUpdate.Op {
final Map<Account.Id, ChangeControl> reviewers;
final ReviewerState state;
final NotifyHandling notify;

View File

@@ -15,19 +15,26 @@
package com.google.gerrit.server.change;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
import com.google.gerrit.extensions.api.changes.AssigneeInput;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.client.ReviewerState;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.AccountJson;
import com.google.gerrit.server.change.PostReviewers.Addition;
import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.UpdateException;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
@Singleton
public class PutAssignee
implements RestModifyView<ChangeResource, AssigneeInput> {
@@ -35,26 +42,45 @@ public class PutAssignee
private final SetAssigneeOp.Factory assigneeFactory;
private final BatchUpdate.Factory batchUpdateFactory;
private final Provider<ReviewDb> db;
private final PostReviewers postReviewers;
@Inject
PutAssignee(SetAssigneeOp.Factory assigneeFactory,
BatchUpdate.Factory batchUpdateFactory,
Provider<ReviewDb> db) {
Provider<ReviewDb> db,
PostReviewers postReviewers) {
this.assigneeFactory = assigneeFactory;
this.batchUpdateFactory = batchUpdateFactory;
this.db = db;
this.postReviewers = postReviewers;
}
@Override
public Response<AccountInfo> apply(ChangeResource rsrc, AssigneeInput input)
throws RestApiException, UpdateException {
throws RestApiException, UpdateException, OrmException, IOException {
try (BatchUpdate bu = batchUpdateFactory.create(db.get(),
rsrc.getChange().getProject(), rsrc.getControl().getUser(),
TimeUtil.nowTs())) {
SetAssigneeOp op = assigneeFactory.create(input);
bu.addOp(rsrc.getId(), op);
PostReviewers.Addition reviewersAddition =
addAssigneeAsCC(rsrc, input.assignee);
bu.addOp(rsrc.getId(), reviewersAddition.op);
bu.execute();
reviewersAddition.gatherResults();
return Response.ok(AccountJson.toAccountInfo(op.getNewAssignee()));
}
}
private Addition addAssigneeAsCC(ChangeResource rsrc, String assignee)
throws OrmException, RestApiException, IOException {
AddReviewerInput reviewerInput = new AddReviewerInput();
reviewerInput.reviewer = assignee;
reviewerInput.state = ReviewerState.CC;
reviewerInput.confirmed = true;
reviewerInput.notify = NotifyHandling.NONE;
return postReviewers.prepareApplication(rsrc, reviewerInput);
}
}