diff options
| author | Hisham <hisham@gobolinux.org> | 2016-10-14 16:38:51 -0700 |
|---|---|---|
| committer | Hisham <hisham@gobolinux.org> | 2016-10-14 16:38:51 -0700 |
| commit | 075196e8b5d315888a8ae110fa9a18089044ae3b (patch) | |
| tree | eca3eb78c23f8d85dbe625564a2d66966d6281f1 /src | |
| parent | dbca97cdcc15e386554b2631a0ae7aca02500abf (diff) | |
| parent | 1fea0e3a0972bcc6b4319cd3d9e79834562486bc (diff) | |
| download | luarocks-075196e8b5d315888a8ae110fa9a18089044ae3b.tar.gz luarocks-075196e8b5d315888a8ae110fa9a18089044ae3b.tar.bz2 luarocks-075196e8b5d315888a8ae110fa9a18089044ae3b.zip | |
Merge branch 'master' into luarocks-3
Diffstat (limited to 'src')
| -rw-r--r-- | src/luarocks/core/cfg.lua | 8 | ||||
| -rw-r--r-- | src/luarocks/core/util.lua | 79 | ||||
| -rw-r--r-- | src/luarocks/doc.lua | 4 | ||||
| -rw-r--r-- | src/luarocks/loader.lua | 29 | ||||
| -rw-r--r-- | src/luarocks/pack.lua | 38 | ||||
| -rw-r--r-- | src/luarocks/search.lua | 33 | ||||
| -rw-r--r-- | src/luarocks/show.lua | 37 |
7 files changed, 123 insertions, 105 deletions
diff --git a/src/luarocks/core/cfg.lua b/src/luarocks/core/cfg.lua index 73bff097..b5c60ed1 100644 --- a/src/luarocks/core/cfg.lua +++ b/src/luarocks/core/cfg.lua | |||
| @@ -6,10 +6,9 @@ | |||
| 6 | -- file format documentation</a> for details. | 6 | -- file format documentation</a> for details. |
| 7 | -- | 7 | -- |
| 8 | -- End-users shouldn't edit this file. They can override any defaults | 8 | -- End-users shouldn't edit this file. They can override any defaults |
| 9 | -- set in this file using their system-wide $LUAROCKS_SYSCONFIG file | 9 | -- set in this file using their system-wide or user-specific configuration |
| 10 | -- (see luarocks.site_config) or their user-specific configuration file | 10 | -- files. Run `luarocks` with no arguments to see the locations of |
| 11 | -- (~/.luarocks/config.lua on Unix or %APPDATA%/luarocks/config.lua on | 11 | -- these files in your platform. |
| 12 | -- Windows). | ||
| 13 | 12 | ||
| 14 | local rawset, next, table, pairs, require, io, os, setmetatable, pcall, ipairs, package, tonumber, type, assert, _VERSION = | 13 | local rawset, next, table, pairs, require, io, os, setmetatable, pcall, ipairs, package, tonumber, type, assert, _VERSION = |
| 15 | rawset, next, table, pairs, require, io, os, setmetatable, pcall, ipairs, package, tonumber, type, assert, _VERSION | 14 | rawset, next, table, pairs, require, io, os, setmetatable, pcall, ipairs, package, tonumber, type, assert, _VERSION |
| @@ -477,6 +476,7 @@ if cfg.platforms.mingw32 then | |||
| 477 | defaults.variables.RANLIB = "ranlib" | 476 | defaults.variables.RANLIB = "ranlib" |
| 478 | defaults.variables.CFLAGS = "-O2" | 477 | defaults.variables.CFLAGS = "-O2" |
| 479 | defaults.variables.LIBFLAG = "-shared" | 478 | defaults.variables.LIBFLAG = "-shared" |
| 479 | defaults.makefile = "Makefile" | ||
| 480 | defaults.external_deps_patterns = { | 480 | defaults.external_deps_patterns = { |
| 481 | bin = { "?.exe", "?.bat" }, | 481 | bin = { "?.exe", "?.bat" }, |
| 482 | -- mingw lookup list from http://stackoverflow.com/a/15853231/1793220 | 482 | -- mingw lookup list from http://stackoverflow.com/a/15853231/1793220 |
diff --git a/src/luarocks/core/util.lua b/src/luarocks/core/util.lua index f2e409d1..85b59af6 100644 --- a/src/luarocks/core/util.lua +++ b/src/luarocks/core/util.lua | |||
| @@ -213,52 +213,59 @@ local function default_sort(a, b) | |||
| 213 | end | 213 | end |
| 214 | end | 214 | end |
| 215 | 215 | ||
| 216 | --- The iterator function used internally by util.sortedpairs. | 216 | --- A table iterator generator that returns elements sorted by key, |
| 217 | -- to be used in "for" loops. | ||
| 217 | -- @param tbl table: The table to be iterated. | 218 | -- @param tbl table: The table to be iterated. |
| 218 | -- @param sort_function function or nil: An optional comparison function | 219 | -- @param sort_function function or table or nil: An optional comparison function |
| 219 | -- to be used by table.sort when sorting keys. | 220 | -- to be used by table.sort when sorting keys, or an array listing an explicit order |
| 220 | -- @see sortedpairs | 221 | -- for keys. If a value itself is an array, it is taken so that the first element |
| 221 | local function sortedpairs_iterator(tbl, sort_function) | 222 | -- is a string representing the field name, and the second element is a priority table |
| 222 | local ks = util.keys(tbl) | 223 | -- for that key, which is returned by the iterator as the third value after the key |
| 223 | if not sort_function or type(sort_function) == "function" then | 224 | -- and the value. |
| 224 | table.sort(ks, sort_function or default_sort) | 225 | -- @return function: the iterator function. |
| 225 | for _, k in ipairs(ks) do | 226 | function util.sortedpairs(tbl, sort_function) |
| 226 | coroutine.yield(k, tbl[k]) | 227 | sort_function = sort_function or default_sort |
| 227 | end | 228 | local keys = util.keys(tbl) |
| 229 | local sub_orders = {} | ||
| 230 | |||
| 231 | if type(sort_function) == "function" then | ||
| 232 | table.sort(keys, sort_function) | ||
| 228 | else | 233 | else |
| 229 | local order = sort_function | 234 | local order = sort_function |
| 230 | local done = {} | 235 | local ordered_keys = {} |
| 231 | for _, k in ipairs(order) do | 236 | local all_keys = keys |
| 232 | local sub_order | 237 | keys = {} |
| 233 | if type(k) == "table" then | 238 | |
| 234 | sub_order = k[2] | 239 | for _, order_entry in ipairs(order) do |
| 235 | k = k[1] | 240 | local key, sub_order |
| 241 | if type(order_entry) == "table" then | ||
| 242 | key = order_entry[1] | ||
| 243 | sub_order = order_entry[2] | ||
| 244 | else | ||
| 245 | key = order_entry | ||
| 236 | end | 246 | end |
| 237 | if tbl[k] then | 247 | |
| 238 | done[k] = true | 248 | if tbl[key] then |
| 239 | coroutine.yield(k, tbl[k], sub_order) | 249 | ordered_keys[key] = true |
| 250 | sub_orders[key] = sub_order | ||
| 251 | table.insert(keys, key) | ||
| 240 | end | 252 | end |
| 241 | end | 253 | end |
| 242 | table.sort(ks, default_sort) | 254 | |
| 243 | for _, k in ipairs(ks) do | 255 | table.sort(all_keys, default_sort) |
| 244 | if not done[k] then | 256 | for _, key in ipairs(all_keys) do |
| 245 | coroutine.yield(k, tbl[k]) | 257 | if not ordered_keys[key] then |
| 258 | table.insert(keys, key) | ||
| 246 | end | 259 | end |
| 247 | end | 260 | end |
| 248 | end | 261 | end |
| 249 | end | ||
| 250 | 262 | ||
| 251 | --- A table iterator generator that returns elements sorted by key, | 263 | local i = 1 |
| 252 | -- to be used in "for" loops. | 264 | return function() |
| 253 | -- @param tbl table: The table to be iterated. | 265 | local key = keys[i] |
| 254 | -- @param sort_function function or table or nil: An optional comparison function | 266 | i = i + 1 |
| 255 | -- to be used by table.sort when sorting keys, or an array listing an explicit order | 267 | return key, tbl[key], sub_orders[key] |
| 256 | -- for keys. If a value itself is an array, it is taken so that the first element | 268 | end |
| 257 | -- is a string representing the field name, and the second element is a priority table | ||
| 258 | -- for that key. | ||
| 259 | -- @return function: the iterator function. | ||
| 260 | function util.sortedpairs(tbl, sort_function) | ||
| 261 | return coroutine.wrap(function() sortedpairs_iterator(tbl, sort_function) end) | ||
| 262 | end | 269 | end |
| 263 | 270 | ||
| 264 | return util | 271 | return util |
diff --git a/src/luarocks/doc.lua b/src/luarocks/doc.lua index 8378bbc2..63c4c4e3 100644 --- a/src/luarocks/doc.lua +++ b/src/luarocks/doc.lua | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | local doc = {} | 4 | local doc = {} |
| 5 | 5 | ||
| 6 | local util = require("luarocks.util") | 6 | local util = require("luarocks.util") |
| 7 | local show = require("luarocks.show") | 7 | local search = require("luarocks.search") |
| 8 | local path = require("luarocks.path") | 8 | local path = require("luarocks.path") |
| 9 | local dir = require("luarocks.dir") | 9 | local dir = require("luarocks.dir") |
| 10 | local fetch = require("luarocks.fetch") | 10 | local fetch = require("luarocks.fetch") |
| @@ -61,7 +61,7 @@ function doc.command(flags, name, version) | |||
| 61 | return nil, "Argument missing. "..util.see_help("doc") | 61 | return nil, "Argument missing. "..util.see_help("doc") |
| 62 | end | 62 | end |
| 63 | 63 | ||
| 64 | local iname, iversion, repo = show.pick_installed_rock(name, version, flags["tree"]) | 64 | local iname, iversion, repo = search.pick_installed_rock(name, version, flags["tree"]) |
| 65 | if not iname then | 65 | if not iname then |
| 66 | util.printout(name..(version and " "..version or "").." is not installed. Looking for it in the rocks servers...") | 66 | util.printout(name..(version and " "..version or "").." is not installed. Looking for it in the rocks servers...") |
| 67 | return try_to_open_homepage(name, version) | 67 | return try_to_open_homepage(name, version) |
diff --git a/src/luarocks/loader.lua b/src/luarocks/loader.lua index 0faaebda..b8072110 100644 --- a/src/luarocks/loader.lua +++ b/src/luarocks/loader.lua | |||
| @@ -25,6 +25,28 @@ local util = require("luarocks.core.util") | |||
| 25 | local require = nil | 25 | local require = nil |
| 26 | -------------------------------------------------------------------------------- | 26 | -------------------------------------------------------------------------------- |
| 27 | 27 | ||
| 28 | -- Workaround for wrappers produced by older versions of LuaRocks | ||
| 29 | local temporary_global = false | ||
| 30 | if luarocks then | ||
| 31 | -- The site_config.lua file generated by old versions uses module(), | ||
| 32 | -- so it produces a global `luarocks` table. Since we have the table, | ||
| 33 | -- add the `loader` field to make the old wrappers happy. | ||
| 34 | luarocks.loader = loader | ||
| 35 | else | ||
| 36 | -- When a new version is installed on top of an old version, | ||
| 37 | -- site_config.lua may be replaced, and then it no longer creates | ||
| 38 | -- a global. | ||
| 39 | -- Detect when being called via -lluarocks.loader; this is | ||
| 40 | -- most likely a wrapper. | ||
| 41 | local info = debug.getinfo(2, "nS") | ||
| 42 | if info.what == "C" and not info.name then | ||
| 43 | luarocks = { loader = loader } | ||
| 44 | temporary_global = true | ||
| 45 | -- For the other half of this hack, | ||
| 46 | -- see the next use of `temporary_global` below. | ||
| 47 | end | ||
| 48 | end | ||
| 49 | |||
| 28 | loader.context = {} | 50 | loader.context = {} |
| 29 | 51 | ||
| 30 | -- Contains a table when rocks trees are loaded, | 52 | -- Contains a table when rocks trees are loaded, |
| @@ -58,6 +80,13 @@ function loader.add_context(name, version) | |||
| 58 | -- assert(type(name) == "string") | 80 | -- assert(type(name) == "string") |
| 59 | -- assert(type(version) == "string") | 81 | -- assert(type(version) == "string") |
| 60 | 82 | ||
| 83 | if temporary_global then | ||
| 84 | -- The first thing a wrapper does is to call add_context. | ||
| 85 | -- From here on, it's safe to clean the global environment. | ||
| 86 | luarocks = nil | ||
| 87 | temporary_global = false | ||
| 88 | end | ||
| 89 | |||
| 61 | if loader.context[name] then | 90 | if loader.context[name] then |
| 62 | return | 91 | return |
| 63 | end | 92 | end |
diff --git a/src/luarocks/pack.lua b/src/luarocks/pack.lua index b85653e9..989d49ee 100644 --- a/src/luarocks/pack.lua +++ b/src/luarocks/pack.lua | |||
| @@ -83,38 +83,20 @@ end | |||
| 83 | 83 | ||
| 84 | -- @param name string: Name of package to pack. | 84 | -- @param name string: Name of package to pack. |
| 85 | -- @param version string or nil: A version number may also be passed. | 85 | -- @param version string or nil: A version number may also be passed. |
| 86 | -- @param tree string or nil: An optional tree to pick the package from. | ||
| 86 | -- @return string or (nil, string): The filename of the resulting | 87 | -- @return string or (nil, string): The filename of the resulting |
| 87 | -- .src.rock file; or nil and an error message. | 88 | -- .src.rock file; or nil and an error message. |
| 88 | local function do_pack_binary_rock(name, version) | 89 | local function do_pack_binary_rock(name, version, tree) |
| 89 | assert(type(name) == "string") | 90 | assert(type(name) == "string") |
| 90 | assert(type(version) == "string" or not version) | 91 | assert(type(version) == "string" or not version) |
| 91 | 92 | ||
| 92 | local query = search.make_query(name, version) | 93 | local repo, repo_url |
| 93 | query.exact_name = true | 94 | name, version, repo, repo_url = search.pick_installed_rock(name, version, tree) |
| 94 | local results = {} | 95 | if not name then |
| 95 | 96 | return nil, version | |
| 96 | search.manifest_search(results, cfg.rocks_dir, query) | ||
| 97 | |||
| 98 | if not next(results) then | ||
| 99 | return nil, "'"..name.."' does not seem to be an installed rock." | ||
| 100 | end | ||
| 101 | |||
| 102 | local versions = results[name] | ||
| 103 | |||
| 104 | if not version then | ||
| 105 | local first = next(versions) | ||
| 106 | if next(versions, first) then | ||
| 107 | return nil, "Please specify which version of '"..name.."' to pack." | ||
| 108 | end | ||
| 109 | version = first | ||
| 110 | end | ||
| 111 | if not version:match("[^-]+%-%d+") then | ||
| 112 | return nil, "Expected version "..version.." in version-revision format." | ||
| 113 | end | 97 | end |
| 114 | 98 | ||
| 115 | local info = versions[version][1] | 99 | local root = path.root_dir(repo_url) |
| 116 | |||
| 117 | local root = path.root_dir(info.repo) | ||
| 118 | local prefix = path.install_dir(name, version, root) | 100 | local prefix = path.install_dir(name, version, root) |
| 119 | if not fs.exists(prefix) then | 101 | if not fs.exists(prefix) then |
| 120 | return nil, "'"..name.." "..version.."' does not seem to be an installed rock." | 102 | return nil, "'"..name.." "..version.."' does not seem to be an installed rock." |
| @@ -180,7 +162,7 @@ function pack.pack_binary_rock(name, version, cmd, ...) | |||
| 180 | if not rname then | 162 | if not rname then |
| 181 | rname, rversion = name, version | 163 | rname, rversion = name, version |
| 182 | end | 164 | end |
| 183 | return do_pack_binary_rock(rname, rversion) | 165 | return do_pack_binary_rock(rname, rversion, temp_dir) |
| 184 | end | 166 | end |
| 185 | 167 | ||
| 186 | --- Driver function for the "pack" command. | 168 | --- Driver function for the "pack" command. |
| @@ -200,7 +182,7 @@ function pack.command(flags, arg, version) | |||
| 200 | if arg:match(".*%.rockspec") then | 182 | if arg:match(".*%.rockspec") then |
| 201 | file, err = pack.pack_source_rock(arg) | 183 | file, err = pack.pack_source_rock(arg) |
| 202 | else | 184 | else |
| 203 | file, err = do_pack_binary_rock(arg, version) | 185 | file, err = do_pack_binary_rock(arg, version, flags["tree"]) |
| 204 | end | 186 | end |
| 205 | if err then | 187 | if err then |
| 206 | return nil, err | 188 | return nil, err |
diff --git a/src/luarocks/search.lua b/src/luarocks/search.lua index 7d4f3e81..44eff694 100644 --- a/src/luarocks/search.lua +++ b/src/luarocks/search.lua | |||
| @@ -415,6 +415,39 @@ function search.act_on_src_or_rockspec(action, name, version, ...) | |||
| 415 | return action(url, ...) | 415 | return action(url, ...) |
| 416 | end | 416 | end |
| 417 | 417 | ||
| 418 | function search.pick_installed_rock(name, version, given_tree) | ||
| 419 | local results = {} | ||
| 420 | local query = search.make_query(name, version) | ||
| 421 | query.exact_name = true | ||
| 422 | local tree_map = {} | ||
| 423 | local trees = cfg.rocks_trees | ||
| 424 | if given_tree then | ||
| 425 | trees = { given_tree } | ||
| 426 | end | ||
| 427 | for _, tree in ipairs(trees) do | ||
| 428 | local rocks_dir = path.rocks_dir(tree) | ||
| 429 | tree_map[rocks_dir] = tree | ||
| 430 | search.manifest_search(results, rocks_dir, query) | ||
| 431 | end | ||
| 432 | |||
| 433 | if not next(results) then -- | ||
| 434 | return nil,"cannot find package "..name.." "..(version or "").."\nUse 'list' to find installed rocks." | ||
| 435 | end | ||
| 436 | |||
| 437 | version = nil | ||
| 438 | local repo_url | ||
| 439 | local package, versions = util.sortedpairs(results)() | ||
| 440 | --question: what do we do about multiple versions? This should | ||
| 441 | --give us the latest version on the last repo (which is usually the global one) | ||
| 442 | for vs, repositories in util.sortedpairs(versions, deps.compare_versions) do | ||
| 443 | if not version then version = vs end | ||
| 444 | for _, rp in ipairs(repositories) do repo_url = rp.repo end | ||
| 445 | end | ||
| 446 | |||
| 447 | local repo = tree_map[repo_url] | ||
| 448 | return name, version, repo, repo_url | ||
| 449 | end | ||
| 450 | |||
| 418 | --- Driver function for "search" command. | 451 | --- Driver function for "search" command. |
| 419 | -- @param name string: A substring of a rock name to search. | 452 | -- @param name string: A substring of a rock name to search. |
| 420 | -- @param version string or nil: a version may also be passed. | 453 | -- @param version string or nil: a version may also be passed. |
diff --git a/src/luarocks/show.lua b/src/luarocks/show.lua index f0bf2164..66ac6448 100644 --- a/src/luarocks/show.lua +++ b/src/luarocks/show.lua | |||
| @@ -56,45 +56,12 @@ local function format_text(text) | |||
| 56 | return (table.concat(paragraphs, "\n\n"):gsub("%s$", "")) | 56 | return (table.concat(paragraphs, "\n\n"):gsub("%s$", "")) |
| 57 | end | 57 | end |
| 58 | 58 | ||
| 59 | function show.pick_installed_rock(name, version, tree) | ||
| 60 | local results = {} | ||
| 61 | local query = search.make_query(name, version) | ||
| 62 | query.exact_name = true | ||
| 63 | local tree_map = {} | ||
| 64 | local trees = cfg.rocks_trees | ||
| 65 | if tree then | ||
| 66 | trees = { tree } | ||
| 67 | end | ||
| 68 | for _, tree in ipairs(trees) do | ||
| 69 | local rocks_dir = path.rocks_dir(tree) | ||
| 70 | tree_map[rocks_dir] = tree | ||
| 71 | search.manifest_search(results, rocks_dir, query) | ||
| 72 | end | ||
| 73 | |||
| 74 | if not next(results) then -- | ||
| 75 | return nil,"cannot find package "..name.." "..(version or "").."\nUse 'list' to find installed rocks." | ||
| 76 | end | ||
| 77 | |||
| 78 | version = nil | ||
| 79 | local repo_url | ||
| 80 | local package, versions = util.sortedpairs(results)() | ||
| 81 | --question: what do we do about multiple versions? This should | ||
| 82 | --give us the latest version on the last repo (which is usually the global one) | ||
| 83 | for vs, repositories in util.sortedpairs(versions, deps.compare_versions) do | ||
| 84 | if not version then version = vs end | ||
| 85 | for _, rp in ipairs(repositories) do repo_url = rp.repo end | ||
| 86 | end | ||
| 87 | |||
| 88 | local repo = tree_map[repo_url] | ||
| 89 | return name, version, repo, repo_url | ||
| 90 | end | ||
| 91 | |||
| 92 | local function installed_rock_label(name, tree) | 59 | local function installed_rock_label(name, tree) |
| 93 | local installed, version | 60 | local installed, version |
| 94 | if cfg.rocks_provided[name] then | 61 | if cfg.rocks_provided[name] then |
| 95 | installed, version = true, cfg.rocks_provided[name] | 62 | installed, version = true, cfg.rocks_provided[name] |
| 96 | else | 63 | else |
| 97 | installed, version = show.pick_installed_rock(name, nil, tree) | 64 | installed, version = search.pick_installed_rock(name, nil, tree) |
| 98 | end | 65 | end |
| 99 | return installed and "(using "..version..")" or "(missing)" | 66 | return installed and "(using "..version..")" or "(missing)" |
| 100 | end | 67 | end |
| @@ -109,7 +76,7 @@ function show.command(flags, name, version) | |||
| 109 | end | 76 | end |
| 110 | 77 | ||
| 111 | local repo, repo_url | 78 | local repo, repo_url |
| 112 | name, version, repo, repo_url = show.pick_installed_rock(name, version, flags["tree"]) | 79 | name, version, repo, repo_url = search.pick_installed_rock(name, version, flags["tree"]) |
| 113 | if not name then | 80 | if not name then |
| 114 | return nil, version | 81 | return nil, version |
| 115 | end | 82 | end |
