summaryrefslogtreecommitdiff
path: root/lib/gitano/plugins.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitano/plugins.lua')
-rw-r--r--lib/gitano/plugins.lua63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/gitano/plugins.lua b/lib/gitano/plugins.lua
new file mode 100644
index 0000000..bdc6d1e
--- /dev/null
+++ b/lib/gitano/plugins.lua
@@ -0,0 +1,63 @@
+-- gitano.plugins
+--
+-- Plugin loading support for Gitano
+--
+-- Copyright 2014 Daniel Silverstone <daniel.silverstone@codethink.co.uk>
+
+local util = require "gitano.util"
+local log = require "gitano.log"
+
+local luxio = require "luxio"
+local sio = require "luxio.simple"
+
+local gfind = string.gfind
+
+local plugin_name_pattern = "^(.+)%.lua$"
+
+local function find_plugins(path)
+ local ret = {}
+ for _, entry in ipairs(path) do
+ local dirp, err = sio.opendir(entry)
+ if not dirp then
+ log.warning(("Unable to scan plugin directory '%s': %s")
+ :format(entry, err))
+ else
+ for filename, fileinfo in dirp:iterate() do
+ local plugin_name = filename:match(plugin_name_pattern)
+ if plugin_name and fileinfo.d_type == luxio.DT_REG then
+ if not ret[plugin_name] then
+ ret[plugin_name] = entry
+ ret[#ret + 1] = plugin_name
+ end
+ end
+ end
+ end
+ end
+ table.sort(ret)
+ return ret
+end
+
+local function load_plugins(path)
+ local to_load = find_plugins(path)
+ for _, plugin_name in ipairs(to_load) do
+ local filepath = util.path_join(to_load[plugin_name],
+ plugin_name .. ".lua")
+ local chunk, err = loadfile(filepath)
+ if not chunk then
+ log.warning(("Failure loading plugin '%s' from '%s': %s")
+ :format(plugin_name, to_load[plugin_name],
+ err))
+ else
+ local ok, err = pcall(chunk)
+ if not ok then
+ log.warning(("Failure running plugin '%s' from '%s': %s")
+ :format(plugin_name, to_load[plugin_name],
+ err))
+ end
+ end
+ end
+end
+
+return {
+ load_plugins = load_plugins,
+}