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 24c2afaeb3..1bca390a18 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 @@ -51,6 +51,8 @@ import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.PostReceiveHook; import org.eclipse.jgit.transport.PostReceiveHookChain; +import org.eclipse.jgit.transport.PreUploadHook; +import org.eclipse.jgit.transport.PreUploadHookChain; import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.UploadPack; import org.eclipse.jgit.transport.resolver.ReceivePackFactory; @@ -188,15 +190,20 @@ public class GitOverHttpServlet extends GitServlet { static class UploadFactory implements UploadPackFactory { private final TransferConfig config; + private DynamicSet preUploadHooks; @Inject - UploadFactory(TransferConfig tc) { + UploadFactory(TransferConfig tc, + DynamicSet preUploadHooks) { this.config = tc; + this.preUploadHooks = preUploadHooks; } @Override public UploadPack create(HttpServletRequest req, Repository repo) { UploadPack up = new UploadPack(repo); + up.setPreUploadHook(PreUploadHookChain.newChain( + Lists.newArrayList(preUploadHooks))); up.setPackConfig(config.getPackConfig()); up.setTimeout(config.getTimeout()); return up; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java index 023c11521e..3111917055 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java @@ -131,6 +131,7 @@ import com.google.inject.internal.UniqueAnnotations; import org.apache.velocity.runtime.RuntimeInstance; import org.eclipse.jgit.transport.PostReceiveHook; +import org.eclipse.jgit.transport.PreUploadHook; import java.util.List; import java.util.Set; @@ -250,6 +251,7 @@ public class GerritGlobalModule extends FactoryModule { DynamicSet.setOf(binder(), CacheRemovalListener.class); DynamicMap.mapOf(binder(), CapabilityDefinition.class); DynamicSet.setOf(binder(), GitReferenceUpdatedListener.class); + DynamicSet.setOf(binder(), PreUploadHook.class);; DynamicSet.setOf(binder(), ReceivePackInitializer.class); DynamicSet.setOf(binder(), PostReceiveHook.class); DynamicSet.setOf(binder(), NewProjectCreatedListener.class); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java index fc127ec6cc..d42987d95f 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java @@ -14,6 +14,8 @@ package com.google.gerrit.sshd.commands; +import com.google.common.collect.Lists; +import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.git.ChangeCache; import com.google.gerrit.server.git.TagCache; @@ -23,6 +25,8 @@ import com.google.gerrit.sshd.AbstractGitCommand; import com.google.inject.Inject; import com.google.inject.Provider; +import org.eclipse.jgit.transport.PreUploadHook; +import org.eclipse.jgit.transport.PreUploadHookChain; import org.eclipse.jgit.transport.UploadPack; import java.io.IOException; @@ -41,6 +45,9 @@ final class Upload extends AbstractGitCommand { @Inject private ChangeCache changeCache; + @Inject + private DynamicSet preUploadHooks; + @Override protected void runImpl() throws IOException, Failure { if (!projectControl.canRunUploadPack()) { @@ -48,6 +55,8 @@ final class Upload extends AbstractGitCommand { } final UploadPack up = new UploadPack(repo); + up.setPreUploadHook(PreUploadHookChain.newChain( + Lists.newArrayList(preUploadHooks))); if (!projectControl.allRefsAreVisible()) { up.setAdvertiseRefsHook(new VisibleRefFilter(tagCache, changeCache, repo, projectControl, db.get(), true));