summaryrefslogtreecommitdiff
path: root/src/luarocks/cmd/list.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/luarocks/cmd/list.lua')
-rw-r--r--src/luarocks/cmd/list.lua96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/luarocks/cmd/list.lua b/src/luarocks/cmd/list.lua
new file mode 100644
index 0000000..7b2682f
--- /dev/null
+++ b/src/luarocks/cmd/list.lua
@@ -0,0 +1,96 @@
+
+--- Module implementing the LuaRocks "list" command.
+-- Lists currently installed rocks.
+local list = {}
+
+local search = require("luarocks.search")
+local queries = require("luarocks.queries")
+local vers = require("luarocks.core.vers")
+local cfg = require("luarocks.core.cfg")
+local util = require("luarocks.util")
+local path = require("luarocks.path")
+
+function list.add_to_parser(parser)
+ local cmd = parser:command("list", "List currently installed rocks.", util.see_also())
+
+ cmd:argument("filter", "A substring of a rock name to filter by.")
+ :args("?")
+ cmd:argument("version", "Rock version to filter by.")
+ :args("?")
+
+ cmd:flag("--outdated", "List only rocks for which there is a higher "..
+ "version available in the rocks server.")
+ cmd:flag("--porcelain", "Produce machine-friendly output.")
+end
+
+local function check_outdated(trees, query)
+ local results_installed = {}
+ for _, tree in ipairs(trees) do
+ search.local_manifest_search(results_installed, path.rocks_dir(tree), query)
+ end
+ local outdated = {}
+ for name, versions in util.sortedpairs(results_installed) do
+ versions = util.keys(versions)
+ table.sort(versions, vers.compare_versions)
+ local latest_installed = versions[1]
+
+ local query_available = queries.new(name:lower())
+ local results_available, err = search.search_repos(query_available)
+
+ if results_available[name] then
+ local available_versions = util.keys(results_available[name])
+ table.sort(available_versions, vers.compare_versions)
+ local latest_available = available_versions[1]
+ local latest_available_repo = results_available[name][latest_available][1].repo
+
+ if vers.compare_versions(latest_available, latest_installed) then
+ table.insert(outdated, { name = name, installed = latest_installed, available = latest_available, repo = latest_available_repo })
+ end
+ end
+ end
+ return outdated
+end
+
+local function list_outdated(trees, query, porcelain)
+ util.title("Outdated rocks:", porcelain)
+ local outdated = check_outdated(trees, query)
+ for _, item in ipairs(outdated) do
+ if porcelain then
+ util.printout(item.name, item.installed, item.available, item.repo)
+ else
+ util.printout(item.name)
+ util.printout(" "..item.installed.." < "..item.available.." at "..item.repo)
+ util.printout()
+ end
+ end
+ return true
+end
+
+--- Driver function for "list" command.
+-- @return boolean: True if succeeded, nil on errors.
+function list.command(args)
+ local query = queries.new(args.filter and args.filter:lower() or "", args.namespace, args.version, true)
+ local trees = cfg.rocks_trees
+ local title = "Rocks installed for Lua "..cfg.lua_version
+ if args.tree then
+ trees = { args.tree }
+ title = title .. " in " .. args.tree
+ end
+
+ if args.outdated then
+ return list_outdated(trees, query, args.porcelain)
+ end
+
+ local results = {}
+ for _, tree in ipairs(trees) do
+ local ok, err, errcode = search.local_manifest_search(results, path.rocks_dir(tree), query)
+ if not ok and errcode ~= "open" then
+ util.warning(err)
+ end
+ end
+ util.title(title, args.porcelain)
+ search.print_result_tree(results, args.porcelain)
+ return true
+end
+
+return list