Software /
code /
prosody
Comparison
core/modulemanager.lua @ 11145:be73df6765b9
core.modulemanager: Locate resources of LuaRocks-installed modules
Extra non-code files included with a `copy_directories` directive in a
LuaRocks manifest will be copied into a per-module and per-version
directory under /lib/luarocks/ and all this is there to dig that out so
it can be used in e.g. moduleapi :load_resource().
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 07 Oct 2020 15:51:37 +0200 |
parent | 10530:67d56dacc79c |
child | 11147:82d6c8e627b9 |
comparison
equal
deleted
inserted
replaced
11144:2b9f7c537acb | 11145:be73df6765b9 |
---|---|
8 | 8 |
9 local logger = require "util.logger"; | 9 local logger = require "util.logger"; |
10 local log = logger.init("modulemanager"); | 10 local log = logger.init("modulemanager"); |
11 local config = require "core.configmanager"; | 11 local config = require "core.configmanager"; |
12 local pluginloader = require "util.pluginloader"; | 12 local pluginloader = require "util.pluginloader"; |
13 local envload = require "util.envload"; | |
13 local set = require "util.set"; | 14 local set = require "util.set"; |
14 | 15 |
15 local new_multitable = require "util.multitable".new; | 16 local new_multitable = require "util.multitable".new; |
16 local api = require "core.moduleapi"; -- Module API container | 17 local api = require "core.moduleapi"; -- Module API container |
17 | 18 |
20 | 21 |
21 local xpcall = require "util.xpcall".xpcall; | 22 local xpcall = require "util.xpcall".xpcall; |
22 local debug_traceback = debug.traceback; | 23 local debug_traceback = debug.traceback; |
23 local setmetatable, rawget = setmetatable, rawget; | 24 local setmetatable, rawget = setmetatable, rawget; |
24 local ipairs, pairs, type, t_insert = ipairs, pairs, type, table.insert; | 25 local ipairs, pairs, type, t_insert = ipairs, pairs, type, table.insert; |
26 local lua_version = _VERSION:match("5%.%d$"); | |
25 | 27 |
26 local autoload_modules = { | 28 local autoload_modules = { |
27 prosody.platform, | 29 prosody.platform, |
28 "presence", | 30 "presence", |
29 "message", | 31 "message", |
194 return nil, err; | 196 return nil, err; |
195 end | 197 end |
196 | 198 |
197 api_instance.path = err; | 199 api_instance.path = err; |
198 | 200 |
201 local custom_plugins = prosody.paths.installer; | |
202 if err:sub(1, #custom_plugins+1) == custom_plugins.."/" then | |
203 -- Stage 1: Make it work (you are here) | |
204 -- Stage 2: Make it less hacky (TODO) | |
205 local manifest = {}; | |
206 local luarocks_path = custom_plugins.."/lib/luarocks/rocks-"..lua_version; | |
207 local manifest_filename = luarocks_path.."/manifest"; | |
208 local load_manifest, err = envload.envloadfile(manifest_filename, manifest); | |
209 if not load_manifest then | |
210 log("error", "Could not load manifest of installed plugins: %s", err, load_manifest); | |
211 else | |
212 local ok, err = xpcall(load_manifest, debug_traceback); | |
213 if not ok then | |
214 log("error", "Could not load manifest of installed plugins: %s", err); | |
215 elseif type(manifest.modules) ~= "table" then | |
216 log("debug", "Expected 'table' but manifest.modules = %q", manifest.modules); | |
217 log("error", "Can't look up resource path for mod_%s because '%s' does not appear to be a LuaRocks manifest", module_name, manifest_filename); | |
218 else | |
219 local versions = manifest.modules["mod_"..module_name]; | |
220 if type(versions) == "table" and versions[1] then | |
221 -- Not going to deal with multiple installed versions | |
222 api_instance.resource_path = luarocks_path.."/"..versions[1]; | |
223 else | |
224 log("debug", "mod_%s does not appear in the installation manifest", module_name); | |
225 end | |
226 end | |
227 end | |
228 end | |
229 | |
199 modulemap[host][module_name] = pluginenv; | 230 modulemap[host][module_name] = pluginenv; |
200 local ok, err = xpcall(mod, debug_traceback); | 231 local ok, err = xpcall(mod, debug_traceback); |
201 if ok then | 232 if ok then |
202 -- Call module's "load" | 233 -- Call module's "load" |
203 if module_has_method(pluginenv, "load") then | 234 if module_has_method(pluginenv, "load") then |