summaryrefslogtreecommitdiffhomepage
path: root/libs/uvl
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2008-11-04 16:00:58 +0000
committerJo-Philipp Wich <jow@openwrt.org>2008-11-04 16:00:58 +0000
commit8d75d524f99be11e722ae05bd714450388659e4c (patch)
tree80d946fbda73a8c5f20707c3e471e6d5cfe8b8b8 /libs/uvl
parent4219ec17548d4bb1620b16423dea844af44f93bc (diff)
* luci/libs/uvl: more sensitive checking of error reasons in evaluation of option dependencies
Diffstat (limited to 'libs/uvl')
-rw-r--r--libs/uvl/luasrc/uvl.lua5
-rw-r--r--libs/uvl/luasrc/uvl/dependencies.lua15
-rw-r--r--libs/uvl/luasrc/uvl/errors.lua14
3 files changed, 26 insertions, 8 deletions
diff --git a/libs/uvl/luasrc/uvl.lua b/libs/uvl/luasrc/uvl.lua
index 1e9bea4a4..3963a64be 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 d19149e7a..5b67dffe4 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 9cd8d19cf..983b61923 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