summaryrefslogtreecommitdiff
path: root/src/luarocks/download.lua
diff options
context:
space:
mode:
authorMike Vink <mike@pionative.com>2025-02-03 21:29:42 +0100
committerMike Vink <mike@pionative.com>2025-02-03 21:29:42 +0100
commit5155816b7b925dec5d5feb1568b1d7ceb00938b9 (patch)
treedeca28ea15e79f6f804c3d90d2ba757881638af5 /src/luarocks/download.lua
fetch tarballHEADmaster
Diffstat (limited to 'src/luarocks/download.lua')
-rw-r--r--src/luarocks/download.lua68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/luarocks/download.lua b/src/luarocks/download.lua
new file mode 100644
index 0000000..07a2a65
--- /dev/null
+++ b/src/luarocks/download.lua
@@ -0,0 +1,68 @@
+local download = {}
+
+local path = require("luarocks.path")
+local fetch = require("luarocks.fetch")
+local search = require("luarocks.search")
+local queries = require("luarocks.queries")
+local fs = require("luarocks.fs")
+local dir = require("luarocks.dir")
+local util = require("luarocks.util")
+
+local function get_file(filename)
+ local protocol, pathname = dir.split_url(filename)
+ if protocol == "file" then
+ local ok, err = fs.copy(pathname, fs.current_dir(), "read")
+ if ok then
+ return pathname
+ else
+ return nil, err
+ end
+ else
+ -- discard third result
+ local ok, err = fetch.fetch_url(filename)
+ return ok, err
+ end
+end
+
+function download.download(arch, name, namespace, version, all, check_lua_versions)
+ local substring = (all and name == "")
+ local query = queries.new(name, namespace, version, substring, arch)
+ local search_err
+
+ if all then
+ local results = search.search_repos(query)
+ local has_result = false
+ local all_ok = true
+ local any_err = ""
+ for name, result in pairs(results) do -- luacheck: ignore 422
+ for version, items in pairs(result) do -- luacheck: ignore 422
+ for _, item in ipairs(items) do
+ -- Ignore provided rocks.
+ if item.arch ~= "installed" then
+ has_result = true
+ local filename = path.make_url(item.repo, name, version, item.arch)
+ local ok, err = get_file(filename)
+ if not ok then
+ all_ok = false
+ any_err = any_err .. "\n" .. err
+ end
+ end
+ end
+ end
+ end
+
+ if has_result then
+ return all_ok, any_err
+ end
+ else
+ local url
+ url, search_err = search.find_rock_checking_lua_versions(query, check_lua_versions)
+ if url then
+ return get_file(url)
+ end
+ end
+ local rock = util.format_rock_name(name, namespace, version)
+ return nil, "Could not find a result named "..rock..(search_err and ": "..search_err or ".")
+end
+
+return download