diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2008-11-04 16:00:58 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2008-11-04 16:00:58 +0000 |
commit | 8d75d524f99be11e722ae05bd714450388659e4c (patch) | |
tree | 80d946fbda73a8c5f20707c3e471e6d5cfe8b8b8 | |
parent | 4219ec17548d4bb1620b16423dea844af44f93bc (diff) |
* luci/libs/uvl: more sensitive checking of error reasons in evaluation of option dependencies
-rw-r--r-- | libs/uvl/luasrc/uvl.lua | 5 | ||||
-rw-r--r-- | libs/uvl/luasrc/uvl/dependencies.lua | 15 | ||||
-rw-r--r-- | libs/uvl/luasrc/uvl/errors.lua | 14 |
3 files changed, 26 insertions, 8 deletions
diff --git a/libs/uvl/luasrc/uvl.lua b/libs/uvl/luasrc/uvl.lua index 1e9bea4a46..3963a64be3 100644 --- a/libs/uvl/luasrc/uvl.lua +++ b/libs/uvl/luasrc/uvl.lua @@ -295,9 +295,8 @@ function UVL._validate_option( self, option, nodeps ) if not nodeps then local ok, err = dependencies.check( self, option ) if not ok then - -- XXX: maybe this needs to be more specific - if not err:is(ERR.ERR_DEP_NOTEQUAL) and - not err:is(ERR.ERR_DEP_NOVALUE) + if not err:is_all(ERR.ERR_DEP_NOTEQUAL) and + not err:is_all(ERR.ERR_DEP_NOVALUE) then option:error(err) return false, option:errors() diff --git a/libs/uvl/luasrc/uvl/dependencies.lua b/libs/uvl/luasrc/uvl/dependencies.lua index d19149e7ab..5b67dffe4a 100644 --- a/libs/uvl/luasrc/uvl/dependencies.lua +++ b/libs/uvl/luasrc/uvl/dependencies.lua @@ -37,7 +37,7 @@ function _parse_reference( r, c, s, o ) for v in r:gmatch("[^.]+") do ref[#ref+1] = (v:gsub( "%$(.+)", vars )) end - + if #ref < 2 then table.insert(ref, 1, s or '$section') end @@ -81,7 +81,11 @@ function check( self, object, nodeps ) for _, dep in ipairs(object:scheme('depends')) do local subcondition = true - for k, v in pairs(dep) do + local score = 0 + + for k, v in util.spairs( + dep, function(a, b) return type(dep[a]) == "string" end + ) do -- XXX: better error local ref = _parse_reference( k, unpack(object.cref) ) @@ -103,10 +107,13 @@ function check( self, object, nodeps ) derr:child( type(v) == "boolean" and ERR.DEP_NOVALUE(option, depstr) - or ERR.DEP_NOTEQUAL(option, {depstr, v}) + or ERR.DEP_NOTEQUAL(option, {depstr, v}), + score ) - break + --break + else + score = score + ( type(v) == "boolean" and 1 or 10 ) end else subcondition = false diff --git a/libs/uvl/luasrc/uvl/errors.lua b/libs/uvl/luasrc/uvl/errors.lua index 9cd8d19cfa..983b619230 100644 --- a/libs/uvl/luasrc/uvl/errors.lua +++ b/libs/uvl/luasrc/uvl/errors.lua @@ -19,7 +19,7 @@ local uvl = require "luci.uvl" local util = require "luci.util" local string = require "string" -local ipairs, error, type = ipairs, error, type +local ipairs, error, type = ipairs, error, type local tonumber, unpack = tonumber, unpack @@ -184,3 +184,15 @@ function error.is(self, code) end return false end + +function error.is_all(self, code) + if self.code == code then + return true + else + local equal = false + for _, c in ipairs(self.childs) do + equal = ( c.code == code ) + end + return equal + end +end |