aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorV1K1NGbg <victor@ilchev.com>2024-08-06 12:21:52 +0300
committerV1K1NGbg <victor@ilchev.com>2024-08-06 12:21:52 +0300
commitb9a6f9e6cb2b0f32e8a42db59025cbfba3e4c94d (patch)
tree4659a7a26855b7c1514a59b82526e1b96d59e8cd
parent7bd6fb90e7afea5e0d1af24cc9ef8acb8ddd70f5 (diff)
downloadluarocks-b9a6f9e6cb2b0f32e8a42db59025cbfba3e4c94d.tar.gz
luarocks-b9a6f9e6cb2b0f32e8a42db59025cbfba3e4c94d.tar.bz2
luarocks-b9a6f9e6cb2b0f32e8a42db59025cbfba3e4c94d.zip
manif
-rw-r--r--src/luarocks/fetch.tl4
-rw-r--r--src/luarocks/manif-original.lua225
-rw-r--r--src/luarocks/manif.lua114
-rw-r--r--src/luarocks/manif.tl8
4 files changed, 292 insertions, 59 deletions
diff --git a/src/luarocks/fetch.tl b/src/luarocks/fetch.tl
index fa084507..321d4f4e 100644
--- a/src/luarocks/fetch.tl
+++ b/src/luarocks/fetch.tl
@@ -54,7 +54,7 @@ local function download_with_mirrors(url: string, filename: string, cache: boole
54 end 54 end
55 local name, _, _, from_cache = fs.download(try_url, filename, cache) 55 local name, _, _, from_cache = fs.download(try_url, filename, cache)
56 if name then 56 if name then
57 return ok, name, from_cache 57 return name, nil, nil, from_cache
58 else 58 else
59 err = err .. name .. "\n" 59 err = err .. name .. "\n"
60 end 60 end
@@ -581,7 +581,7 @@ function fetch.fetch_sources(rockspec: Rockspec, extract: boolean, dest_dir?: st
581 if dir.is_basic_protocol(protocol) then 581 if dir.is_basic_protocol(protocol) then
582 proto = fetch as Fetch 582 proto = fetch as Fetch
583 else 583 else
584 ok, proto = pcall(require, "luarocks.fetch."..protocol:gsub("[+-]", "_")) as (boolean, Fetch) 584 ok, proto = pcall(require, ("luarocks.fetch."..protocol:gsub("[+-]", "_")) as string) as (boolean, Fetch)
585 if not ok then 585 if not ok then
586 return nil, "Unknown protocol "..protocol 586 return nil, "Unknown protocol "..protocol
587 end 587 end
diff --git a/src/luarocks/manif-original.lua b/src/luarocks/manif-original.lua
new file mode 100644
index 00000000..a4ddda11
--- /dev/null
+++ b/src/luarocks/manif-original.lua
@@ -0,0 +1,225 @@
1--- Module for handling manifest files and tables.
2-- Manifest files describe the contents of a LuaRocks tree or server.
3-- They are loaded into manifest tables, which are then used for
4-- performing searches, matching dependencies, etc.
5local manif = {}
6
7local core = require("luarocks.core.manif")
8local persist = require("luarocks.persist")
9local fetch = require("luarocks.fetch")
10local dir = require("luarocks.dir")
11local fs = require("luarocks.fs")
12local cfg = require("luarocks.core.cfg")
13local path = require("luarocks.path")
14local util = require("luarocks.util")
15local queries = require("luarocks.queries")
16local type_manifest = require("luarocks.type.manifest")
17
18manif.cache_manifest = core.cache_manifest
19manif.load_rocks_tree_manifests = core.load_rocks_tree_manifests
20manif.scan_dependencies = core.scan_dependencies
21
22manif.rock_manifest_cache = {}
23
24local function check_manifest(repo_url, manifest, globals)
25 local ok, err = type_manifest.check(manifest, globals)
26 if not ok then
27 core.cache_manifest(repo_url, cfg.lua_version, nil)
28 return nil, "Error checking manifest: "..err, "type"
29 end
30 return manifest
31end
32
33local postprocess_dependencies
34do
35 local postprocess_check = setmetatable({}, { __mode = "k" })
36 postprocess_dependencies = function(manifest)
37 if postprocess_check[manifest] then
38 return
39 end
40 if manifest.dependencies then
41 for name, versions in pairs(manifest.dependencies) do
42 for version, entries in pairs(versions) do
43 for k, v in pairs(entries) do
44 entries[k] = queries.from_persisted_table(v)
45 end
46 end
47 end
48 end
49 postprocess_check[manifest] = true
50 end
51end
52
53function manif.load_rock_manifest(name, version, root)
54 assert(type(name) == "string" and not name:match("/"))
55 assert(type(version) == "string")
56
57 local name_version = name.."/"..version
58 if manif.rock_manifest_cache[name_version] then
59 return manif.rock_manifest_cache[name_version].rock_manifest
60 end
61 local pathname = path.rock_manifest_file(name, version, root)
62 local rock_manifest = persist.load_into_table(pathname)
63 if not rock_manifest then
64 return nil, "rock_manifest file not found for "..name.." "..version.." - not a LuaRocks tree?"
65 end
66 manif.rock_manifest_cache[name_version] = rock_manifest
67 return rock_manifest.rock_manifest
68end
69
70--- Load a local or remote manifest describing a repository.
71-- All functions that use manifest tables assume they were obtained
72-- through this function.
73-- @param repo_url string: URL or pathname for the repository.
74-- @param lua_version string: Lua version in "5.x" format, defaults to installed version.
75-- @param versioned_only boolean: If true, do not fall back to the main manifest
76-- if a versioned manifest was not found.
77-- @return table or (nil, string, [string]): A table representing the manifest,
78-- or nil followed by an error message and an optional error code.
79function manif.load_manifest(repo_url, lua_version, versioned_only)
80 assert(type(repo_url) == "string")
81 assert(type(lua_version) == "string" or not lua_version)
82 lua_version = lua_version or cfg.lua_version
83
84 local cached_manifest = core.get_cached_manifest(repo_url, lua_version)
85 if cached_manifest then
86 postprocess_dependencies(cached_manifest)
87 return cached_manifest
88 end
89
90 local filenames = {
91 "manifest-"..lua_version..".zip",
92 "manifest-"..lua_version,
93 not versioned_only and "manifest" or nil,
94 }
95
96 local protocol, repodir = dir.split_url(repo_url)
97 local pathname, from_cache
98 if protocol == "file" then
99 for _, filename in ipairs(filenames) do
100 pathname = dir.path(repodir, filename)
101 if fs.exists(pathname) then
102 break
103 end
104 end
105 else
106 local err, errcode
107 for _, filename in ipairs(filenames) do
108 pathname, err, errcode, from_cache = fetch.fetch_caching(dir.path(repo_url, filename), "no_mirror")
109 if pathname then
110 break
111 end
112 end
113 if not pathname then
114 return nil, err, errcode
115 end
116 end
117 if pathname:match(".*%.zip$") then
118 pathname = fs.absolute_name(pathname)
119 local nozip = pathname:match("(.*)%.zip$")
120 if not from_cache then
121 local dirname = dir.dir_name(pathname)
122 fs.change_dir(dirname)
123 fs.delete(nozip)
124 local ok, err = fs.unzip(pathname)
125 fs.pop_dir()
126 if not ok then
127 fs.delete(pathname)
128 fs.delete(pathname..".timestamp")
129 return nil, "Failed extracting manifest file: " .. err
130 end
131 end
132 pathname = nozip
133 end
134 local manifest, err, errcode = core.manifest_loader(pathname, repo_url, lua_version)
135 if not manifest then
136 return nil, err, errcode
137 end
138
139 postprocess_dependencies(manifest)
140 return check_manifest(repo_url, manifest, err)
141end
142
143--- Get type and name of an item (a module or a command) provided by a file.
144-- @param deploy_type string: rock manifest subtree the file comes from ("bin", "lua", or "lib").
145-- @param file_path string: path to the file relatively to deploy_type subdirectory.
146-- @return (string, string): item type ("module" or "command") and name.
147function manif.get_provided_item(deploy_type, file_path)
148 assert(type(deploy_type) == "string")
149 assert(type(file_path) == "string")
150 local item_type = deploy_type == "bin" and "command" or "module"
151 local item_name = item_type == "command" and file_path or path.path_to_module(file_path)
152 return item_type, item_name
153end
154
155local function get_providers(item_type, item_name, repo)
156 assert(type(item_type) == "string")
157 assert(type(item_name) == "string")
158 local rocks_dir = path.rocks_dir(repo or cfg.root_dir)
159 local manifest = manif.load_manifest(rocks_dir)
160 return manifest and manifest[item_type .. "s"][item_name]
161end
162
163--- Given a name of a module or a command, figure out which rock name and version
164-- correspond to it in the rock tree manifest.
165-- @param item_type string: "module" or "command".
166-- @param item_name string: module or command name.
167-- @param root string or nil: A local root dir for a rocks tree. If not given, the default is used.
168-- @return (string, string) or nil: name and version of the provider rock or nil if there
169-- is no provider.
170function manif.get_current_provider(item_type, item_name, repo)
171 local providers = get_providers(item_type, item_name, repo)
172 if providers then
173 return providers[1]:match("([^/]*)/([^/]*)")
174 end
175end
176
177function manif.get_next_provider(item_type, item_name, repo)
178 local providers = get_providers(item_type, item_name, repo)
179 if providers and providers[2] then
180 return providers[2]:match("([^/]*)/([^/]*)")
181 end
182end
183
184--- Get all versions of a package listed in a manifest file.
185-- @param name string: a package name.
186-- @param deps_mode string: "one", to use only the currently
187-- configured tree; "order" to select trees based on order
188-- (use the current tree and all trees below it on the list)
189-- or "all", to use all trees.
190-- @return table: An array of strings listing installed
191-- versions of a package, and a table indicating where they are found.
192function manif.get_versions(dep, deps_mode)
193 assert(type(dep) == "table")
194 assert(type(deps_mode) == "string")
195
196 local name = dep.name
197 local namespace = dep.namespace
198
199 local version_set = {}
200 path.map_trees(deps_mode, function(tree)
201 local manifest = manif.load_manifest(path.rocks_dir(tree))
202
203 if manifest and manifest.repository[name] then
204 for version in pairs(manifest.repository[name]) do
205 if dep.namespace then
206 local ns_file = path.rock_namespace_file(name, version, tree)
207 local fd = io.open(ns_file, "r")
208 if fd then
209 local ns = fd:read("*a")
210 fd:close()
211 if ns == namespace then
212 version_set[version] = tree
213 end
214 end
215 else
216 version_set[version] = tree
217 end
218 end
219 end
220 end)
221
222 return util.keys(version_set), version_set
223end
224
225return manif
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index a4ddda11..437ebe3b 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -1,9 +1,18 @@
1--- Module for handling manifest files and tables. 1local _tl_compat; if (tonumber((_VERSION or ''):match('[%d.]*$')) or 0) < 5.3 then local p, m = pcall(require, 'compat53.module'); if p then _tl_compat = m end end; local assert = _tl_compat and _tl_compat.assert or assert; local io = _tl_compat and _tl_compat.io or io; local ipairs = _tl_compat and _tl_compat.ipairs or ipairs; local pairs = _tl_compat and _tl_compat.pairs or pairs; local string = _tl_compat and _tl_compat.string or string
2-- Manifest files describe the contents of a LuaRocks tree or server. 2
3-- They are loaded into manifest tables, which are then used for 3
4-- performing searches, matching dependencies, etc. 4
5local manif = {} 5local manif = {}
6 6
7
8
9
10
11
12
13
14
15
7local core = require("luarocks.core.manif") 16local core = require("luarocks.core.manif")
8local persist = require("luarocks.persist") 17local persist = require("luarocks.persist")
9local fetch = require("luarocks.fetch") 18local fetch = require("luarocks.fetch")
@@ -15,6 +24,14 @@ local util = require("luarocks.util")
15local queries = require("luarocks.queries") 24local queries = require("luarocks.queries")
16local type_manifest = require("luarocks.type.manifest") 25local type_manifest = require("luarocks.type.manifest")
17 26
27
28
29
30
31
32
33
34
18manif.cache_manifest = core.cache_manifest 35manif.cache_manifest = core.cache_manifest
19manif.load_rocks_tree_manifests = core.load_rocks_tree_manifests 36manif.load_rocks_tree_manifests = core.load_rocks_tree_manifests
20manif.scan_dependencies = core.scan_dependencies 37manif.scan_dependencies = core.scan_dependencies
@@ -25,7 +42,7 @@ local function check_manifest(repo_url, manifest, globals)
25 local ok, err = type_manifest.check(manifest, globals) 42 local ok, err = type_manifest.check(manifest, globals)
26 if not ok then 43 if not ok then
27 core.cache_manifest(repo_url, cfg.lua_version, nil) 44 core.cache_manifest(repo_url, cfg.lua_version, nil)
28 return nil, "Error checking manifest: "..err, "type" 45 return nil, "Error checking manifest: " .. err, "type"
29 end 46 end
30 return manifest 47 return manifest
31end 48end
@@ -38,9 +55,9 @@ do
38 return 55 return
39 end 56 end
40 if manifest.dependencies then 57 if manifest.dependencies then
41 for name, versions in pairs(manifest.dependencies) do 58 for _, versions in pairs(manifest.dependencies) do
42 for version, entries in pairs(versions) do 59 for _, entries in pairs(versions) do
43 for k, v in pairs(entries) do 60 for k, v in ipairs(entries) do
44 entries[k] = queries.from_persisted_table(v) 61 entries[k] = queries.from_persisted_table(v)
45 end 62 end
46 end 63 end
@@ -51,34 +68,31 @@ do
51end 68end
52 69
53function manif.load_rock_manifest(name, version, root) 70function manif.load_rock_manifest(name, version, root)
54 assert(type(name) == "string" and not name:match("/")) 71 assert(not name:match("/"))
55 assert(type(version) == "string")
56 72
57 local name_version = name.."/"..version 73 local name_version = name .. "/" .. version
58 if manif.rock_manifest_cache[name_version] then 74 if manif.rock_manifest_cache[name_version] then
59 return manif.rock_manifest_cache[name_version].rock_manifest 75 return manif.rock_manifest_cache[name_version].rock_manifest
60 end 76 end
61 local pathname = path.rock_manifest_file(name, version, root) 77 local pathname = path.rock_manifest_file(name, version, root)
62 local rock_manifest = persist.load_into_table(pathname) 78 local rock_manifest = persist.load_into_table(pathname)
63 if not rock_manifest then 79 if not rock_manifest then
64 return nil, "rock_manifest file not found for "..name.." "..version.." - not a LuaRocks tree?" 80 return nil, "rock_manifest file not found for " .. name .. " " .. version .. " - not a LuaRocks tree?"
65 end 81 end
66 manif.rock_manifest_cache[name_version] = rock_manifest 82 manif.rock_manifest_cache[name_version] = rock_manifest
67 return rock_manifest.rock_manifest 83 return rock_manifest.rock_manifest
68end 84end
69 85
70--- Load a local or remote manifest describing a repository. 86
71-- All functions that use manifest tables assume they were obtained 87
72-- through this function. 88
73-- @param repo_url string: URL or pathname for the repository. 89
74-- @param lua_version string: Lua version in "5.x" format, defaults to installed version. 90
75-- @param versioned_only boolean: If true, do not fall back to the main manifest 91
76-- if a versioned manifest was not found. 92
77-- @return table or (nil, string, [string]): A table representing the manifest, 93
78-- or nil followed by an error message and an optional error code. 94
79function manif.load_manifest(repo_url, lua_version, versioned_only) 95function manif.load_manifest(repo_url, lua_version, versioned_only)
80 assert(type(repo_url) == "string")
81 assert(type(lua_version) == "string" or not lua_version)
82 lua_version = lua_version or cfg.lua_version 96 lua_version = lua_version or cfg.lua_version
83 97
84 local cached_manifest = core.get_cached_manifest(repo_url, lua_version) 98 local cached_manifest = core.get_cached_manifest(repo_url, lua_version)
@@ -88,8 +102,8 @@ function manif.load_manifest(repo_url, lua_version, versioned_only)
88 end 102 end
89 103
90 local filenames = { 104 local filenames = {
91 "manifest-"..lua_version..".zip", 105 "manifest-" .. lua_version .. ".zip",
92 "manifest-"..lua_version, 106 "manifest-" .. lua_version,
93 not versioned_only and "manifest" or nil, 107 not versioned_only and "manifest" or nil,
94 } 108 }
95 109
@@ -125,14 +139,14 @@ function manif.load_manifest(repo_url, lua_version, versioned_only)
125 fs.pop_dir() 139 fs.pop_dir()
126 if not ok then 140 if not ok then
127 fs.delete(pathname) 141 fs.delete(pathname)
128 fs.delete(pathname..".timestamp") 142 fs.delete(pathname .. ".timestamp")
129 return nil, "Failed extracting manifest file: " .. err 143 return nil, "Failed extracting manifest file: " .. err
130 end 144 end
131 end 145 end
132 pathname = nozip 146 pathname = nozip
133 end 147 end
134 local manifest, err, errcode = core.manifest_loader(pathname, repo_url, lua_version) 148 local manifest, err, errcode = core.manifest_loader(pathname, repo_url, lua_version)
135 if not manifest then 149 if not manifest and type(err) == "string" then
136 return nil, err, errcode 150 return nil, err, errcode
137 end 151 end
138 152
@@ -140,33 +154,29 @@ function manif.load_manifest(repo_url, lua_version, versioned_only)
140 return check_manifest(repo_url, manifest, err) 154 return check_manifest(repo_url, manifest, err)
141end 155end
142 156
143--- Get type and name of an item (a module or a command) provided by a file. 157
144-- @param deploy_type string: rock manifest subtree the file comes from ("bin", "lua", or "lib"). 158
145-- @param file_path string: path to the file relatively to deploy_type subdirectory. 159
146-- @return (string, string): item type ("module" or "command") and name. 160
147function manif.get_provided_item(deploy_type, file_path) 161function manif.get_provided_item(deploy_type, file_path)
148 assert(type(deploy_type) == "string")
149 assert(type(file_path) == "string")
150 local item_type = deploy_type == "bin" and "command" or "module" 162 local item_type = deploy_type == "bin" and "command" or "module"
151 local item_name = item_type == "command" and file_path or path.path_to_module(file_path) 163 local item_name = item_type == "command" and file_path or path.path_to_module(file_path)
152 return item_type, item_name 164 return item_type, item_name
153end 165end
154 166
155local function get_providers(item_type, item_name, repo) 167local function get_providers(item_type, item_name, repo)
156 assert(type(item_type) == "string")
157 assert(type(item_name) == "string")
158 local rocks_dir = path.rocks_dir(repo or cfg.root_dir) 168 local rocks_dir = path.rocks_dir(repo or cfg.root_dir)
159 local manifest = manif.load_manifest(rocks_dir) 169 local manifest = manif.load_manifest(rocks_dir)
160 return manifest and manifest[item_type .. "s"][item_name] 170 return manifest and (manifest)[item_type .. "s"][item_name]
161end 171end
162 172
163--- Given a name of a module or a command, figure out which rock name and version 173
164-- correspond to it in the rock tree manifest. 174
165-- @param item_type string: "module" or "command". 175
166-- @param item_name string: module or command name. 176
167-- @param root string or nil: A local root dir for a rocks tree. If not given, the default is used. 177
168-- @return (string, string) or nil: name and version of the provider rock or nil if there 178
169-- is no provider. 179
170function manif.get_current_provider(item_type, item_name, repo) 180function manif.get_current_provider(item_type, item_name, repo)
171 local providers = get_providers(item_type, item_name, repo) 181 local providers = get_providers(item_type, item_name, repo)
172 if providers then 182 if providers then
@@ -181,17 +191,15 @@ function manif.get_next_provider(item_type, item_name, repo)
181 end 191 end
182end 192end
183 193
184--- Get all versions of a package listed in a manifest file. 194
185-- @param name string: a package name. 195
186-- @param deps_mode string: "one", to use only the currently 196
187-- configured tree; "order" to select trees based on order 197
188-- (use the current tree and all trees below it on the list) 198
189-- or "all", to use all trees. 199
190-- @return table: An array of strings listing installed 200
191-- versions of a package, and a table indicating where they are found. 201
192function manif.get_versions(dep, deps_mode) 202function manif.get_versions(dep, deps_mode)
193 assert(type(dep) == "table")
194 assert(type(deps_mode) == "string")
195 203
196 local name = dep.name 204 local name = dep.name
197 local namespace = dep.namespace 205 local namespace = dep.namespace
diff --git a/src/luarocks/manif.tl b/src/luarocks/manif.tl
index ff725e5f..f1963150 100644
--- a/src/luarocks/manif.tl
+++ b/src/luarocks/manif.tl
@@ -26,9 +26,9 @@ local type_manifest = require("luarocks.type.manifest")
26 26
27local type tree = require("luarocks.core.types.tree") 27local type tree = require("luarocks.core.types.tree")
28local type Tree = tree.Tree 28local type Tree = tree.Tree
29local type manifest = require("luarocks.core.types.manifest") 29local type m = require("luarocks.core.types.manifest")
30local type Manifest = manifest.Manifest 30local type Manifest = m.Manifest
31local type Tree_manifest = manifest.Tree_manifest 31local type Tree_manifest = m .Tree_manifest
32local type query = require("luarocks.core.types.query") 32local type query = require("luarocks.core.types.query")
33local type Query = query.Query 33local type Query = query.Query
34 34
@@ -167,7 +167,7 @@ end
167local function get_providers(item_type: string, item_name: string, repo: string | Tree): {string} 167local function get_providers(item_type: string, item_name: string, repo: string | Tree): {string}
168 local rocks_dir = path.rocks_dir(repo or cfg.root_dir) 168 local rocks_dir = path.rocks_dir(repo or cfg.root_dir)
169 local manifest = manif.load_manifest(rocks_dir) 169 local manifest = manif.load_manifest(rocks_dir)
170 return manifest and manifest[item_type .. "s"][item_name] 170 return manifest and (manifest as {string: {string: {string}}})[item_type .. "s"][item_name]
171end 171end
172 172
173--- Given a name of a module or a command, figure out which rock name and version 173--- Given a name of a module or a command, figure out which rock name and version