diff options
author | V1K1NGbg <victor@ilchev.com> | 2024-07-05 03:00:43 +0300 |
---|---|---|
committer | V1K1NGbg <victor@ilchev.com> | 2024-08-05 20:49:17 +0300 |
commit | b537a1c1caa235d09698bd298be03996d8efaf14 (patch) | |
tree | a0c13b3f7d4af1ee507f293ce3d84ea7804f4add | |
parent | 90c01d94d37b475eb6f2fa898ed0650b826f3620 (diff) | |
download | luarocks-b537a1c1caa235d09698bd298be03996d8efaf14.tar.gz luarocks-b537a1c1caa235d09698bd298be03996d8efaf14.tar.bz2 luarocks-b537a1c1caa235d09698bd298be03996d8efaf14.zip |
fixed more bugs (inc. vers bug), implemented tree and other config values, and created a prototype for manifest
-rw-r--r-- | src/luarocks/core/cfg.d.tl | 17 | ||||
-rw-r--r-- | src/luarocks/core/dir.lua | 41 | ||||
-rw-r--r-- | src/luarocks/core/manif.lua | 51 | ||||
-rw-r--r-- | src/luarocks/core/manif.tl | 51 | ||||
-rw-r--r-- | src/luarocks/core/path.lua | 6 | ||||
-rw-r--r-- | src/luarocks/core/path.tl | 24 | ||||
-rw-r--r-- | src/luarocks/core/util.lua | 11 | ||||
-rw-r--r-- | src/luarocks/core/vers.lua | 39 | ||||
-rw-r--r-- | src/luarocks/core/vers.tl | 12 |
9 files changed, 192 insertions, 60 deletions
diff --git a/src/luarocks/core/cfg.d.tl b/src/luarocks/core/cfg.d.tl index 09815260..11d647ff 100644 --- a/src/luarocks/core/cfg.d.tl +++ b/src/luarocks/core/cfg.d.tl | |||
@@ -3,5 +3,18 @@ local record cfg | |||
3 | make_platforms: function(system: string): {any: boolean} | 3 | make_platforms: function(system: string): {any: boolean} |
4 | make_defaults: function(lua_version: string, target_cpu: string, platforms: {any: any}, home: string): {any: any} | 4 | make_defaults: function(lua_version: string, target_cpu: string, platforms: {any: any}, home: string): {any: any} |
5 | use_defaults: function(cfg, defaults: {any: any}) | 5 | use_defaults: function(cfg, defaults: {any: any}) |
6 | --! | 6 | root_dir: string | Tree |
7 | end \ No newline at end of file | 7 | rocks_subdir: string |
8 | lua_modules_path: string | ||
9 | lib_modules_path: string | ||
10 | rocks_trees: {string| Tree} | ||
11 | lua_version: string | ||
12 | record Tree | ||
13 | root: string | ||
14 | rocks_dir: string | ||
15 | lua_dir: string | ||
16 | lib_dir: string | ||
17 | end | ||
18 | end | ||
19 | |||
20 | return cfg \ No newline at end of file | ||
diff --git a/src/luarocks/core/dir.lua b/src/luarocks/core/dir.lua index cccc1333..7d9702ba 100644 --- a/src/luarocks/core/dir.lua +++ b/src/luarocks/core/dir.lua | |||
@@ -18,26 +18,6 @@ end | |||
18 | 18 | ||
19 | 19 | ||
20 | 20 | ||
21 | |||
22 | |||
23 | |||
24 | |||
25 | function dir.path(...) | ||
26 | local t = { ... } | ||
27 | while t[1] == "" do | ||
28 | table.remove(t, 1) | ||
29 | end | ||
30 | for i, c in ipairs(t) do | ||
31 | t[i] = unquote(c) | ||
32 | end | ||
33 | return dir.normalize(table.concat(t, "/")) | ||
34 | end | ||
35 | |||
36 | |||
37 | |||
38 | |||
39 | |||
40 | |||
41 | function dir.split_url(url) | 21 | function dir.split_url(url) |
42 | assert(type(url) == "string") | 22 | assert(type(url) == "string") |
43 | 23 | ||
@@ -92,4 +72,25 @@ function dir.normalize(name) | |||
92 | return pathname | 72 | return pathname |
93 | end | 73 | end |
94 | 74 | ||
75 | |||
76 | |||
77 | |||
78 | |||
79 | |||
80 | |||
81 | |||
82 | |||
83 | |||
84 | |||
85 | function dir.path(...) | ||
86 | local t = { ... } | ||
87 | while t[1] == "" do | ||
88 | table.remove(t, 1) | ||
89 | end | ||
90 | for i, c in ipairs(t) do | ||
91 | t[i] = unquote(c) | ||
92 | end | ||
93 | return dir.normalize(table.concat(t, "/")) | ||
94 | end | ||
95 | |||
95 | return dir | 96 | return dir |
diff --git a/src/luarocks/core/manif.lua b/src/luarocks/core/manif.lua index 8b917590..758b76db 100644 --- a/src/luarocks/core/manif.lua +++ b/src/luarocks/core/manif.lua | |||
@@ -3,6 +3,57 @@ local _tl_compat; if (tonumber((_VERSION or ''):match('[%d.]*$')) or 0) < 5.3 th | |||
3 | local manif = {} | 3 | local manif = {} |
4 | 4 | ||
5 | 5 | ||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | |||
19 | |||
20 | |||
21 | |||
22 | |||
23 | |||
24 | |||
25 | |||
26 | |||
27 | |||
28 | |||
29 | |||
30 | |||
31 | |||
32 | |||
33 | |||
34 | |||
35 | |||
36 | |||
37 | |||
38 | |||
39 | |||
40 | |||
41 | |||
42 | |||
43 | |||
44 | |||
45 | |||
46 | |||
47 | |||
48 | |||
49 | |||
50 | |||
51 | |||
52 | |||
53 | |||
54 | |||
55 | |||
56 | |||
6 | local persist = require("luarocks.core.persist") | 57 | local persist = require("luarocks.core.persist") |
7 | local cfg = require("luarocks.core.cfg") | 58 | local cfg = require("luarocks.core.cfg") |
8 | local dir = require("luarocks.core.dir") | 59 | local dir = require("luarocks.core.dir") |
diff --git a/src/luarocks/core/manif.tl b/src/luarocks/core/manif.tl index e5e72eaf..2ae908e0 100644 --- a/src/luarocks/core/manif.tl +++ b/src/luarocks/core/manif.tl | |||
@@ -3,6 +3,57 @@ | |||
3 | local record manif | 3 | local record manif |
4 | end | 4 | end |
5 | 5 | ||
6 | local record Command | ||
7 | name: string | ||
8 | version: string | ||
9 | end | ||
10 | |||
11 | local record Lua_version | ||
12 | major: integer | ||
13 | minor: integer | ||
14 | string: string | ||
15 | end | ||
16 | |||
17 | local record Constraints | ||
18 | op: string | ||
19 | lua_version: {Lua_version} | ||
20 | end | ||
21 | |||
22 | local record DependencyVersion | ||
23 | version: string | ||
24 | constraints: {Constraints} | ||
25 | name: string | ||
26 | end | ||
27 | |||
28 | local record Dependency | ||
29 | name: string | ||
30 | version: {DependencyVersion} --! multiple versions in the same dependency | ||
31 | end | ||
32 | |||
33 | local record Module | ||
34 | name: string --! ["tl.tl"] = {"tl/0.15.3-1"} | ||
35 | name_version: string --! or file location | ||
36 | end | ||
37 | |||
38 | local record RepositoryVersion | ||
39 | version: string | ||
40 | manifests: {Manifest} | ||
41 | end | ||
42 | |||
43 | local record Repository | ||
44 | name: string | ||
45 | version: {RepositoryVersion} --! multiple versions in the same repository | ||
46 | |||
47 | end | ||
48 | |||
49 | local record Manifest --! | ||
50 | arch: string --! only for repository | ||
51 | commands: {Command} | ||
52 | dependencies: {Dependency} | ||
53 | modules: {Module} | ||
54 | repository: {Repository} --! no repository for repositoyry | ||
55 | end | ||
56 | |||
6 | local persist = require("luarocks.core.persist") --! | 57 | local persist = require("luarocks.core.persist") --! |
7 | local cfg = require("luarocks.core.cfg") | 58 | local cfg = require("luarocks.core.cfg") |
8 | local dir = require("luarocks.core.dir") | 59 | local dir = require("luarocks.core.dir") |
diff --git a/src/luarocks/core/path.lua b/src/luarocks/core/path.lua index 5dd0091b..07542a1f 100644 --- a/src/luarocks/core/path.lua +++ b/src/luarocks/core/path.lua | |||
@@ -6,6 +6,8 @@ local path = {} | |||
6 | local cfg = require("luarocks.core.cfg") | 6 | local cfg = require("luarocks.core.cfg") |
7 | local dir = require("luarocks.core.dir") | 7 | local dir = require("luarocks.core.dir") |
8 | 8 | ||
9 | |||
10 | |||
9 | local dir_sep = package.config:sub(1, 1) | 11 | local dir_sep = package.config:sub(1, 1) |
10 | 12 | ||
11 | 13 | ||
@@ -16,7 +18,7 @@ function path.rocks_dir(tree) | |||
16 | if type(tree) == "string" then | 18 | if type(tree) == "string" then |
17 | return dir.path(tree, cfg.rocks_subdir) | 19 | return dir.path(tree, cfg.rocks_subdir) |
18 | end | 20 | end |
19 | return tostring(tree.rocks_dir) or dir.path(tree.root, cfg.rocks_subdir) | 21 | return tree.rocks_dir or dir.path(tree.root, cfg.rocks_subdir) |
20 | end | 22 | end |
21 | 23 | ||
22 | 24 | ||
@@ -74,7 +76,7 @@ function path.deploy_lua_dir(tree) | |||
74 | return dir.path(tree, cfg.lua_modules_path) | 76 | return dir.path(tree, cfg.lua_modules_path) |
75 | else | 77 | else |
76 | assert(type(tree) == "table") | 78 | assert(type(tree) == "table") |
77 | return tostring(tree.lua_dir) or dir.path(tree.root, cfg.lua_modules_path) | 79 | return tree.lua_dir or dir.path(tree.root, cfg.lua_modules_path) |
78 | end | 80 | end |
79 | end | 81 | end |
80 | 82 | ||
diff --git a/src/luarocks/core/path.tl b/src/luarocks/core/path.tl index a866f4d7..5834ef53 100644 --- a/src/luarocks/core/path.tl +++ b/src/luarocks/core/path.tl | |||
@@ -3,20 +3,22 @@ | |||
3 | local record path | 3 | local record path |
4 | end | 4 | end |
5 | 5 | ||
6 | local cfg = require("luarocks.core.cfg") --? cannot index key ... in boolean 'cfg' of type boolean | 6 | local cfg = require("luarocks.core.cfg") |
7 | local dir = require("luarocks.core.dir") | 7 | local dir = require("luarocks.core.dir") |
8 | 8 | ||
9 | local type Tree = cfg.Tree | ||
10 | |||
9 | local dir_sep = package.config:sub(1, 1) | 11 | local dir_sep = package.config:sub(1, 1) |
10 | -------------------------------------------------------------------------------- | 12 | -------------------------------------------------------------------------------- |
11 | 13 | ||
12 | function path.rocks_dir(tree: string | {any: any}): string | 14 | function path.rocks_dir(tree: string | Tree): string |
13 | if tree == nil then | 15 | if tree == nil then |
14 | tree = cfg.root_dir | 16 | tree = cfg.root_dir |
15 | end | 17 | end |
16 | if tree is string then | 18 | if tree is string then |
17 | return dir.path(tree, cfg.rocks_subdir) | 19 | return dir.path(tree, cfg.rocks_subdir) |
18 | end | 20 | end |
19 | return tostring(tree.rocks_dir) or dir.path(tree.root, cfg.rocks_subdir) --? tostring(tree.root) | 21 | return tree.rocks_dir or dir.path(tree.root, cfg.rocks_subdir) |
20 | end | 22 | end |
21 | 23 | ||
22 | --- Produce a versioned version of a filename. | 24 | --- Produce a versioned version of a filename. |
@@ -69,21 +71,21 @@ function path.path_to_module(file: string): string | |||
69 | return name | 71 | return name |
70 | end | 72 | end |
71 | 73 | ||
72 | function path.deploy_lua_dir(tree: string | {any: any}): string | 74 | function path.deploy_lua_dir(tree: string | Tree): string |
73 | if tree is string then | 75 | if tree is string then |
74 | return dir.path(tree, cfg.lua_modules_path) | 76 | return dir.path(tree, cfg.lua_modules_path) |
75 | else | 77 | else |
76 | assert(type(tree) == "table") | 78 | assert(type(tree) == "table") |
77 | return tostring(tree.lua_dir) or dir.path(tree.root, cfg.lua_modules_path) --? tostring(tree.root) | 79 | return tree.lua_dir or dir.path(tree.root, cfg.lua_modules_path) |
78 | end | 80 | end |
79 | end | 81 | end |
80 | 82 | ||
81 | function path.deploy_lib_dir(tree: string | {any: any}): string | 83 | function path.deploy_lib_dir(tree: string | Tree): string |
82 | if tree is string then | 84 | if tree is string then |
83 | return dir.path(tree, cfg.lib_modules_path) | 85 | return dir.path(tree, cfg.lib_modules_path) |
84 | else | 86 | else |
85 | assert(type(tree) == "table") | 87 | assert(type(tree) == "table") |
86 | return tostring(tree.lib_dir) or dir.path(tree.root, cfg.lib_modules_path) --? tostring(tree.root) | 88 | return tostring(tree.lib_dir) or dir.path(tree.root, cfg.lib_modules_path) |
87 | end | 89 | end |
88 | end | 90 | end |
89 | 91 | ||
@@ -113,11 +115,11 @@ function path.which_i(file_name: string, name: string, version: string, tree: st | |||
113 | return file_name | 115 | return file_name |
114 | end | 116 | end |
115 | 117 | ||
116 | function path.rocks_tree_to_string(tree: string | {any: any}): string | 118 | function path.rocks_tree_to_string(tree: string | Tree): string |
117 | if tree is string then | 119 | if tree is string then |
118 | return tree | 120 | return tree |
119 | else | 121 | else |
120 | return tostring(tree.root) --? | 122 | return tostring(tree.root) |
121 | end | 123 | end |
122 | end | 124 | end |
123 | 125 | ||
@@ -138,8 +140,8 @@ function path.map_trees(deps_mode: string, fn: function, ...: string): {any} | |||
138 | if deps_mode == "all" then | 140 | if deps_mode == "all" then |
139 | use = true | 141 | use = true |
140 | end | 142 | end |
141 | for _, tree in ipairs(cfg.rocks_trees or {}) do --! no mention of rocks_trees in the cfg file | 143 | for _, tree in ipairs(cfg.rocks_trees or {}) do |
142 | if dir.normalize(path.rocks_tree_to_string(tree)) == dir.normalize(path.rocks_tree_to_string(current)) then --! | 144 | if dir.normalize(path.rocks_tree_to_string(tree)) == dir.normalize(path.rocks_tree_to_string(current)) then |
143 | use = true | 145 | use = true |
144 | end | 146 | end |
145 | if use then | 147 | if use then |
diff --git a/src/luarocks/core/util.lua b/src/luarocks/core/util.lua index 31aa5c25..38d7ae45 100644 --- a/src/luarocks/core/util.lua +++ b/src/luarocks/core/util.lua | |||
@@ -126,9 +126,10 @@ function util.deep_merge(dst, src) | |||
126 | local dstk = dst[k] | 126 | local dstk = dst[k] |
127 | if dstk == nil then | 127 | if dstk == nil then |
128 | dst[k] = {} | 128 | dst[k] = {} |
129 | dstk = dst[k] | ||
129 | end | 130 | end |
130 | if type(dstk) == "table" then | 131 | if type(dstk) == "table" then |
131 | util.deep_merge(dst[k], v) | 132 | util.deep_merge(dstk, v) |
132 | else | 133 | else |
133 | dst[k] = v | 134 | dst[k] = v |
134 | end | 135 | end |
@@ -145,11 +146,13 @@ end | |||
145 | function util.deep_merge_under(dst, src) | 146 | function util.deep_merge_under(dst, src) |
146 | for k, v in pairs(src) do | 147 | for k, v in pairs(src) do |
147 | if type(v) == "table" then | 148 | if type(v) == "table" then |
148 | if dst[k] == nil then | 149 | local dstk = dst[k] |
150 | if dstk == nil then | ||
149 | dst[k] = {} | 151 | dst[k] = {} |
152 | dstk = dst[k] | ||
150 | end | 153 | end |
151 | if type(dst[k]) == "table" then | 154 | if type(dstk) == "table" then |
152 | util.deep_merge_under(dst[k], v) | 155 | util.deep_merge_under(dstk, v) |
153 | end | 156 | end |
154 | elseif dst[k] == nil then | 157 | elseif dst[k] == nil then |
155 | dst[k] = v | 158 | dst[k] = v |
diff --git a/src/luarocks/core/vers.lua b/src/luarocks/core/vers.lua index 231b9683..a5a1a0a9 100644 --- a/src/luarocks/core/vers.lua +++ b/src/luarocks/core/vers.lua | |||
@@ -1,5 +1,4 @@ | |||
1 | local _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 ipairs = _tl_compat and _tl_compat.ipairs or ipairs; local math = _tl_compat and _tl_compat.math or math; local pairs = _tl_compat and _tl_compat.pairs or pairs; local string = _tl_compat and _tl_compat.string or string | 1 | local _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 ipairs = _tl_compat and _tl_compat.ipairs or ipairs; local math = _tl_compat and _tl_compat.math or math; local pairs = _tl_compat and _tl_compat.pairs or pairs; local string = _tl_compat and _tl_compat.string or string; local vers = {} |
2 | local vers = {} | ||
3 | 2 | ||
4 | 3 | ||
5 | local util = require("luarocks.core.util") | 4 | local util = require("luarocks.core.util") |
@@ -22,6 +21,8 @@ local deltas = { | |||
22 | 21 | ||
23 | 22 | ||
24 | 23 | ||
24 | |||
25 | |||
25 | local version_mt = { | 26 | local version_mt = { |
26 | 27 | ||
27 | 28 | ||
@@ -148,7 +149,7 @@ function vers.compare_versions(a, b) | |||
148 | if a == b then | 149 | if a == b then |
149 | return false | 150 | return false |
150 | end | 151 | end |
151 | return vers.parse_version(a) > vers.parse_version(b) | 152 | return vers.parse_version(b) < vers.parse_version(a) |
152 | end | 153 | end |
153 | 154 | ||
154 | 155 | ||
@@ -167,8 +168,10 @@ local function partial_match(version_for_parse, requested_for_parce) | |||
167 | 168 | ||
168 | local version, requested | 169 | local version, requested |
169 | 170 | ||
170 | if not (type(version_for_parse) == "table") then version = vers.parse_version(version_for_parse) end | 171 | if not (type(version_for_parse) == "table") then version = vers.parse_version(version_for_parse) |
171 | if not (type(requested_for_parce) == "table") then requested = vers.parse_version(requested_for_parce) end | 172 | else version = version_for_parse end |
173 | if not (type(requested_for_parce) == "table") then requested = vers.parse_version(requested_for_parce) | ||
174 | else requested = requested_for_parce end | ||
172 | if not (type(version) == "table") or not (type(requested) == "table") then return false end | 175 | if not (type(version) == "table") or not (type(requested) == "table") then return false end |
173 | 176 | ||
174 | for i, ri in ipairs(requested) do | 177 | for i, ri in ipairs(requested) do |
@@ -190,18 +193,22 @@ function vers.match_constraints(version, constraints) | |||
190 | local ok = true | 193 | local ok = true |
191 | setmetatable(version, version_mt) | 194 | setmetatable(version, version_mt) |
192 | for _, constr in pairs(constraints) do | 195 | for _, constr in pairs(constraints) do |
193 | if type(constr.version) == "string" then | ||
194 | constr.version = vers.parse_version(constr.version) | ||
195 | end | ||
196 | local constr_version, constr_op = constr.version, constr.op | 196 | local constr_version, constr_op = constr.version, constr.op |
197 | setmetatable(constr_version, version_mt) | 197 | local cv |
198 | if constr_op == "==" then ok = version == constr_version | 198 | if type(constr_version) == "string" then |
199 | elseif constr_op == "~=" then ok = version ~= constr_version | 199 | cv = vers.parse_version(constr_version) |
200 | elseif constr_op == ">" then ok = version > constr_version | 200 | constr.version = cv |
201 | elseif constr_op == "<" then ok = version < constr_version | 201 | else |
202 | elseif constr_op == ">=" then ok = version >= constr_version | 202 | cv = constr_version |
203 | elseif constr_op == "<=" then ok = version <= constr_version | 203 | end |
204 | elseif constr_op == "~>" then ok = partial_match(version, constr_version) | 204 | setmetatable(cv, version_mt) |
205 | if constr_op == "==" then ok = version == cv | ||
206 | elseif constr_op == "~=" then ok = version ~= cv | ||
207 | elseif constr_op == ">" then ok = cv < version | ||
208 | elseif constr_op == "<" then ok = version < cv | ||
209 | elseif constr_op == ">=" then ok = cv <= version | ||
210 | elseif constr_op == "<=" then ok = version <= cv | ||
211 | elseif constr_op == "~>" then ok = partial_match(version, cv) | ||
205 | end | 212 | end |
206 | if not ok then break end | 213 | if not ok then break end |
207 | end | 214 | end |
diff --git a/src/luarocks/core/vers.tl b/src/luarocks/core/vers.tl index 7d0f0a83..8953a730 100644 --- a/src/luarocks/core/vers.tl +++ b/src/luarocks/core/vers.tl | |||
@@ -4,7 +4,7 @@ end | |||
4 | local util = require("luarocks.core.util") | 4 | local util = require("luarocks.core.util") |
5 | -------------------------------------------------------------------------------- | 5 | -------------------------------------------------------------------------------- |
6 | 6 | ||
7 | local deltas: {string: integer} = { --?1 | 7 | local deltas: {string: integer} = { |
8 | dev = 120000000, | 8 | dev = 120000000, |
9 | scm = 110000000, | 9 | scm = 110000000, |
10 | cvs = 100000000, | 10 | cvs = 100000000, |
@@ -23,7 +23,7 @@ local record Version | |||
23 | metamethod __le: function(Version, Version): boolean | 23 | metamethod __le: function(Version, Version): boolean |
24 | end | 24 | end |
25 | 25 | ||
26 | local version_mt: metatable<Version> = { --? anything to do here | 26 | local version_mt: metatable<Version> = { |
27 | --- Equality comparison for versions. | 27 | --- Equality comparison for versions. |
28 | -- All version numbers must be equal. | 28 | -- All version numbers must be equal. |
29 | -- If both versions have revision numbers, they must be equal; | 29 | -- If both versions have revision numbers, they must be equal; |
@@ -132,7 +132,7 @@ function vers.parse_version(vstring: string): Version | |||
132 | version[i] = 0 | 132 | version[i] = 0 |
133 | break | 133 | break |
134 | end | 134 | end |
135 | version[i] = deltas[token] or (token:byte() / 1000) --?1 | 135 | version[i] = deltas[token] or (token:byte() / 1000) |
136 | end | 136 | end |
137 | v = rest | 137 | v = rest |
138 | end | 138 | end |
@@ -168,8 +168,10 @@ local function partial_match(version_for_parse: string | Version, requested_for_ | |||
168 | 168 | ||
169 | local version, requested: Version, Version | 169 | local version, requested: Version, Version |
170 | 170 | ||
171 | if not version_for_parse is Version then version = vers.parse_version(version_for_parse) end | 171 | if not version_for_parse is Version then version = vers.parse_version(version_for_parse) |
172 | if not requested_for_parce is Version then requested = vers.parse_version(requested_for_parce) end | 172 | else version = version_for_parse end |
173 | if not requested_for_parce is Version then requested = vers.parse_version(requested_for_parce) | ||
174 | else requested = requested_for_parce end | ||
173 | if not version is Version or not requested is Version then return false end | 175 | if not version is Version or not requested is Version then return false end |
174 | 176 | ||
175 | for i, ri in ipairs(requested) do | 177 | for i, ri in ipairs(requested) do |