Software /
code /
prosody
Diff
core/configmanager.lua @ 9875:99291e124449
configmanager: Emit warning for duplicated config options
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 20 Mar 2019 12:20:51 +0000 |
parent | 9874:c9f5ccdcdf80 |
child | 9876:d812031c8716 |
line wrap: on
line diff
--- a/core/configmanager.lua Wed Mar 20 12:19:43 2019 +0000 +++ b/core/configmanager.lua Wed Mar 20 12:20:51 2019 +0000 @@ -16,6 +16,7 @@ local resolve_relative_path = require"util.paths".resolve_relative_path; local glob_to_pattern = require"util.paths".glob_to_pattern; local path_sep = package.config:sub(1,1); +local get_traceback_table = require "util.debug".get_traceback_table; local encodings = deps.softreq"util.encodings"; local nameprep = encodings and encodings.stringprep.nameprep or function (host) return host:lower(); end @@ -100,8 +101,17 @@ -- Built-in Lua parser do local pcall = _G.pcall; + local function get_line_number(config_file) + local tb = get_traceback_table(nil, 2); + for i = 1, #tb do + if tb[i].info.short_src == config_file then + return tb[i].info.currentline; + end + end + end parser = {}; function parser.load(data, config_file, config_table) + local set_options = {}; -- set_options[host.."/"..option_name] = true (when the option has been set already in this file) local warnings = {}; local env; -- The ' = true' are needed so as not to set off __newindex when we assign the functions below @@ -116,6 +126,12 @@ return rawget(_G, k); end, __newindex = function (_, k, v) + local host = env.__currenthost or "*"; + local option_path = host.."/"..k; + if set_options[option_path] then + t_insert(warnings, ("%s:%d: Duplicate option '%s'"):format(config_file, get_line_number(config_file), k)); + end + set_options[option_path] = true; set(config_table, env.__currenthost or "*", k, v); end });