aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2018-04-23 10:57:43 -0300
committerHisham Muhammad <hisham@gobolinux.org>2018-05-07 19:27:37 -0300
commit40792c08eaed0ca44b00aae04885e43c3de0701d (patch)
treeb4bb410e0946613e2a5011435a0703fa720920b0 /src
parent28124aadbeaaa35f2c22b12cae96092466c1ded4 (diff)
downloadluarocks-40792c08eaed0ca44b00aae04885e43c3de0701d.tar.gz
luarocks-40792c08eaed0ca44b00aae04885e43c3de0701d.tar.bz2
luarocks-40792c08eaed0ca44b00aae04885e43c3de0701d.zip
deps: add fulfill_dependency for resolving a single dependency
Diffstat (limited to 'src')
-rw-r--r--src/luarocks/deps.lua99
-rw-r--r--src/luarocks/manif.lua8
2 files changed, 64 insertions, 43 deletions
diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua
index 26373177..b1ff6c47 100644
--- a/src/luarocks/deps.lua
+++ b/src/luarocks/deps.lua
@@ -22,28 +22,29 @@ local function match_dep(dep, blacklist, deps_mode, rocks_provided)
22 assert(type(dep) == "table") 22 assert(type(dep) == "table")
23 assert(type(rocks_provided) == "table") 23 assert(type(rocks_provided) == "table")
24 24
25 local versions 25 local versions, locations
26 local provided = rocks_provided[dep.name] 26 local provided = rocks_provided[dep.name]
27 if provided then 27 if provided then
28 -- Provided rocks have higher priority than manifest's rocks. 28 -- Provided rocks have higher priority than manifest's rocks.
29 versions = { provided } 29 versions, locations = { provided }, {}
30 else 30 else
31 versions = manif.get_versions(dep, deps_mode) 31 versions, locations = manif.get_versions(dep, deps_mode)
32 end 32 end
33 33
34 local latest_version 34 local latest_version
35 local latest_vstring
35 for _, vstring in ipairs(versions) do 36 for _, vstring in ipairs(versions) do
36 if not blacklist or not blacklist[vstring] then 37 if not blacklist or not blacklist[vstring] then
37 local version = vers.parse_version(vstring) 38 local version = vers.parse_version(vstring)
38 if vers.match_constraints(version, dep.constraints) then 39 if vers.match_constraints(version, dep.constraints) then
39 if not latest_version or version > latest_version then 40 if not latest_version or version > latest_version then
40 latest_version = version 41 latest_version = version
42 latest_vstring = vstring
41 end 43 end
42 end 44 end
43 end 45 end
44 end 46 end
45 47 return latest_vstring, locations[latest_vstring]
46 return latest_version and latest_version.string
47end 48end
48 49
49--- Attempt to match dependencies of a rockspec to installed rocks. 50--- Attempt to match dependencies of a rockspec to installed rocks.
@@ -126,6 +127,56 @@ function deps.report_missing_dependencies(name, version, dependencies, deps_mode
126 end 127 end
127end 128end
128 129
130function deps.fulfill_dependency(dep, deps_mode, name, version, rocks_provided)
131 assert(dep:type() == "query")
132 assert(type(deps_mode) == "string" or deps_mode == nil)
133 assert(type(name) == "string" or name == nil)
134 assert(type(version) == "string" or version == nil)
135 assert(type(rocks_provided) == "table" or rocks_provided == nil)
136 deps_mode = deps_mode or "all"
137 rocks_provided = rocks_provided or {}
138
139 local found, where = match_dep(dep, nil, deps_mode, rocks_provided)
140 if found then
141 return true, found, where
142 end
143
144 local search = require("luarocks.search")
145 local install = require("luarocks.cmd.install")
146
147 if name and version then
148 util.printout(("%s %s depends on %s (%s)"):format(
149 name, version, tostring(dep), rock_status(dep.name, deps_mode, rocks_provided)))
150 else
151 util.printout(("Fulfilling dependency on %s (%s)"):format(
152 tostring(dep), rock_status(dep.name, deps_mode, rocks_provided)))
153 end
154
155 if dep.constraints[1] and dep.constraints[1].no_upgrade then
156 util.printerr("This version of "..name.." is designed for use with")
157 util.printerr(tostring(dep)..", but is configured to avoid upgrading it")
158 util.printerr("automatically. Please upgrade "..dep.name.." with")
159 util.printerr(" luarocks install "..dep.name)
160 util.printerr("or choose an older version of "..name.." with")
161 util.printerr(" luarocks search "..name)
162 return nil, "Failed matching dependencies"
163 end
164
165 local url, search_err = search.find_suitable_rock(dep)
166 if not url then
167 return nil, "Could not satisfy dependency "..tostring(dep)..": "..search_err
168 end
169 util.printout("Installing "..url)
170 local ok, install_err, errcode = install.command({deps_mode = deps_mode, namespace = dep.namespace}, url)
171 if not ok then
172 return nil, "Failed installing dependency: "..url.." - "..install_err, errcode
173 end
174
175 found, where = match_dep(dep, nil, deps_mode, rocks_provided)
176 assert(found)
177 return true, found, where
178end
179
129--- Check dependencies of a rock and attempt to install any missing ones. 180--- Check dependencies of a rock and attempt to install any missing ones.
130-- Packages are installed using the LuaRocks "install" command. 181-- Packages are installed using the LuaRocks "install" command.
131-- Aborts the program if a dependency could not be fulfilled. 182-- Aborts the program if a dependency could not be fulfilled.
@@ -135,10 +186,6 @@ end
135-- nil and an error message if any test failed, followed by an optional 186-- nil and an error message if any test failed, followed by an optional
136-- error code. 187-- error code.
137function deps.fulfill_dependencies(rockspec, depskey, deps_mode) 188function deps.fulfill_dependencies(rockspec, depskey, deps_mode)
138
139 local search = require("luarocks.search")
140 local install = require("luarocks.cmd.install")
141
142 if rockspec.supported_platforms then 189 if rockspec.supported_platforms then
143 if not deps.platforms_set then 190 if not deps.platforms_set then
144 deps.platforms_set = values_set(cfg.platforms) 191 deps.platforms_set = values_set(cfg.platforms)
@@ -169,37 +216,11 @@ function deps.fulfill_dependencies(rockspec, depskey, deps_mode)
169 216
170 deps.report_missing_dependencies(rockspec.name, rockspec.version, rockspec[depskey], deps_mode, rockspec.rocks_provided) 217 deps.report_missing_dependencies(rockspec.name, rockspec.version, rockspec[depskey], deps_mode, rockspec.rocks_provided)
171 218
172 local first_missing_dep = true 219 util.printout()
173
174 for _, dep in ipairs(rockspec[depskey]) do 220 for _, dep in ipairs(rockspec[depskey]) do
175 if not match_dep(dep, nil, deps_mode, rockspec.rocks_provided) then 221 local ok, err = deps.fulfill_dependency(dep, deps_mode, rockspec.name, rockspec.version, rockspec.rocks_provided)
176 if first_missing_dep then 222 if not ok then
177 util.printout() 223 return nil, err
178 first_missing_dep = false
179 end
180
181 util.printout(("%s %s depends on %s (%s)"):format(
182 rockspec.name, rockspec.version, tostring(dep), rock_status(dep.name, deps_mode, rockspec.rocks_provided)))
183
184 if dep.constraints[1] and dep.constraints[1].no_upgrade then
185 util.printerr("This version of "..rockspec.name.." is designed for use with")
186 util.printerr(tostring(dep)..", but is configured to avoid upgrading it")
187 util.printerr("automatically. Please upgrade "..dep.name.." with")
188 util.printerr(" luarocks install "..dep.name)
189 util.printerr("or choose an older version of "..rockspec.name.." with")
190 util.printerr(" luarocks search "..rockspec.name)
191 return nil, "Failed matching dependencies"
192 end
193
194 local url, search_err = search.find_suitable_rock(dep)
195 if not url then
196 return nil, "Could not satisfy dependency "..tostring(dep)..": "..search_err
197 end
198 util.printout("Installing "..url)
199 local ok, install_err, errcode = install.command({deps_mode = deps_mode, namespace = dep.namespace}, url)
200 if not ok then
201 return nil, "Failed installing dependency: "..url.." - "..install_err, errcode
202 end
203 end 224 end
204 end 225 end
205 226
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index a982c6f7..c6d0e168 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -242,7 +242,7 @@ end
242-- (use the current tree and all trees below it on the list) 242-- (use the current tree and all trees below it on the list)
243-- or "all", to use all trees. 243-- or "all", to use all trees.
244-- @return table: An array of strings listing installed 244-- @return table: An array of strings listing installed
245-- versions of a package. 245-- versions of a package, and a table indicating where they are found.
246function manif.get_versions(dep, deps_mode) 246function manif.get_versions(dep, deps_mode)
247 assert(type(dep) == "table") 247 assert(type(dep) == "table")
248 assert(type(deps_mode) == "string") 248 assert(type(deps_mode) == "string")
@@ -263,17 +263,17 @@ function manif.get_versions(dep, deps_mode)
263 local ns = fd:read("*a") 263 local ns = fd:read("*a")
264 fd:close() 264 fd:close()
265 if ns == namespace then 265 if ns == namespace then
266 version_set[version] = true 266 version_set[version] = tree
267 end 267 end
268 end 268 end
269 else 269 else
270 version_set[version] = true 270 version_set[version] = tree
271 end 271 end
272 end 272 end
273 end 273 end
274 end) 274 end)
275 275
276 return util.keys(version_set) 276 return util.keys(version_set), version_set
277end 277end
278 278
279return manif 279return manif