diff --git a/src/main/scala/app/SystemSettingsController.scala b/src/main/scala/app/SystemSettingsController.scala index 076da08..42e52d7 100644 --- a/src/main/scala/app/SystemSettingsController.scala +++ b/src/main/scala/app/SystemSettingsController.scala @@ -99,6 +99,8 @@ }) get("/admin/plugins/available")(adminOnly { + // TODO Do periodical and asynchronous...? + PluginSystem.updateAllRepositories() admin.plugins.html.available(getAvailablePlugins()) }) diff --git a/src/main/scala/plugin/PluginSystem.scala b/src/main/scala/plugin/PluginSystem.scala index 539c992..df00943 100644 --- a/src/main/scala/plugin/PluginSystem.scala +++ b/src/main/scala/plugin/PluginSystem.scala @@ -7,6 +7,8 @@ import util.Directory._ import util.ControlUtil._ import org.apache.commons.io.FileUtils +import util.JGitUtil +import org.eclipse.jgit.api.Git /** * Provides extension points to plug-ins. @@ -48,6 +50,7 @@ } } + // TODO Method name seems to not so good. def installPlugin(id: String): Unit = { val pluginDir = new java.io.File(PluginHome) val javaScriptFile = new java.io.File(pluginDir, id + "/plugin.js") @@ -84,6 +87,25 @@ case class RepositoryMenu(label: String, name: String, url: String, icon: String, condition: Context => Boolean) case class Action(path: String, function: (HttpServletRequest, HttpServletResponse) => Any) + /** + * Clone or pull all plugin repositories + * + * TODO Support plugin repository access through the proxy server + */ + def updateAllRepositories(): Unit = { + repositories.foreach { repository => + val dir = getPluginCacheDir() + val repo = new java.io.File(dir, repository.id) + if(repo.exists){ + // pull if the repository is already cloned + Git.open(repo).pull().call() + } else { + // clone if the repository is not exist + Git.cloneRepository().setURI(repository.url).setDirectory(repo).call() + } + } + } + // TODO This is a test // addGlobalMenu("Google", "http://www.google.co.jp/", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAEvwAABL8BkeKJvAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIgSURBVEiJtdZNiI1hFAfw36ORhSFFPgYLszOKJAsWRLGzks1gYyFZKFs7C7K2Y2XDRiwmq9kIJWQjJR9Tk48xRtTIRwjH4p473nm99yLNqdNTz/mf//+555x7ektEmEmbNaPs6OkUKKX0YBmWp6/IE8bwIs8xjEfEt0aiiJBl6sEuXMRLfEf8pX/PnIvJ0TPFWxE4+w+Ef/Kzbd5qDx5l8H8tkku7LG17gH7sxWatevdhEUoXsjda5RnDTZzH6jagtMe0lHIa23AJw3iOiSRZlmJ9mfcyfTzFl2AldmI3rkbEkbrAYKrX7S1eVRyWVnxhQ87eiLjQ+o2/mtyve+PuYy3W4+EfsP2/TVGKTHRI+Iz9Fdx8XOmAnZjGWRMYqoF/4ESW4hpOYk1iZ2WsLjDUTeBYBfgeuyux2XiNT5hXud+DD5W8Y90EtifoSfultfjx7MVtrKzcr8No5m7vJtCLx1hQJ8/4IZzClpyoy5ibsYUYQW81Z9o2jYgPeKr15+poEXE9+1XF9WIkOaasaV2P4k4pZUdDbEm+VEQcjIgtEfGxlLIVd/Gs6TX1MhzQquU3HK1t23f4IsuS94fxNXMO/MbXIDBg+tidw5yMbcCmylSdqWEH/kagYLKWeAt9Fcxi3KhhJuXq6SqQBMO15NDalvswmLWux4cbuToIbMS9BpJOfg8bm7imtmmTlVJWaa3hpnU9nufziBjtyDHTny0/AaA7Qnb4AM4aAAAAAElFTkSuQmCC") // { context => context.loginAccount.isDefined }