ipkg.lua: new function compare_version
authorChristian Schoenebeck <christian.schoenebeck@gmail.com>
Mon, 27 Jul 2015 16:08:54 +0000 (18:08 +0200)
committerChristian Schoenebeck <christian.schoenebeck@gmail.com>
Mon, 27 Jul 2015 16:08:54 +0000 (18:08 +0200)
* minor fix function _list() set to local
* new function compare_version() lua version of opkg compare-version

Signed-off-by: Christian Schoenebeck <christian.schoenebeck@gmail.com>
modules/luci-base/luasrc/model/ipkg.lua
modules/luci-base/luasrc/model/ipkg.luadoc

index 587637272d8d5b01ce5ea14519c25ed137f84013..976081b84dd7e0c9a31b891adb8857f0663ded65 100644 (file)
@@ -122,7 +122,7 @@ function upgrade()
 end
 
 -- List helper
-function _list(action, pat, cb)
+local function _list(action, pat, cb)
        local fd = io.popen(ipkg .. " " .. action ..
                (pat and (" '%s'" % pat:gsub("'", "")) or ""))
 
@@ -189,3 +189,43 @@ function overlay_root()
 
        return od
 end
+
+function compare_versions(ver1, comp, ver2)
+       if not ver1 or not ver2
+       or not comp or not (#comp > 0) then
+               error("Invalid parameters")
+               return nil
+       end
+       -- correct compare string
+       if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
+       elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
+       elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
+       elseif comp == "="  or comp == "==" then comp = "=="
+       elseif comp == "<<" then comp = "<"
+       elseif comp == ">>" then comp = ">"
+       else
+               error("Invalid compare string")
+               return nil
+       end
+
+       local av1 = util.split(ver1, "[%.%-]", nil, true)
+       local av2 = util.split(ver2, "[%.%-]", nil, true)
+
+       for i = 1, math.max(table.getn(av1),table.getn(av2)), 1  do
+               local s1 = av1[i] or ""
+               local s2 = av2[i] or ""
+
+               -- first "not equal" found return true
+               if comp == "~=" and (s1 ~= s2) then return true end
+               -- first "lower" found return true
+               if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
+               -- first "greater" found return true
+               if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
+               -- not equal then return false
+               if (s1 ~= s2) then return false end
+       end
+
+       -- all equal and not compare greater or lower then true
+       return not (comp == "<" or comp == ">")
+end
+
index cf0985f94a5984bfb9d9a9f8d7f31ef92c5d5a7a..0dbab7a68fdeb5c329bc5e48673473e1d67fa4ed 100644 (file)
@@ -107,3 +107,20 @@ Determines the overlay root used by opkg.
 @return                String containing the directory path of the overlay root.
 ]]
 
+---[[
+lua version of opkg compare-versions
+
+@class function
+@name compare_versions
+@param ver1    string version 1
+@param ver2    string version 2
+@param comp    string compare versions using
+               "<=" or "<" lower-equal
+               ">" or ">=" greater-equal
+               "=" equal
+               "<<" lower
+               ">>" greater
+               "~=" not equal
+@return Boolean indicating the status of the compare
+]]
+