diff options
| author | Hisham Muhammad <hisham@gobolinux.org> | 2013-07-04 15:16:25 -0300 |
|---|---|---|
| committer | Hisham Muhammad <hisham@gobolinux.org> | 2013-07-04 15:16:25 -0300 |
| commit | aff559479ce9af00327295927e2ed85d72fe6cd0 (patch) | |
| tree | 4cead054c5d9c5b67f084bebecc91e8079ab5131 | |
| parent | d124cdb40076e6f5363bd7e152c6ef0479c4bf9a (diff) | |
| download | luarocks-aff559479ce9af00327295927e2ed85d72fe6cd0.tar.gz luarocks-aff559479ce9af00327295927e2ed85d72fe6cd0.tar.bz2 luarocks-aff559479ce9af00327295927e2ed85d72fe6cd0.zip | |
Remove other previously installed versions when running 'build' or 'install'.
| -rw-r--r-- | src/luarocks/build.lua | 28 | ||||
| -rw-r--r-- | src/luarocks/deps.lua | 21 | ||||
| -rw-r--r-- | src/luarocks/install.lua | 16 | ||||
| -rw-r--r-- | src/luarocks/make_manifest.lua | 7 | ||||
| -rw-r--r-- | src/luarocks/pack.lua | 2 | ||||
| -rw-r--r-- | src/luarocks/purge.lua | 2 | ||||
| -rw-r--r-- | src/luarocks/remove.lua | 97 |
7 files changed, 106 insertions, 67 deletions
diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua index 71b3cb89..71dcda94 100644 --- a/src/luarocks/build.lua +++ b/src/luarocks/build.lua | |||
| @@ -12,18 +12,23 @@ local fs = require("luarocks.fs") | |||
| 12 | local dir = require("luarocks.dir") | 12 | local dir = require("luarocks.dir") |
| 13 | local deps = require("luarocks.deps") | 13 | local deps = require("luarocks.deps") |
| 14 | local manif = require("luarocks.manif") | 14 | local manif = require("luarocks.manif") |
| 15 | local search = require("luarocks.search") | ||
| 16 | local remove = require("luarocks.remove") | ||
| 15 | local cfg = require("luarocks.cfg") | 17 | local cfg = require("luarocks.cfg") |
| 16 | 18 | ||
| 17 | help_summary = "Build/compile a rock." | 19 | help_summary = "Build/compile a rock." |
| 18 | help_arguments = "[--pack-binary-rock] {<rockspec>|<rock>|<name> [<version>]}" | 20 | help_arguments = "[--pack-binary-rock] [--keep] {<rockspec>|<rock>|<name> [<version>]}" |
| 19 | help = [[ | 21 | help = [[ |
| 20 | Build and install a rock, compiling its C parts if any. | 22 | Build and install a rock, compiling its C parts if any. |
| 21 | Argument may be a rockspec file, a source rock file | 23 | Argument may be a rockspec file, a source rock file |
| 22 | or the name of a rock to be fetched from a repository. | 24 | or the name of a rock to be fetched from a repository. |
| 23 | 25 | ||
| 24 | If --pack-binary-rock is passed, the rock is not installed; | 26 | --pack-binary-rock Do not install rock. Instead, produce a .rock file |
| 25 | instead, a .rock file with the contents of compilation is produced | 27 | with the contents of compilation in the current |
| 26 | in the current directory. | 28 | directory. |
| 29 | |||
| 30 | --keep Do not remove previously installed versions of the | ||
| 31 | rock after building a new one. | ||
| 27 | ]] | 32 | ]] |
| 28 | 33 | ||
| 29 | --- Install files to a given location. | 34 | --- Install files to a given location. |
| @@ -114,8 +119,8 @@ end | |||
| 114 | -- @param deps_mode string: Dependency mode: "one" for the current default tree, | 119 | -- @param deps_mode string: Dependency mode: "one" for the current default tree, |
| 115 | -- "all" for all trees, "order" for all trees with priority >= the current default, | 120 | -- "all" for all trees, "order" for all trees with priority >= the current default, |
| 116 | -- "none" for no trees. | 121 | -- "none" for no trees. |
| 117 | -- @return boolean or (nil, string, [string]): True if succeeded or | 122 | -- @return (string, string) or (nil, string, [string]): Name and version of |
| 118 | -- nil and an error message followed by an error code. | 123 | -- installed rock if succeeded or nil and an error message followed by an error code. |
| 119 | function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode) | 124 | function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode) |
| 120 | assert(type(rockspec_file) == "string") | 125 | assert(type(rockspec_file) == "string") |
| 121 | assert(type(need_to_fetch) == "boolean") | 126 | assert(type(need_to_fetch) == "boolean") |
| @@ -272,7 +277,7 @@ function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode) | |||
| 272 | util.printout(name.." "..version.." is now built and installed in "..root_dir.." "..license) | 277 | util.printout(name.." "..version.." is now built and installed in "..root_dir.." "..license) |
| 273 | 278 | ||
| 274 | util.remove_scheduled_function(rollback) | 279 | util.remove_scheduled_function(rollback) |
| 275 | return true | 280 | return name, version |
| 276 | end | 281 | end |
| 277 | 282 | ||
| 278 | --- Build and install a rock. | 283 | --- Build and install a rock. |
| @@ -336,6 +341,13 @@ function run(...) | |||
| 336 | else | 341 | else |
| 337 | local ok, err = fs.check_command_permissions(flags) | 342 | local ok, err = fs.check_command_permissions(flags) |
| 338 | if not ok then return nil, err end | 343 | if not ok then return nil, err end |
| 339 | return do_build(name, version, deps.get_deps_mode(flags)) | 344 | ok, err = do_build(name, version, deps.get_deps_mode(flags)) |
| 345 | if not ok then return nil, err end | ||
| 346 | local name, version = ok, err | ||
| 347 | if (not flags["keep"]) and not cfg.keep_other_versions then | ||
| 348 | local ok, err = remove.remove_other_versions(name, version, flags["force"]) | ||
| 349 | if not ok then util.printerr(err) end | ||
| 350 | end | ||
| 351 | return name, version | ||
| 340 | end | 352 | end |
| 341 | end | 353 | end |
diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua index 6d5f3fef..7aefd40e 100644 --- a/src/luarocks/deps.lua +++ b/src/luarocks/deps.lua | |||
| @@ -290,15 +290,18 @@ function match_constraints(version, constraints) | |||
| 290 | local ok = true | 290 | local ok = true |
| 291 | setmetatable(version, version_mt) | 291 | setmetatable(version, version_mt) |
| 292 | for _, constr in pairs(constraints) do | 292 | for _, constr in pairs(constraints) do |
| 293 | local constr_version = constr.version | 293 | if type(constr.version) == "string" then |
| 294 | setmetatable(constr.version, version_mt) | 294 | constr.version = parse_version(constr.version) |
| 295 | if constr.op == "==" then ok = version == constr_version | 295 | end |
| 296 | elseif constr.op == "~=" then ok = version ~= constr_version | 296 | local constr_version, constr_op = constr.version, constr.op |
| 297 | elseif constr.op == ">" then ok = version > constr_version | 297 | setmetatable(constr_version, version_mt) |
| 298 | elseif constr.op == "<" then ok = version < constr_version | 298 | if constr_op == "==" then ok = version == constr_version |
| 299 | elseif constr.op == ">=" then ok = version >= constr_version | 299 | elseif constr_op == "~=" then ok = version ~= constr_version |
| 300 | elseif constr.op == "<=" then ok = version <= constr_version | 300 | elseif constr_op == ">" then ok = version > constr_version |
| 301 | elseif constr.op == "~>" then ok = partial_match(version, constr_version) | 301 | elseif constr_op == "<" then ok = version < constr_version |
| 302 | elseif constr_op == ">=" then ok = version >= constr_version | ||
| 303 | elseif constr_op == "<=" then ok = version <= constr_version | ||
| 304 | elseif constr_op == "~>" then ok = partial_match(version, constr_version) | ||
| 302 | end | 305 | end |
| 303 | if not ok then break end | 306 | if not ok then break end |
| 304 | end | 307 | end |
diff --git a/src/luarocks/install.lua b/src/luarocks/install.lua index 3960dcb8..8ada2d50 100644 --- a/src/luarocks/install.lua +++ b/src/luarocks/install.lua | |||
| @@ -10,6 +10,7 @@ local util = require("luarocks.util") | |||
| 10 | local fs = require("luarocks.fs") | 10 | local fs = require("luarocks.fs") |
| 11 | local deps = require("luarocks.deps") | 11 | local deps = require("luarocks.deps") |
| 12 | local manif = require("luarocks.manif") | 12 | local manif = require("luarocks.manif") |
| 13 | local remove = require("luarocks.remove") | ||
| 13 | local cfg = require("luarocks.cfg") | 14 | local cfg = require("luarocks.cfg") |
| 14 | 15 | ||
| 15 | help_summary = "Install a rock." | 16 | help_summary = "Install a rock." |
| @@ -26,8 +27,8 @@ or a filename of a locally available rock. | |||
| 26 | -- @param deps_mode: string: Which trees to check dependencies for: | 27 | -- @param deps_mode: string: Which trees to check dependencies for: |
| 27 | -- "one" for the current default tree, "all" for all trees, | 28 | -- "one" for the current default tree, "all" for all trees, |
| 28 | -- "order" for all trees with priority >= the current default, "none" for no trees. | 29 | -- "order" for all trees with priority >= the current default, "none" for no trees. |
| 29 | -- @return boolean or (nil, string, [string]): True if succeeded or | 30 | -- @return (string, string) or (nil, string, [string]): Name and version of |
| 30 | -- nil and an error message and an optional error code. | 31 | -- installed rock if succeeded or nil and an error message followed by an error code. |
| 31 | function install_binary_rock(rock_file, deps_mode) | 32 | function install_binary_rock(rock_file, deps_mode) |
| 32 | assert(type(rock_file) == "string") | 33 | assert(type(rock_file) == "string") |
| 33 | 34 | ||
| @@ -103,7 +104,7 @@ function install_binary_rock(rock_file, deps_mode) | |||
| 103 | util.printout(name.." "..version.." is now installed in "..root_dir.." "..license) | 104 | util.printout(name.." "..version.." is now installed in "..root_dir.." "..license) |
| 104 | 105 | ||
| 105 | util.remove_scheduled_function(rollback) | 106 | util.remove_scheduled_function(rollback) |
| 106 | return true | 107 | return name, version |
| 107 | end | 108 | end |
| 108 | 109 | ||
| 109 | --- Driver function for the "install" command. | 110 | --- Driver function for the "install" command. |
| @@ -130,7 +131,14 @@ function run(...) | |||
| 130 | local build = require("luarocks.build") | 131 | local build = require("luarocks.build") |
| 131 | return build.run(name, deps.get_deps_mode(flags), flags["local"] and "--local") | 132 | return build.run(name, deps.get_deps_mode(flags), flags["local"] and "--local") |
| 132 | elseif name:match("%.rock$") then | 133 | elseif name:match("%.rock$") then |
| 133 | return install_binary_rock(name, deps.get_deps_mode(flags)) | 134 | ok, err = install_binary_rock(name, deps.get_deps_mode(flags)) |
| 135 | if not ok then return nil, err end | ||
| 136 | local name, version = ok, err | ||
| 137 | if (not flags["keep"]) and not cfg.keep_other_versions then | ||
| 138 | local ok, err = remove.remove_other_versions(name, version, flags["force"]) | ||
| 139 | if not ok then util.printerr(err) end | ||
| 140 | end | ||
| 141 | return name, version | ||
| 134 | else | 142 | else |
| 135 | local search = require("luarocks.search") | 143 | local search = require("luarocks.search") |
| 136 | local results, err = search.find_suitable_rock(search.make_query(name:lower(), version)) | 144 | local results, err = search.find_suitable_rock(search.make_query(name:lower(), version)) |
diff --git a/src/luarocks/make_manifest.lua b/src/luarocks/make_manifest.lua index f793dcf2..a698f830 100644 --- a/src/luarocks/make_manifest.lua +++ b/src/luarocks/make_manifest.lua | |||
| @@ -13,6 +13,9 @@ help_summary = "Compile a manifest file for a repository." | |||
| 13 | 13 | ||
| 14 | help = [[ | 14 | help = [[ |
| 15 | <argument>, if given, is a local repository pathname. | 15 | <argument>, if given, is a local repository pathname. |
| 16 | |||
| 17 | --local-tree If given, do not write versioned versions of the manifest file. | ||
| 18 | Use this when rebuilding the manifest of a local rocks tree. | ||
| 16 | ]] | 19 | ]] |
| 17 | 20 | ||
| 18 | --- Driver function for "make_manifest" command. | 21 | --- Driver function for "make_manifest" command. |
| @@ -28,8 +31,8 @@ function run(...) | |||
| 28 | 31 | ||
| 29 | util.printout("Making manifest for "..repo) | 32 | util.printout("Making manifest for "..repo) |
| 30 | 33 | ||
| 31 | local ok, err = manif.make_manifest(repo, deps.get_deps_mode(flags), true) | 34 | local ok, err = manif.make_manifest(repo, deps.get_deps_mode(flags), not flags["local-tree"]) |
| 32 | if ok then | 35 | if ok and not flags["local-tree"] then |
| 33 | util.printout("Generating index.html for "..repo) | 36 | util.printout("Generating index.html for "..repo) |
| 34 | index.make_index(repo) | 37 | index.make_index(repo) |
| 35 | end | 38 | end |
diff --git a/src/luarocks/pack.lua b/src/luarocks/pack.lua index eaa0e165..ed340a35 100644 --- a/src/luarocks/pack.lua +++ b/src/luarocks/pack.lua | |||
| @@ -111,7 +111,7 @@ local function do_pack_binary_rock(name, version) | |||
| 111 | 111 | ||
| 112 | local root = path.root_dir(info.repo) | 112 | local root = path.root_dir(info.repo) |
| 113 | local prefix = path.install_dir(name, version, root) | 113 | local prefix = path.install_dir(name, version, root) |
| 114 | 114 | print(prefix) | |
| 115 | if not fs.exists(prefix) then | 115 | if not fs.exists(prefix) then |
| 116 | return nil, "'"..name.." "..version.."' does not seem to be an installed rock." | 116 | return nil, "'"..name.." "..version.."' does not seem to be an installed rock." |
| 117 | end | 117 | end |
diff --git a/src/luarocks/purge.lua b/src/luarocks/purge.lua index 46a023e9..6b094061 100644 --- a/src/luarocks/purge.lua +++ b/src/luarocks/purge.lua | |||
| @@ -44,5 +44,5 @@ function run(...) | |||
| 44 | end | 44 | end |
| 45 | end | 45 | end |
| 46 | end | 46 | end |
| 47 | return manif.make_manifest(cfg.rocks_dir, "one", true) | 47 | return manif.make_manifest(cfg.rocks_dir, "one") |
| 48 | end | 48 | end |
diff --git a/src/luarocks/remove.lua b/src/luarocks/remove.lua index 8c899a0a..96816419 100644 --- a/src/luarocks/remove.lua +++ b/src/luarocks/remove.lua | |||
| @@ -69,6 +69,58 @@ local function delete_versions(name, versions) | |||
| 69 | return true | 69 | return true |
| 70 | end | 70 | end |
| 71 | 71 | ||
| 72 | function remove_search_results(results, name, deps_mode, force) | ||
| 73 | local versions = results[name] | ||
| 74 | |||
| 75 | local version = next(versions) | ||
| 76 | local second = next(versions, version) | ||
| 77 | |||
| 78 | util.printout("Checking stability of dependencies on the absence of") | ||
| 79 | util.printout(name.." "..table.concat(util.keys(versions), ", ").."...") | ||
| 80 | util.printout() | ||
| 81 | |||
| 82 | local dependents = check_dependents(name, versions, deps_mode) | ||
| 83 | |||
| 84 | if #dependents == 0 or force then | ||
| 85 | if #dependents > 0 then | ||
| 86 | util.printerr("The following packages may be broken by this forced removal:") | ||
| 87 | for _, dependent in ipairs(dependents) do | ||
| 88 | util.printerr(dependent.name.." "..dependent.version) | ||
| 89 | end | ||
| 90 | util.printerr() | ||
| 91 | end | ||
| 92 | local ok, err = delete_versions(name, versions) | ||
| 93 | if not ok then return nil, err end | ||
| 94 | ok, err = manif.make_manifest(cfg.rocks_dir, deps_mode) | ||
| 95 | if not ok then return nil, err end | ||
| 96 | else | ||
| 97 | if not second then | ||
| 98 | util.printerr("Will not remove "..name.." "..version..".") | ||
| 99 | util.printerr("Removing it would break dependencies for: ") | ||
| 100 | else | ||
| 101 | util.printerr("Will not remove installed versions of "..name..".") | ||
| 102 | util.printerr("Removing them would break dependencies for: ") | ||
| 103 | end | ||
| 104 | for _, dependent in ipairs(dependents) do | ||
| 105 | util.printerr(dependent.name.." "..dependent.version) | ||
| 106 | end | ||
| 107 | util.printerr() | ||
| 108 | util.printerr("Use --force to force removal (warning: this may break modules).") | ||
| 109 | return nil, "Failed removing." | ||
| 110 | end | ||
| 111 | util.printout("Removal successful.") | ||
| 112 | return true | ||
| 113 | end | ||
| 114 | |||
| 115 | function remove_other_versions(name, version, force) | ||
| 116 | local results = {} | ||
| 117 | search.manifest_search(results, cfg.rocks_dir, { name = name, exact_name = true, constraints = {{ op = "~=", version = version}} }) | ||
| 118 | if results[name] then | ||
| 119 | return remove_search_results(results, name, cfg.deps_mode, force) | ||
| 120 | end | ||
| 121 | return true | ||
| 122 | end | ||
| 123 | |||
| 72 | --- Driver function for the "remove" command. | 124 | --- Driver function for the "remove" command. |
| 73 | -- @param name string: name of a rock. If a version is given, refer to | 125 | -- @param name string: name of a rock. If a version is given, refer to |
| 74 | -- a specific version; otherwise, try to remove all versions. | 126 | -- a specific version; otherwise, try to remove all versions. |
| @@ -97,48 +149,9 @@ function run(...) | |||
| 97 | 149 | ||
| 98 | local results = {} | 150 | local results = {} |
| 99 | search.manifest_search(results, cfg.rocks_dir, search.make_query(name, version)) | 151 | search.manifest_search(results, cfg.rocks_dir, search.make_query(name, version)) |
| 100 | 152 | if not results[name] then | |
| 101 | local versions = results[name] | ||
| 102 | if not versions then | ||
| 103 | return nil, "Could not find rock '"..name..(version and " "..version or "").."' in local tree." | 153 | return nil, "Could not find rock '"..name..(version and " "..version or "").."' in local tree." |
| 104 | else | ||
| 105 | local version = next(versions) | ||
| 106 | local second = next(versions, version) | ||
| 107 | |||
| 108 | util.printout("Checking stability of dependencies on the absence of") | ||
| 109 | util.printout(name.." "..table.concat(util.keys(versions), ", ").."...") | ||
| 110 | util.printout() | ||
| 111 | |||
| 112 | local dependents = check_dependents(name, versions, deps_mode) | ||
| 113 | |||
| 114 | if #dependents == 0 or flags["force"] then | ||
| 115 | if #dependents > 0 then | ||
| 116 | util.printerr("The following packages may be broken by this forced removal:") | ||
| 117 | for _, dependent in ipairs(dependents) do | ||
| 118 | util.printerr(dependent.name.." "..dependent.version) | ||
| 119 | end | ||
| 120 | util.printerr() | ||
| 121 | end | ||
| 122 | local ok, err = delete_versions(name, versions) | ||
| 123 | if not ok then return nil, err end | ||
| 124 | ok, err = manif.make_manifest(cfg.rocks_dir, deps_mode) | ||
| 125 | if not ok then return nil, err end | ||
| 126 | else | ||
| 127 | if not second then | ||
| 128 | util.printerr("Will not remove "..name.." "..version..".") | ||
| 129 | util.printerr("Removing it would break dependencies for: ") | ||
| 130 | else | ||
| 131 | util.printerr("Will not remove all versions of "..name..".") | ||
| 132 | util.printerr("Removing them would break dependencies for: ") | ||
| 133 | end | ||
| 134 | for _, dependent in ipairs(dependents) do | ||
| 135 | util.printerr(dependent.name.." "..dependent.version) | ||
| 136 | end | ||
| 137 | util.printerr() | ||
| 138 | util.printerr("Use --force to force removal (warning: this may break modules).") | ||
| 139 | return nil, "Failed removing." | ||
| 140 | end | ||
| 141 | end | 154 | end |
| 142 | util.printout("Removal successful.") | 155 | |
| 143 | return true | 156 | return remove_search_results(results, name, deps_mode, flags["force"]) |
| 144 | end | 157 | end |
