diff --git a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index 32b4aa9..3dc9294 100644 --- a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -192,7 +192,9 @@ post("/admin/plugins/:pluginId/_uninstall")(adminOnly { val pluginId = params("pluginId") - PluginRegistry().getPlugins().find(_.pluginId == pluginId).foreach { plugin => + PluginRegistry().getPlugins() + .collect { case (plugin, true) if plugin.pluginId == pluginId => plugin } + .foreach { plugin => PluginRegistry.uninstall(pluginId, request.getServletContext, loadSystemSettings(), request2Session(request).conn) flash += "info" -> s"${pluginId} was uninstalled." } diff --git a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala index 7e5b0fd..7a84d70 100644 --- a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala +++ b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala @@ -27,7 +27,7 @@ class PluginRegistry { - private val plugins = new ListBuffer[PluginInfo] + private val plugins = new ListBuffer[(PluginInfo, Boolean)] private val javaScripts = new ListBuffer[(String, String)] private val controllers = new ListBuffer[(ControllerBase, String)] private val images = mutable.Map[String, String]() @@ -53,9 +53,9 @@ private val suggestionProviders = new ListBuffer[SuggestionProvider] suggestionProviders += new UserNameSuggestionProvider() - def addPlugin(pluginInfo: PluginInfo): Unit = plugins += pluginInfo + def addPlugin(pluginInfo: PluginInfo, enabled: Boolean): Unit = plugins += ((pluginInfo, enabled)) - def getPlugins(): List[PluginInfo] = plugins.toList + def getPlugins(): List[(PluginInfo, Boolean)] = plugins.toList def addImage(id: String, bytes: Array[Byte]): Unit = { val encoded = Base64.getEncoder.encodeToString(bytes) @@ -181,7 +181,9 @@ * Uninstall a specified plugin. */ def uninstall(pluginId: String, context: ServletContext, settings: SystemSettings, conn: java.sql.Connection): Unit = synchronized { - instance.getPlugins().find(_.pluginId == pluginId).foreach { plugin => + instance.getPlugins() + .collect { case (plugin, true) if plugin.pluginId == plugin => plugin } + .foreach { plugin => // try { // plugin.pluginClass.uninstall(instance, context, settings) // } catch { @@ -243,10 +245,10 @@ val plugin = classLoader.loadClass("Plugin").getDeclaredConstructor().newInstance().asInstanceOf[Plugin] val pluginId = plugin.pluginId - // Check duplication - instance.getPlugins().find(_.pluginId == pluginId).foreach { x => - throw new IllegalStateException(s"Plugin ${pluginId} is duplicated. ${x.pluginJar.getName} is available.") - } +// // Check duplication +// instance.getPlugins().find(_.pluginId == pluginId).foreach { x => +// throw new IllegalStateException(s"Plugin ${pluginId} is duplicated. ${x.pluginJar.getName} is available.") +// } // Migration val solidbase = new Solidbase() @@ -269,7 +271,7 @@ pluginClass = plugin, pluginJar = pluginJar, classLoader = classLoader - )) + ), true) } catch { case e: Throwable => { logger.error(s"Error during plugin initialization: ${pluginJar.getName}", e) @@ -285,7 +287,9 @@ } def shutdown(context: ServletContext, settings: SystemSettings): Unit = synchronized { - instance.getPlugins().foreach { plugin => + instance.getPlugins() + .collect { case (plugin, true) => plugin } + .foreach { plugin => try { plugin.pluginClass.shutdown(instance, context, settings) } catch { diff --git a/src/main/twirl/gitbucket/core/admin/plugins.scala.html b/src/main/twirl/gitbucket/core/admin/plugins.scala.html index 4603d2b..e7e6084 100644 --- a/src/main/twirl/gitbucket/core/admin/plugins.scala.html +++ b/src/main/twirl/gitbucket/core/admin/plugins.scala.html @@ -1,4 +1,4 @@ -@(plugins: List[gitbucket.core.plugin.PluginInfo], info: Option[Any])(implicit context: gitbucket.core.controller.Context) +@(plugins: List[(gitbucket.core.plugin.PluginInfo, Boolean)], info: Option[Any])(implicit context: gitbucket.core.controller.Context) @gitbucket.core.html.main("Plugins"){ @gitbucket.core.admin.html.menu("plugins") { @gitbucket.core.helper.html.information(info) @@ -8,12 +8,12 @@