Gitblit offers several extension points for enhancing and customizing it's runtime behavior.
-Each available extension point has a sample implementation in the [gitblit-cookbook-plugin (Maven project)](https://dev.gitblit.com/summary/gitblit-cookbook-plugin.git).
+Each available extension point has a sample implementation in the [gitblit-cookbook-plugin (Maven project)](https://github.com/gitblit/gitblit-cookbook-plugin).
+
+**NOTE:**
+Gitblit does not yet offer a comprehensize dependency injection architecture. This will be addressed in a subsequent release. For now you may access all of Gitblit's core managers through a static singleton app context:
+
+```java
+import com.gitblit.extensions.GitblitPlugin;
+import com.gitblit.servlet.GitblitContext;
+import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.manager.IUserManager;
+import com.gitblit.manager.IAuthenticationManager;
+import com.gitblit.manager.INotificationManager;
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IProjectManager;
+import com.gitblit.manager.IFederationManager;
+import com.gitblit.manager.IPluginManager;
+import com.gitblit.manager.IGitblit;
+
+public class ExamplePlugin extends GitblitPlugin {
+
+ @Override
+ public void start() {
+ IRuntimeManager runtime = GitblitContext.getManager(IRuntimeManager.class);
+ IUserManager users = GitblitContext.getManager(IUserManager.class);
+ IAuthenticationManager auth = GitblitContext.getManager(IAuthenticationManager.class);
+ INotificationManager notifications = GitblitContext.getManager(INotificationManager.class);
+ IRepositoryManager repos = GitblitContext.getManager(IRepositoryManager.class);
+ IProjectManager projects = GitblitContext.getManager(IProjectManager.class);
+ IFederationManager federation = GitblitContext.getManager(IFederationManager.class);
+ IPluginManager plugins = GitblitContext.getManager(IPluginManager.class);
+ IGitblit gitblit = GitblitContext.getManager(IGitblit.class);
+ }
+}
+```
### SSH Dispatch Command
*SINCE 1.5.0*
-You can provide your own custom SSH commands by subclassing the *DispatchCommand* class.
+You can provide your own custom SSH command hierarchies by subclassing the *DispatchCommand* class.
```java
import ro.fortsoft.pf4j.Extension;
-
+import org.kohsuke.args4j.Option;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.gitblit.models.UserModel;
import com.gitblit.transport.ssh.commands.CommandMetaData;
import com.gitblit.transport.ssh.commands.DispatchCommand;
+import com.gitblit.transport.ssh.commands.UsageExample;
@Extension
@CommandMetaData(name = "mycommands", description = "Sample SSH dispatcher")
register(user, SubDispatcher1.class);
register(user, SubDispatcher2.class);
}
+
+ @CommandMetaData(name = "commanda", aliases = { "ca" }, description = "description of command a")
+ @UsageExample(syntax = "${cmd} --myflag", description = "description of commanda with --myflag")
+ public static class CommandA extends SshCommand {
+
+ protected final Logger log = LoggerFactory.getLogger(getClass());
+
+ @Option(name = "--myflag", aliases = { "-m" }, usage = "enable myflag")
+ boolean myflag;
+
+ @Override
+ public void run() throws Failure {
+ if (myflag) {
+ log.info("Run with --myflag");
+ } else {
+ log.info("Run without --myflag");
+ }
+ }
+ }
}
```
Plugin-Description: Command and control Gitblit over SSH
Plugin-Class: com.gitblit.plugin.powertools.Powertools
Plugin-Version: 1.2.0
+ Plugin-Requires: 1.5.0
Plugin-Provider: gitblit.com
In addition to extending Gitblit core, plugins can also define extension points that may be implemented by other plugins. Therefore a plugin may depend on other plugins.
**NOTE:**
The pf4j plugin framework relies on a javac apt processor to generate compile-time extension information, so be sure to enable apt processing in your build process.
-#### Limitations of Dependencies & Requires
+#### Limitations of Dependencies
-Plugins may specify dependencies by ID, but may not specify specific versions of a dependency. The plugin registry allows you to specify a *requires* version of Gitblit, but this is not currently enforced.
+Plugins may specify dependencies by ID, but may not specify specific versions of a dependency.
### Managing Plugins