libs/ipkg: add callback based list_all() and list_installed()
authorJo-Philipp Wich <jow@openwrt.org>
Sun, 28 Feb 2010 23:38:22 +0000 (23:38 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sun, 28 Feb 2010 23:38:22 +0000 (23:38 +0000)
libs/ipkg/luasrc/model/ipkg.lua

index 382fc8f..607c363 100644 (file)
@@ -20,6 +20,7 @@ local util = require "luci.util"
 local type  = type
 local pairs = pairs
 local error = error
+local table = table
 
 local ipkg = "opkg"
 
@@ -30,8 +31,7 @@ module "luci.model.ipkg"
 -- Internal action function
 local function _action(cmd, ...)
        local pkg = ""
-       arg.n = nil
-       for k, v in pairs(arg) do
+       for k, v in pairs({...}) do
                pkg = pkg .. " '" .. v:gsub("'", "") .. "'"
        end
 
@@ -147,3 +147,48 @@ end
 function upgrade()
        return _action("upgrade")
 end
+
+-- List helper
+function _list(action, pat, cb)
+       local fd = io.popen(ipkg .. " " .. action .. (pat and " '*" .. pat:gsub("'", "") .. "*'" or ""))
+       if fd then
+               local name, version, desc
+               while true do
+                       local line = fd:read("*l")
+                       if not line then break end
+
+                       if line:sub(1,1) ~= " " then
+                               name, version, desc = line:match("^(.-) %- (.-) %- (.+)")
+
+                               if not name then
+                                       name, version = line:match("^(.-) %- (.+)")
+                                       desc = ""
+                               end
+
+                               cb(name, version, desc)
+
+                               name    = nil
+                               version = nil
+                               desc    = nil
+                       end
+               end
+
+               fd:close()
+       end
+end
+
+--- List all packages known to opkg.
+-- @param pat  Only find packages matching this pattern, nil lists all packages
+-- @param cb   Callback function invoked for each package, receives name, version and description as arguments
+-- @return     nothing
+function list_all(pat, cb)
+       _list("list", pat, cb)
+end
+
+--- List installed packages.
+-- @param pat  Only find packages matching this pattern, nil lists all packages
+-- @param cb   Callback function invoked for each package, receives name, version and description as arguments
+-- @return     nothing
+function list_installed(pat, cb)
+       _list("list_installed", pat, cb)
+end