diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2018-07-01 14:50:59 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2018-07-01 21:32:40 -0300 |
commit | 65c417e0ecda55f44c691df032163a8c08f0b52a (patch) | |
tree | 6358f4073055afcc8bf86f2d4e077006e8f631ac /src | |
parent | eec12737d4003f3078134468215d4c16fb36c2be (diff) | |
download | luarocks-65c417e0ecda55f44c691df032163a8c08f0b52a.tar.gz luarocks-65c417e0ecda55f44c691df032163a8c08f0b52a.tar.bz2 luarocks-65c417e0ecda55f44c691df032163a8c08f0b52a.zip |
path, loader: handle coexisting foo.bar and foo.bar.init modules
LuaRocks used to conflate in its manifest two modules whose names only
differed by ".init" (e.g. "foo.bar" and "foo.bar.init"). With this change,
`path.path_to_modules` treats them as distinct modules, and `luarocks.loader`
handles them correctly (given `require("foo.bar")`, it looks for
`foo.bar` first and then `foo.bar.init` next).
Diffstat (limited to 'src')
-rw-r--r-- | src/luarocks/core/path.lua | 6 | ||||
-rw-r--r-- | src/luarocks/loader.lua | 35 |
2 files changed, 24 insertions, 17 deletions
diff --git a/src/luarocks/core/path.lua b/src/luarocks/core/path.lua index adebaa23..179d3aaf 100644 --- a/src/luarocks/core/path.lua +++ b/src/luarocks/core/path.lua | |||
@@ -36,7 +36,7 @@ end | |||
36 | 36 | ||
37 | --- Convert a pathname to a module identifier. | 37 | --- Convert a pathname to a module identifier. |
38 | -- In Unix, for example, a path "foo/bar/baz.lua" is converted to | 38 | -- In Unix, for example, a path "foo/bar/baz.lua" is converted to |
39 | -- "foo.bar.baz"; "bla/init.lua" returns "bla"; "foo.so" returns "foo". | 39 | -- "foo.bar.baz"; "bla/init.lua" returns "bla.init"; "foo.so" returns "foo". |
40 | -- @param file string: Pathname of module | 40 | -- @param file string: Pathname of module |
41 | -- @return string: The module identifier, or nil if given path is | 41 | -- @return string: The module identifier, or nil if given path is |
42 | -- not a conformant module path (the function does not check if the | 42 | -- not a conformant module path (the function does not check if the |
@@ -47,10 +47,6 @@ function path.path_to_module(file) | |||
47 | local name = file:match("(.*)%."..cfg.lua_extension.."$") | 47 | local name = file:match("(.*)%."..cfg.lua_extension.."$") |
48 | if name then | 48 | if name then |
49 | name = name:gsub("/", ".") | 49 | name = name:gsub("/", ".") |
50 | local init = name:match("(.*)%.init$") | ||
51 | if init then | ||
52 | name = init | ||
53 | end | ||
54 | else | 50 | else |
55 | name = file:match("(.*)%."..cfg.lib_extension.."$") | 51 | name = file:match("(.*)%."..cfg.lib_extension.."$") |
56 | if name then | 52 | if name then |
diff --git a/src/luarocks/loader.lua b/src/luarocks/loader.lua index 537adf94..a8a9cfdf 100644 --- a/src/luarocks/loader.lua +++ b/src/luarocks/loader.lua | |||
@@ -159,6 +159,22 @@ local function call_other_loaders(module, name, version, module_name) | |||
159 | return "Failed loading module "..module.." in LuaRocks rock "..name.." "..version | 159 | return "Failed loading module "..module.." in LuaRocks rock "..name.." "..version |
160 | end | 160 | end |
161 | 161 | ||
162 | local function add_providers(providers, entries, tree, module, filter_file_name) | ||
163 | for i, entry in ipairs(entries) do | ||
164 | local name, version = entry:match("^([^/]*)/(.*)$") | ||
165 | local file_name = tree.manifest.repository[name][version][1].modules[module] | ||
166 | if type(file_name) ~= "string" then | ||
167 | error("Invalid data in manifest file for module "..tostring(module).." (invalid data for "..tostring(name).." "..tostring(version)..")") | ||
168 | end | ||
169 | file_name = filter_file_name(file_name, name, version, tree.tree, i) | ||
170 | if loader.context[name] == version then | ||
171 | return name, version, file_name | ||
172 | end | ||
173 | version = vers.parse_version(version) | ||
174 | table.insert(providers, {name = name, version = version, module_name = file_name, tree = tree}) | ||
175 | end | ||
176 | end | ||
177 | |||
162 | --- Search for a module in the rocks trees | 178 | --- Search for a module in the rocks trees |
163 | -- @param module string: module name (eg. "socket.core") | 179 | -- @param module string: module name (eg. "socket.core") |
164 | -- @param filter_file_name function(string, string, string, string, number): | 180 | -- @param filter_file_name function(string, string, string, string, number): |
@@ -180,21 +196,16 @@ local function select_module(module, filter_file_name) | |||
180 | end | 196 | end |
181 | 197 | ||
182 | local providers = {} | 198 | local providers = {} |
199 | local initmodule | ||
183 | for _, tree in ipairs(loader.rocks_trees) do | 200 | for _, tree in ipairs(loader.rocks_trees) do |
184 | local entries = tree.manifest.modules[module] | 201 | local entries = tree.manifest.modules[module] |
185 | if entries then | 202 | if entries then |
186 | for i, entry in ipairs(entries) do | 203 | add_providers(providers, entries, tree, module, filter_file_name) |
187 | local name, version = entry:match("^([^/]*)/(.*)$") | 204 | else |
188 | local file_name = tree.manifest.repository[name][version][1].modules[module] | 205 | initmodule = initmodule or module .. ".init" |
189 | if type(file_name) ~= "string" then | 206 | entries = tree.manifest.modules[initmodule] |
190 | error("Invalid data in manifest file for module "..tostring(module).." (invalid data for "..tostring(name).." "..tostring(version)..")") | 207 | if entries then |
191 | end | 208 | add_providers(providers, entries, tree, initmodule, filter_file_name) |
192 | file_name = filter_file_name(file_name, name, version, tree.tree, i) | ||
193 | if loader.context[name] == version then | ||
194 | return name, version, file_name | ||
195 | end | ||
196 | version = vers.parse_version(version) | ||
197 | table.insert(providers, {name = name, version = version, module_name = file_name, tree = tree}) | ||
198 | end | 209 | end |
199 | end | 210 | end |
200 | end | 211 | end |