Mercurial > prosody-hg
comparison core/configmanager.lua @ 8153:c22d5680ca68
configmanager: Remove support for multiple parsers, fixes #852.
| author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
|---|---|
| date | Sat, 27 May 2017 15:32:28 +0100 |
| parents | 24170d74b00b |
| children | b4cbd65ee4c5 |
comparison
equal
deleted
inserted
replaced
| 8150:4720f5ec4171 | 8153:c22d5680ca68 |
|---|---|
| 25 local _M = {}; | 25 local _M = {}; |
| 26 local _ENV = nil; | 26 local _ENV = nil; |
| 27 | 27 |
| 28 _M.resolve_relative_path = resolve_relative_path; -- COMPAT | 28 _M.resolve_relative_path = resolve_relative_path; -- COMPAT |
| 29 | 29 |
| 30 local parsers = {}; | 30 local parser = nil; |
| 31 | 31 |
| 32 local config_mt = { __index = function (t, _) return rawget(t, "*"); end}; | 32 local config_mt = { __index = function (t, _) return rawget(t, "*"); end}; |
| 33 local config = setmetatable({ ["*"] = { } }, config_mt); | 33 local config = setmetatable({ ["*"] = { } }, config_mt); |
| 34 | 34 |
| 35 -- When host not found, use global | 35 -- When host not found, use global |
| 75 end | 75 end |
| 76 | 76 |
| 77 function _M.load(filename, config_format) | 77 function _M.load(filename, config_format) |
| 78 config_format = config_format or filename:match("%w+$"); | 78 config_format = config_format or filename:match("%w+$"); |
| 79 | 79 |
| 80 if parsers[config_format] and parsers[config_format].load then | 80 if config_format == "lua" then |
| 81 local f, err = io.open(filename); | 81 local f, err = io.open(filename); |
| 82 if f then | 82 if f then |
| 83 local new_config = setmetatable({ ["*"] = { } }, config_mt); | 83 local new_config = setmetatable({ ["*"] = { } }, config_mt); |
| 84 local ok, err = parsers[config_format].load(f:read("*a"), filename, new_config); | 84 local ok, err = parser.load(f:read("*a"), filename, new_config); |
| 85 f:close(); | 85 f:close(); |
| 86 if ok then | 86 if ok then |
| 87 config = new_config; | 87 config = new_config; |
| 88 fire_event("config-reloaded", { | 88 fire_event("config-reloaded", { |
| 89 filename = filename, | 89 filename = filename, |
| 101 else | 101 else |
| 102 return nil, "file", "no parser for "..(config_format); | 102 return nil, "file", "no parser for "..(config_format); |
| 103 end | 103 end |
| 104 end | 104 end |
| 105 | 105 |
| 106 function _M.addparser(config_format, parser) | |
| 107 if config_format and parser then | |
| 108 parsers[config_format] = parser; | |
| 109 end | |
| 110 end | |
| 111 | |
| 112 -- _M needed to avoid name clash with local 'parsers' | |
| 113 function _M.parsers() | |
| 114 local p = {}; | |
| 115 for config_format in pairs(parsers) do | |
| 116 table.insert(p, config_format); | |
| 117 end | |
| 118 return p; | |
| 119 end | |
| 120 | |
| 121 -- Built-in Lua parser | 106 -- Built-in Lua parser |
| 122 do | 107 do |
| 123 local pcall = _G.pcall; | 108 local pcall = _G.pcall; |
| 124 parsers.lua = {}; | 109 parser = {}; |
| 125 function parsers.lua.load(data, config_file, config_table) | 110 function parser.load(data, config_file, config_table) |
| 126 local env; | 111 local env; |
| 127 -- The ' = true' are needed so as not to set off __newindex when we assign the functions below | 112 -- The ' = true' are needed so as not to set off __newindex when we assign the functions below |
| 128 env = setmetatable({ | 113 env = setmetatable({ |
| 129 Host = true, host = true, VirtualHost = true, | 114 Host = true, host = true, VirtualHost = true, |
| 130 Component = true, component = true, | 115 Component = true, component = true, |
| 209 end | 194 end |
| 210 -- Not a wildcard, so resolve (potentially) relative path and run through config parser | 195 -- Not a wildcard, so resolve (potentially) relative path and run through config parser |
| 211 file = resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file); | 196 file = resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file); |
| 212 local f, err = io.open(file); | 197 local f, err = io.open(file); |
| 213 if f then | 198 if f then |
| 214 local ret, err = parsers.lua.load(f:read("*a"), file, config_table); | 199 local ret, err = parser.load(f:read("*a"), file, config_table); |
| 215 if not ret then error(err:gsub("%[string.-%]", file), 0); end | 200 if not ret then error(err:gsub("%[string.-%]", file), 0); end |
| 216 end | 201 end |
| 217 if not f then error("Error loading included "..file..": "..err, 0); end | 202 if not f then error("Error loading included "..file..": "..err, 0); end |
| 218 return f, err; | 203 return f, err; |
| 219 end | 204 end |
