diff options
author | Saša Živkov <sasa.zivkov@sap.com> | 2014-02-24 17:15:08 +0100 |
---|---|---|
committer | Saša Živkov <sasa.zivkov@sap.com> | 2014-03-05 16:05:26 +0100 |
commit | 626c7316332875719f43667bfcfd73b6ee5f760c (patch) | |
tree | 2690d369d13d339d01b9fef086d1478a7ac2e895 | |
parent | 779ede73cd595bd265e857de0b3be1f8ea365c0d (diff) |
Add extension point to register JGit PostReceiveHooks
Plugins may want to get notified when a pack file is received.
For example, the quota plugin may want to cache the repository
size in the file system and update it every time a new pack is
received.
Change-Id: I0212eab6e4867819ebe7ecc7fc5532c26bb82282
4 files changed, 27 insertions, 1 deletions
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt index e0824cade2..7593578960 100644 --- a/Documentation/dev-plugins.txt +++ b/Documentation/dev-plugins.txt @@ -424,6 +424,14 @@ by Gerrit just before a ReceivePack instance will be used. Usually, plugins will make use of the setXXX methods on the ReceivePack to set additional properties on it. +[[post-receive-hook]] +== Post Receive-Pack Hooks + +Plugins may register PostReceiveHook instances in order to get +notified when JGit successfully receives a pack. This may be useful +for those plugins which would like to monitor changes in Git +repositories. + [[ssh]] == SSH Commands 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 feee4302a6..03d54e4d65 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.Lists; import com.google.gerrit.common.data.Capable; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Project; @@ -48,6 +49,8 @@ import org.eclipse.jgit.http.server.ServletUtils; import org.eclipse.jgit.http.server.resolver.AsIsFileService; 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.ReceivePack; import org.eclipse.jgit.transport.UploadPack; import org.eclipse.jgit.transport.resolver.ReceivePackFactory; @@ -247,13 +250,16 @@ public class GitOverHttpServlet extends GitServlet { private final AsyncReceiveCommits.Factory factory; private final TransferConfig config; private DynamicSet<ReceivePackInitializer> receivePackInitializers; + private DynamicSet<PostReceiveHook> postReceiveHooks; @Inject ReceiveFactory(AsyncReceiveCommits.Factory factory, TransferConfig config, - DynamicSet<ReceivePackInitializer> receivePackInitializers) { + DynamicSet<ReceivePackInitializer> receivePackInitializers, + DynamicSet<PostReceiveHook> postReceiveHooks) { this.factory = factory; this.config = config; this.receivePackInitializers = receivePackInitializers; + this.postReceiveHooks = postReceiveHooks; } @Override @@ -273,6 +279,8 @@ public class GitOverHttpServlet extends GitServlet { rp.setTimeout(config.getTimeout()); rp.setMaxObjectSizeLimit(config.getMaxObjectSizeLimit()); init(pc.getProject().getNameKey(), rp); + rp.setPostReceiveHook(PostReceiveHookChain.newChain( + Lists.newArrayList(postReceiveHooks))); req.setAttribute(ATT_RC, rc); return rp; } 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 bd4b56f919..c6598d4f0f 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 @@ -126,6 +126,7 @@ import com.google.inject.TypeLiteral; import com.google.inject.internal.UniqueAnnotations; import org.apache.velocity.runtime.RuntimeInstance; +import org.eclipse.jgit.transport.PostReceiveHook; import java.util.List; import java.util.Set; @@ -245,6 +246,7 @@ public class GerritGlobalModule extends FactoryModule { DynamicMap.mapOf(binder(), CapabilityDefinition.class); DynamicSet.setOf(binder(), GitReferenceUpdatedListener.class); DynamicSet.setOf(binder(), ReceivePackInitializer.class); + DynamicSet.setOf(binder(), PostReceiveHook.class); DynamicSet.setOf(binder(), NewProjectCreatedListener.class); DynamicSet.setOf(binder(), ProjectDeletedListener.class); DynamicSet.setOf(binder(), HeadUpdatedListener.class); 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 58f329f17f..a3c2cf546d 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,6 +14,7 @@ package com.google.gerrit.sshd.commands; +import com.google.common.collect.Lists; import com.google.gerrit.common.data.Capable; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Account; @@ -32,6 +33,8 @@ import org.eclipse.jgit.errors.UnpackException; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefDatabase; import org.eclipse.jgit.transport.AdvertiseRefsHook; +import org.eclipse.jgit.transport.PostReceiveHook; +import org.eclipse.jgit.transport.PostReceiveHookChain; import org.eclipse.jgit.transport.ReceivePack; import org.kohsuke.args4j.Option; import org.slf4j.Logger; @@ -64,6 +67,9 @@ final class Receive extends AbstractGitCommand { @Inject private DynamicSet<ReceivePackInitializer> receivePackInitializers; + @Inject + private DynamicSet<PostReceiveHook> postReceiveHooks; + private final Set<Account.Id> reviewerId = new HashSet<Account.Id>(); private final Set<Account.Id> ccId = new HashSet<Account.Id>(); @@ -103,6 +109,8 @@ final class Receive extends AbstractGitCommand { rp.setMaxObjectSizeLimit(config.getEffectiveMaxObjectSizeLimit( projectControl.getProjectState())); init(rp); + rp.setPostReceiveHook(PostReceiveHookChain.newChain( + Lists.newArrayList(postReceiveHooks))); try { rp.receive(in, out, err); } catch (UnpackException badStream) { |