Convert VisibleRefFilter to assisted factory

Callers have to pass a number of arguments to build and configure the
VisibleRefFilter.  Instead of forcing callers to pass around many
arguments, use an assisted injection factory to create the instance.

Rely on the context Provider<ReviewDb> and Provider<CurrentUser> to
gain database access and user identity within the filter. Given all
current call sites, these should already be populated.

Change-Id: I8197ee773c94f16472d53162fb70791c45899c1b
This commit is contained in:
Shawn Pearce
2017-04-29 13:20:11 -07:00
committed by David Pursehouse
parent a9297614ed
commit ab841f6946
15 changed files with 113 additions and 219 deletions

View File

@@ -17,20 +17,18 @@ package com.google.gerrit.sshd.commands;
import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
import static org.eclipse.jgit.lib.RefDatabase.ALL;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountResolver;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.SearchingChangeCacheImpl;
import com.google.gerrit.server.git.TagCache;
import com.google.gerrit.server.git.VisibleRefFilter;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.util.ManualRequestContext;
import com.google.gerrit.server.util.OneOffRequestContext;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
import com.google.gwtorm.server.OrmException;
@@ -50,16 +48,10 @@ import org.kohsuke.args4j.Option;
)
public class LsUserRefs extends SshCommand {
@Inject private AccountResolver accountResolver;
@Inject private IdentifiedUser.GenericFactory userFactory;
@Inject private OneOffRequestContext requestContext;
@Inject private VisibleRefFilter.Factory refFilterFactory;
@Inject private ReviewDb db;
@Inject private TagCache tagCache;
@Inject private ChangeNotes.Factory changeNotesFactory;
@Inject @Nullable private SearchingChangeCacheImpl changeCache;
@Inject private GitRepositoryManager repoManager;
@Option(
name = "--project",
@@ -82,8 +74,6 @@ public class LsUserRefs extends SshCommand {
@Option(name = "--only-refs-heads", usage = "list only refs under refs/heads")
private boolean onlyRefsHeads;
@Inject private GitRepositoryManager repoManager;
@Override
protected void run() throws Failure {
Account userAccount;
@@ -92,21 +82,19 @@ public class LsUserRefs extends SshCommand {
} catch (OrmException e) {
throw die(e);
}
if (userAccount == null) {
stdout.print("No single user could be found when searching for: " + userName + '\n');
stdout.flush();
return;
}
IdentifiedUser user = userFactory.create(userAccount.getId());
ProjectControl userProjectControl = projectControl.forUser(user);
try (Repository repo =
repoManager.openRepository(userProjectControl.getProject().getNameKey())) {
Project.NameKey projectName = projectControl.getProject().getNameKey();
try (Repository repo = repoManager.openRepository(projectName);
ManualRequestContext ctx = requestContext.openAs(userAccount.getId())) {
try {
Map<String, Ref> refsMap =
new VisibleRefFilter(
tagCache, changeNotesFactory, changeCache, repo, userProjectControl, db, true)
refFilterFactory
.create(projectControl.getProjectState(), repo)
.filter(repo.getRefDatabase().getRefs(ALL), false);
for (String ref : refsMap.keySet()) {
@@ -115,13 +103,12 @@ public class LsUserRefs extends SshCommand {
}
}
} catch (IOException e) {
throw new Failure(
1, "fatal: Error reading refs: '" + projectControl.getProject().getNameKey(), e);
throw new Failure(1, "fatal: Error reading refs: '" + projectName, e);
}
} catch (RepositoryNotFoundException e) {
throw die("'" + projectControl.getProject().getNameKey() + "': not a git archive");
} catch (IOException e) {
throw die("Error opening: '" + projectControl.getProject().getNameKey());
throw die("'" + projectName + "': not a git archive");
} catch (IOException | OrmException e) {
throw die("Error opening: '" + projectName);
}
}
}

View File

@@ -15,16 +15,11 @@
package com.google.gerrit.sshd.commands;
import com.google.common.collect.Lists;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.SearchingChangeCacheImpl;
import com.google.gerrit.server.git.TagCache;
import com.google.gerrit.server.git.TransferConfig;
import com.google.gerrit.server.git.VisibleRefFilter;
import com.google.gerrit.server.git.validators.UploadValidationException;
import com.google.gerrit.server.git.validators.UploadValidators;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.sshd.AbstractGitCommand;
import com.google.gerrit.sshd.SshSession;
import com.google.inject.Inject;
@@ -38,22 +33,11 @@ import org.eclipse.jgit.transport.UploadPack;
/** Publishes Git repositories over SSH using the Git upload-pack protocol. */
final class Upload extends AbstractGitCommand {
@Inject private ReviewDb db;
@Inject private TransferConfig config;
@Inject private TagCache tagCache;
@Inject private ChangeNotes.Factory changeNotesFactory;
@Inject @Nullable private SearchingChangeCacheImpl changeCache;
@Inject private VisibleRefFilter.Factory refFilterFactory;
@Inject private DynamicSet<PreUploadHook> preUploadHooks;
@Inject private DynamicSet<PostUploadHook> postUploadHooks;
@Inject private UploadValidators.Factory uploadValidatorsFactory;
@Inject private SshSession session;
@Override
@@ -63,9 +47,7 @@ final class Upload extends AbstractGitCommand {
}
final UploadPack up = new UploadPack(repo);
up.setAdvertiseRefsHook(
new VisibleRefFilter(
tagCache, changeNotesFactory, changeCache, repo, projectControl, db, true));
up.setAdvertiseRefsHook(refFilterFactory.create(projectControl.getProjectState(), repo));
up.setPackConfig(config.getPackConfig());
up.setTimeout(config.getTimeout());
up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks)));