From b20c561b8fcfcf4cecfd8fbb40ea7857193a4f8c Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Mon, 24 Sep 2012 18:19:01 -0300 Subject: Add 'purge' command. Closes #25. --- src/bin/luarocks | 1 + src/luarocks/purge.lua | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/luarocks/repos.lua | 18 ++++++++++++------ 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 src/luarocks/purge.lua (limited to 'src') diff --git a/src/bin/luarocks b/src/bin/luarocks index e94d895f..aaafb905 100755 --- a/src/bin/luarocks +++ b/src/bin/luarocks @@ -20,5 +20,6 @@ commands.path = require("luarocks.path") commands.show = require("luarocks.show") commands.new_version = require("luarocks.new_version") commands.lint = require("luarocks.lint") +commands.purge = require("luarocks.purge") command_line.run_command(...) diff --git a/src/luarocks/purge.lua b/src/luarocks/purge.lua new file mode 100644 index 00000000..dc6b822d --- /dev/null +++ b/src/luarocks/purge.lua @@ -0,0 +1,48 @@ + +--- Module implementing the LuaRocks "purge" command. +-- Remove all rocks from a given tree. +module("luarocks.purge", package.seeall) + +local util = require("luarocks.util") +local fs = require("luarocks.fs") +local path = require("luarocks.path") +local search = require("luarocks.search") +local deps = require("luarocks.deps") +local repos = require("luarocks.repos") +local manif = require("luarocks.manif") +local cfg = require("luarocks.cfg") + +help_summary = "Remove all installed rocks from a tree." +help_arguments = "--tree=" +help = [[ +This command removes all rocks from a given tree. + +The --tree argument is mandatory: luarocks purge does not +assume a default tree. +]] + +function run(...) + local flags = util.parse_flags(...) + + local tree = flags["tree"] + + if type(tree) ~= "string" then + return nil, "The --tree argument is mandatory, see help." + end + + local results = {} + local query = search.make_query("") + query.exact_name = false + search.manifest_search(results, path.rocks_dir(tree), query) + + for package, versions in util.sortedpairs(results) do + for version, repositories in util.sortedpairs(versions, function(a,b) return deps.compare_versions(b,a) end) do + util.printout("Removing "..package.." "..version.."...") + local ok, err = repos.delete_version(package, version, true) + if not ok then + util.printerr(err) + end + end + end + return manif.make_manifest(cfg.rocks_dir) +end diff --git a/src/luarocks/repos.lua b/src/luarocks/repos.lua index e6f0c5f7..30c61f55 100644 --- a/src/luarocks/repos.lua +++ b/src/luarocks/repos.lua @@ -259,7 +259,11 @@ end -- Version numbers are compared as exact string comparison. -- @param name string: name of package -- @param version string: package version in string format -function delete_version(name, version) +-- @param quick boolean: do not try to fix the versioned name +-- of another version that provides the same module that +-- was deleted. This is used during 'purge', as every module +-- will be eventually deleted. +function delete_version(name, version, quick) assert(type(name) == "string") assert(type(version) == "string") @@ -274,11 +278,13 @@ function delete_version(name, version) if not ok then return nil, "Failed deleting "..versioned end else local ok = fs.delete(target) - local next_name, next_version = manif.find_next_provider(target) - if next_name then - local versioned = path.versioned_name(target, deploy_dir, next_name, next_version) - fs.move(versioned, target) - fs.remove_dir_tree_if_empty(dir.dir_name(versioned)) + if not quick then + local next_name, next_version = manif.find_next_provider(target) + if next_name then + local versioned = path.versioned_name(target, deploy_dir, next_name, next_version) + fs.move(versioned, target) + fs.remove_dir_tree_if_empty(dir.dir_name(versioned)) + end end fs.remove_dir_tree_if_empty(dir.dir_name(target)) if not ok then return nil, "Failed deleting "..target end -- cgit v1.2.3-55-g6feb