diff --git a/src/main/scala/gitbucket/core/controller/AccountController.scala b/src/main/scala/gitbucket/core/controller/AccountController.scala index 2e2f2d6..0c72af7 100644 --- a/src/main/scala/gitbucket/core/controller/AccountController.scala +++ b/src/main/scala/gitbucket/core/controller/AccountController.scala @@ -3,6 +3,7 @@ import gitbucket.core.account.html import gitbucket.core.helper import gitbucket.core.model.{GroupMember, Role} +import gitbucket.core.plugin.PluginRegistry import gitbucket.core.service._ import gitbucket.core.ssh.SshUtil import gitbucket.core.util.ControlUtil._ @@ -351,12 +352,16 @@ post("/new", newRepositoryForm)(usersOnly { form => LockUtil.lock(s"${form.owner}/${form.name}"){ if(getRepository(form.owner, form.name).isEmpty){ + // Create the repository createRepository(context.loginAccount.get, form.owner, form.name, form.description, form.isPrivate, form.createReadme) - } - // redirect to the repository - redirect(s"/${form.owner}/${form.name}") + // Call hooks + PluginRegistry().getRepositoryHooks.foreach(_.created(form.owner, form.name)) + } } + + // redirect to the repository + redirect(s"/${form.owner}/${form.name}") }) get("/:owner/:repository/fork")(readableUsersOnly { repository => @@ -431,6 +436,10 @@ // Record activity recordForkActivity(repository.owner, repository.name, loginUserName, accountName) + + // Call hooks + PluginRegistry().getRepositoryHooks.foreach(_.forked(repository.owner, accountName, repository.name)) + // redirect to the repository redirect(s"/${accountName}/${repository.name}") } diff --git a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala index b396e4b..8a14ab0 100644 --- a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala @@ -16,6 +16,7 @@ import org.eclipse.jgit.lib.Constants import org.eclipse.jgit.lib.ObjectId import gitbucket.core.model.WebHookContentType +import gitbucket.core.plugin.PluginRegistry class RepositorySettingsController extends RepositorySettingsControllerBase @@ -140,6 +141,9 @@ } // Delete parent directory FileUtil.deleteDirectoryIfEmpty(getRepositoryFilesDir(repository.owner, repository.name)) + + // Call hooks + PluginRegistry().getRepositoryHooks.foreach(_.renamed(repository.owner, repository.name, form.repositoryName)) } flash += "info" -> "Repository settings has been updated." redirect(s"/${repository.owner}/${form.repositoryName}/settings/options") @@ -350,6 +354,9 @@ } // Delere parent directory FileUtil.deleteDirectoryIfEmpty(getRepositoryFilesDir(repository.owner, repository.name)) + + // Call hooks + PluginRegistry().getRepositoryHooks.foreach(_.transferred(repository.owner, form.newOwner, repository.name)) } } redirect(s"/${form.newOwner}/${repository.name}") @@ -360,6 +367,7 @@ */ post("/:owner/:repository/settings/delete")(ownerOnly { repository => LockUtil.lock(s"${repository.owner}/${repository.name}"){ + // Delete the repository and related files deleteRepository(repository.owner, repository.name) FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name)) @@ -368,7 +376,11 @@ val lfsDir = getLfsDir(repository.owner, repository.name) FileUtils.deleteDirectory(lfsDir) FileUtil.deleteDirectoryIfEmpty(lfsDir.getParentFile()) + + // Call hooks + PluginRegistry().getRepositoryHooks.foreach(_.deleted(repository.owner, repository.name)) } + redirect(s"/${repository.owner}") }) diff --git a/src/main/scala/gitbucket/core/plugin/Plugin.scala b/src/main/scala/gitbucket/core/plugin/Plugin.scala index dd3fcb0..5303469 100644 --- a/src/main/scala/gitbucket/core/plugin/Plugin.scala +++ b/src/main/scala/gitbucket/core/plugin/Plugin.scala @@ -80,6 +80,16 @@ def receiveHooks(registry: PluginRegistry, context: ServletContext, settings: SystemSettings): Seq[ReceiveHook] = Nil /** + * Override to add repository hooks. + */ + val repositoryHooks: Seq[RepositoryHook] = Nil + + /** + * Override to add repository hooks. + */ + def repositoryHooks(registry: PluginRegistry, context: ServletContext, settings: SystemSettings): Seq[RepositoryHook] = Nil + + /** * Override to add global menus. */ val globalMenus: Seq[(Context) => Option[Link]] = Nil @@ -202,6 +212,9 @@ (receiveHooks ++ receiveHooks(registry, context, settings)).foreach { receiveHook => registry.addReceiveHook(receiveHook) } + (repositoryHooks ++ repositoryHooks(registry, context, settings)).foreach { repositoryHook => + registry.addRepositoryHook(repositoryHook) + } (globalMenus ++ globalMenus(registry, context, settings)).foreach { globalMenu => registry.addGlobalMenu(globalMenu) } diff --git a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala index 63203ca..e3c0c3b 100644 --- a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala +++ b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala @@ -35,6 +35,7 @@ private val receiveHooks = new ListBuffer[ReceiveHook] receiveHooks += new ProtectedBranchReceiveHook() + private val repositoryHooks = new ListBuffer[RepositoryHook] private val globalMenus = new ListBuffer[(Context) => Option[Link]] private val repositoryMenus = new ListBuffer[(RepositoryInfo, Context) => Option[Link]] private val repositorySettingTabs = new ListBuffer[(RepositoryInfo, Context) => Option[Link]] @@ -102,6 +103,10 @@ def getReceiveHooks: Seq[ReceiveHook] = receiveHooks.toSeq + def addRepositoryHook(repositoryHook: RepositoryHook): Unit = repositoryHooks += repositoryHook + + def getRepositoryHooks: Seq[RepositoryHook] = repositoryHooks.toSeq + def addGlobalMenu(globalMenu: (Context) => Option[Link]): Unit = globalMenus += globalMenu def getGlobalMenus: Seq[(Context) => Option[Link]] = globalMenus.toSeq diff --git a/src/main/scala/gitbucket/core/plugin/RepositoryHook.scala b/src/main/scala/gitbucket/core/plugin/RepositoryHook.scala new file mode 100644 index 0000000..8476d8b --- /dev/null +++ b/src/main/scala/gitbucket/core/plugin/RepositoryHook.scala @@ -0,0 +1,14 @@ +package gitbucket.core.plugin + +import gitbucket.core.model.Profile._ +import profile.api._ + +trait RepositoryHook { + + def created(owner: String, repository: String)(implicit session: Session): Unit = () + def deleted(owner: String, repository: String)(implicit session: Session): Unit = () + def renamed(owner: String, repository: String, newRepository: String)(implicit session: Session): Unit = () + def transferred(owner: String, newOwner: String, repository: String)(implicit session: Session): Unit = () + def forked(owner: String, newOwner: String, repository: String)(implicit session: Session): Unit = () + +}