diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java index ea5d614b83..c8309ade63 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java @@ -14,6 +14,7 @@ package com.google.gerrit.acceptance; +import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Lists; import com.google.gerrit.acceptance.InProcessProtocol.Context; import com.google.gerrit.common.data.Capable; @@ -296,7 +297,7 @@ class InProcessProtocol extends TestProtocol { throw new ServiceNotAuthorizedException(); } - AsyncReceiveCommits arc = factory.create(ctl, db); + AsyncReceiveCommits arc = factory.create(ctl, db, ImmutableSetMultimap.of()); ReceivePack rp = arc.getReceivePack(); Capable r = arc.canUpload(); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java index 6e02bdedf3..c14a6eef13 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java @@ -15,6 +15,7 @@ package com.google.gerrit.httpd; import com.google.common.cache.Cache; +import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Lists; import com.google.gerrit.common.data.Capable; import com.google.gerrit.extensions.registration.DynamicSet; @@ -294,9 +295,7 @@ public class GitOverHttpServlet extends GitServlet { throw new ServiceNotAuthorizedException(); } - AsyncReceiveCommits arc = factory.create(pc, db); - arc.init(); - + AsyncReceiveCommits arc = factory.create(pc, db, ImmutableSetMultimap.of()); ReceivePack rp = arc.getReceivePack(); req.setAttribute(ATT_ARC, arc); return rp; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java index bf57cd44b6..6d2461a2ba 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java @@ -14,7 +14,7 @@ package com.google.gerrit.server.git.receive; -import com.google.gerrit.common.Nullable; +import com.google.common.collect.SetMultimap; import com.google.gerrit.common.data.Capable; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.reviewdb.client.Account; @@ -27,6 +27,7 @@ import com.google.gerrit.server.git.MultiProgressMonitor; import com.google.gerrit.server.git.ProjectRunnable; import com.google.gerrit.server.git.TransferConfig; import com.google.gerrit.server.git.VisibleRefFilter; +import com.google.gerrit.server.notedb.ReviewerStateInternal; import com.google.gerrit.server.permissions.PermissionBackend; import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.permissions.ProjectPermission; @@ -68,7 +69,10 @@ public class AsyncReceiveCommits implements PreReceiveHook { private static final String TIMEOUT_NAME = "ReceiveCommitsOverallTimeout"; public interface Factory { - AsyncReceiveCommits create(ProjectControl projectControl, Repository repository); + AsyncReceiveCommits create( + ProjectControl projectControl, + Repository repository, + SetMultimap extraReviewers); } public static class Module extends PrivateModule { @@ -168,7 +172,8 @@ public class AsyncReceiveCommits implements PreReceiveHook { Provider lazyPostReceive, @Named(TIMEOUT_NAME) long timeoutMillis, @Assisted ProjectControl projectControl, - @Assisted Repository repo) + @Assisted Repository repo, + @Assisted SetMultimap extraReviewers) throws PermissionBackendException { this.executor = executor; this.scopePropagator = scopePropagator; @@ -209,7 +214,8 @@ public class AsyncReceiveCommits implements PreReceiveHook { advHooks.add(new HackPushNegotiateHook()); rp.setAdvertiseRefsHook(AdvertiseRefsHookChain.newChain(advHooks)); - rc = factory.create(projectControl, rp, allRefsWatcher); + rc = factory.create(projectControl, rp, allRefsWatcher, extraReviewers); + rc.init(); progress = new MultiProgressMonitor(new MessageSenderOutputStream(), "Processing changes"); } @@ -254,19 +260,4 @@ public class AsyncReceiveCommits implements PreReceiveHook { public ReceivePack getReceivePack() { return rp; } - - public void init() { - init(null, null); - } - - public void init( - @Nullable Collection extraReviewers, @Nullable Collection extraCcs) { - rc.init(); - if (extraReviewers != null) { - rc.addReviewers(extraReviewers); - } - if (extraCcs != null) { - rc.addExtraCC(extraCcs); - } - } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java index ce4b810606..de19e6ebf6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java @@ -43,12 +43,14 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Iterables; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.MultimapBuilder; +import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; import com.google.common.collect.SortedSetMultimap; import com.google.gerrit.common.Nullable; @@ -119,6 +121,7 @@ import com.google.gerrit.server.index.change.ChangeIndexer; import com.google.gerrit.server.mail.MailUtil.MailRecipients; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.notedb.NotesMigration; +import com.google.gerrit.server.notedb.ReviewerStateInternal; import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.permissions.ChangePermission; import com.google.gerrit.server.permissions.GlobalPermission; @@ -224,7 +227,10 @@ class ReceiveCommits { interface Factory { ReceiveCommits create( - ProjectControl projectControl, ReceivePack receivePack, AllRefsWatcher allRefsWatcher); + ProjectControl projectControl, + ReceivePack receivePack, + AllRefsWatcher allRefsWatcher, + SetMultimap extraReviewers); } interface MessageSender { @@ -288,8 +294,7 @@ class ReceiveCommits { } }; - private Set reviewersFromCommandLine = Sets.newLinkedHashSet(); - private Set ccFromCommandLine = Sets.newLinkedHashSet(); + private final ImmutableSetMultimap extraReviewers; private final IdentifiedUser user; private final ReviewDb db; @@ -400,7 +405,8 @@ class ReceiveCommits { MergedByPushOp.Factory mergedByPushOpFactory, @Assisted ProjectControl projectControl, @Assisted ReceivePack rp, - @Assisted AllRefsWatcher allRefsWatcher) + @Assisted AllRefsWatcher allRefsWatcher, + @Assisted SetMultimap extraReviewers) throws IOException { this.user = projectControl.getUser().asIdentifiedUser(); this.db = db; @@ -455,6 +461,8 @@ class ReceiveCommits { this.newChangeForAllNotInTarget = ps.isCreateNewChangeForAllNotInTarget(); permissions = permissionBackend.user(user).project(project.getNameKey()); + + this.extraReviewers = ImmutableSetMultimap.copyOf(extraReviewers); } void init() { @@ -463,16 +471,6 @@ class ReceiveCommits { } } - /** Add reviewers for new (or updated) changes. */ - void addReviewers(Collection who) { - reviewersFromCommandLine.addAll(who); - } - - /** Add reviewers for new (or updated) changes. */ - void addExtraCC(Collection who) { - ccFromCommandLine.addAll(who); - } - /** Set a message sender for this operation. */ void setMessageSender(MessageSender ms) { messageSender = ms != null ? ms : new ReceivePackMessageSender(); @@ -1392,8 +1390,8 @@ class ReceiveCommits { logDebug("Found magic branch {}", cmd.getRefName()); magicBranch = new MagicBranchInput(user, cmd, labelTypes, notesMigration); - magicBranch.reviewer.addAll(reviewersFromCommandLine); - magicBranch.cc.addAll(ccFromCommandLine); + magicBranch.reviewer.addAll(extraReviewers.get(ReviewerStateInternal.REVIEWER)); + magicBranch.cc.addAll(extraReviewers.get(ReviewerStateInternal.CC)); String ref; CmdLineParser clp = optionParserFactory.create(magicBranch); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java index d8aac07f71..f13df40031 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java @@ -14,21 +14,22 @@ package com.google.gerrit.sshd.commands; +import com.google.common.collect.MultimapBuilder; +import com.google.common.collect.SetMultimap; import com.google.gerrit.common.data.Capable; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.git.VisibleRefFilter; import com.google.gerrit.server.git.receive.AsyncReceiveCommits; +import com.google.gerrit.server.notedb.ReviewerStateInternal; import com.google.gerrit.sshd.AbstractGitCommand; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshSession; import com.google.inject.Inject; import java.io.IOException; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import org.eclipse.jgit.errors.TooLargeObjectInPackException; import org.eclipse.jgit.errors.UnpackException; import org.eclipse.jgit.lib.Ref; @@ -51,8 +52,8 @@ final class Receive extends AbstractGitCommand { @Inject private IdentifiedUser currentUser; @Inject private SshSession session; - private final Set reviewerId = new HashSet<>(); - private final Set ccId = new HashSet<>(); + private final SetMultimap reviewers = + MultimapBuilder.hashKeys(2).hashSetValues().build(); @Option( name = "--reviewer", @@ -61,7 +62,7 @@ final class Receive extends AbstractGitCommand { usage = "request reviewer for change(s)" ) void addReviewer(Account.Id id) { - reviewerId.add(id); + reviewers.put(ReviewerStateInternal.REVIEWER, id); } @Option( @@ -71,7 +72,7 @@ final class Receive extends AbstractGitCommand { usage = "CC user on change(s)" ) void addCC(Account.Id id) { - ccId.add(id); + reviewers.put(ReviewerStateInternal.CC, id); } @Override @@ -80,14 +81,13 @@ final class Receive extends AbstractGitCommand { throw new Failure(1, "fatal: receive-pack not permitted on this server"); } - AsyncReceiveCommits arc = factory.create(projectControl, repo); + AsyncReceiveCommits arc = factory.create(projectControl, repo, reviewers); Capable r = arc.canUpload(); if (r != Capable.OK) { throw die(r.getMessage()); } - arc.init(reviewerId, ccId); ReceivePack rp = arc.getReceivePack(); try { rp.receive(in, out, err);