## Extension Points 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://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; import ro.fortsoft.pf4j.Version; 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); } @Override public void stop() { } @Override public void onInstall() { } @Override public void onUpgrade(Version oldVersion) { } @Override public void onUninstall() { } } /** * You can also create Webapp plugins that register pages. */ public class ExampleWicketPlugin extends GitblitWicketPlugin { @Override public void start() { } @Override public void stop() { } @Override public void onInstall() { } @Override public void onUpgrade(Version oldVersion) { } @Override public void onUninstall() { } @Override protected void init(GitblitWicketApp app) { app.mount("/logo", LogoPage.class); app.mount("/hello", HelloWorldPage.class); } } ``` ### SSH Dispatch Command *SINCE 1.5.0* 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.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") public class MyDispatcher extends DispatchCommand { @Override protected void setup() { // commands in this dispatcher register(CommandA.class); register(CommandB.class); // nested dispatchers register(SubDispatcher1.class); register(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"); } } } } ``` ### Pre- and Post- Receive Hook *SINCE 1.5.0* You can provide your own custom pre and/or post receive hooks by subclassing the *ReceiveHook* class. ```java import com.gitblit.extensions.ReceiveHook; import java.util.Collection; import org.eclipse.jgit.transport.ReceiveCommand; import ro.fortsoft.pf4j.Extension; @Extension public class MyReceiveHook extends ReceiveHook { @Override public void onPreReceive(GitblitReceivePack receivePack, Collection commands) { } @Override public void onPostReceive(GitblitReceivePack receivePack, Collection commands) { } } ``` ### Patchset Hook *SINCE 1.5.0* You can provide your own custom patchset hook by subclassing the *PatchsetHook* class. ```java import com.gitblit.extensions.PatchsetHook; import com.gitblit.models.TicketModel; import ro.fortsoft.pf4j.Extension; @Extension public class MyPatchsetHook extends PatchsetHook { @Override public void onNewPatchset(TicketModel ticket) { } @Override public void onUpdatePatchset(TicketModel ticket) { } @Override public void onMergePatchset(TicketModel ticket) { } } ``` ### Ticket Hook *SINCE 1.5.0* You can provide your own custom ticket hook by subclassing the *TicketHook* class. ```java import com.gitblit.extensions.TicketHook; import com.gitblit.models.TicketModel; import com.gitblit.models.TicketModel.Change; import ro.fortsoft.pf4j.Extension; @Extension public class MyTicketHook extends TicketHook { @Override public void onNewTicket(TicketModel ticket) { } @Override public void onUpdateTicket(TicketModel ticket, Change change) { } } ``` ### Request Filter *SINCE 1.6.0* You can provide your own custom request filter by subclassing the *HttpRequestFilter* class. ```java import com.gitblit.extensions.HttpRequestFilter; import ro.fortsoft.pf4j.Extension; @Extension public class MyRequestFilter extends HttpRequestFilter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { } } ``` ### User Menu Items *SINCE 1.6.0* You can provide your own user menu items by subclassing the *UserMenuExtension* class. ```java import java.util.Arrays; import java.util.List; import ro.fortsoft.pf4j.Extension; import com.gitblit.extensions.UserMenuExtension; import com.gitblit.models.Menu.ExternalLinkMenuItem; import com.gitblit.models.Menu.MenuItem; import com.gitblit.models.UserModel; @Extension public class MyUserMenuContributor extends UserMenuExtension { @Override public List getMenuItems(UserModel user) { MenuItem item = new ExternalLinkMenuItem("Github", String.format("https://github.com/%s", user.username)); return Arrays.asList(item); } } ``` ### Navigation Links *SINCE 1.6.0* You can provide your own top-level navigation links by subclassing the *NavLinkExtension* class. ```java import java.util.Arrays; import java.util.List; import ro.fortsoft.pf4j.Extension; import com.gitblit.extensions.NavLinkExtension; import com.gitblit.models.UserModel; @Extension public class MyNavLink extends NavLinkExtension { @Override public List getNavLinks(UserModel user) { NavLink link = new ExternalLinkMenuItem("Github", String.format("https://github.com/%s", user.username)); return Arrays.asList(link); } } ``` ### Server Lifecycle Listener *SINCE 1.6.0* You can provide a lifecycle listener to be notified when Gitblit has completely started and just before Gitblit is gracefully terminated. ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.fortsoft.pf4j.Extension; import com.gitblit.extensions.LifeCycleListener; @Extension public class MyLifeCycleListener extends LifeCycleListener { final Logger log = LoggerFactory.getLogger(getClass()); @Override public void onStartup() { log.info("Gitblit is Ready!!"); } @Override public void onShutdown() { log.info("Gitblit is Going Down!!"); } } ``` ### Repository Lifecycle Listener *SINCE 1.6.0* You can provide a lifecycle listener to be notified when Gitblit has created or deleted a repository. ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.fortsoft.pf4j.Extension; import com.gitblit.extensions.RepositoryLifeCycleListener; import com.gitblit.models.RepositoryModel; @Extension public class MyRepoLifeCycleListener extends RepositoryLifeCycleListener { final Logger log = LoggerFactory.getLogger(getClass()); @Override public void onCreation(RepositoryModel repo) { log.info("Gitblit created {}", repo); } @Override public void onFork(RepositoryModel origin, RepositoryModel fork) { log.info("{} forked to {}", origin, fork); } @Override public void onRename(String oldName, RepositoryModel repo) { log.info("{} renamed to {}", oldName, repo); } @Override public void onDeletion(RepositoryModel repo) { log.info("Gitblit deleted {}", repo); } } ``` ### User/Team Lifecycle Listener *SINCE 1.6.0* You can provide a lifecycle listener to be notified when Gitblit has created or deleted a user or a team. ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.fortsoft.pf4j.Extension; import com.gitblit.extensions.UserTeamLifeCycleListener; import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; @Extension public class MyUserTeamLifeCycleListener extends UserTeamLifeCycleListener { final Logger log = LoggerFactory.getLogger(getClass()); @Override public void onCreation(UserModel user) { log.info("Gitblit created user {}", user); } @Override public void onDeletion(UserModel user) { log.info("Gitblit deleted user {}", user); } @Override public void onCreation(TeamModel team) { log.info("Gitblit created team {}", team); } @Override public void onDeletion(TeamModel team) { log.info("Gitblit deleted team {}", team); } } ```