aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHisham <hisham@gobolinux.org>2016-10-30 15:05:52 -0200
committerHisham <hisham@gobolinux.org>2016-10-30 15:05:52 -0200
commita7c10e670c2f682962e28984a43916f40b302b2b (patch)
treef2bafcb4bfea3918ce836070e73d66cd2c97625c /src
parent079ea1d4fdbd2d49147f9035cf99461f10bb7cd9 (diff)
parentba1ba4be6e0ecc6936c49fae38c71e22250ceb65 (diff)
downloadluarocks-a7c10e670c2f682962e28984a43916f40b302b2b.tar.gz
luarocks-a7c10e670c2f682962e28984a43916f40b302b2b.tar.bz2
luarocks-a7c10e670c2f682962e28984a43916f40b302b2b.zip
Merge branch 'master' into luarocks-3
Diffstat (limited to 'src')
-rw-r--r--src/luarocks/build.lua8
-rw-r--r--src/luarocks/deps.lua70
-rw-r--r--src/luarocks/install.lua3
-rw-r--r--src/luarocks/make.lua4
-rw-r--r--src/luarocks/manif/writer.lua43
-rw-r--r--src/luarocks/remove.lua9
6 files changed, 86 insertions, 51 deletions
diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua
index f3b054d2..7808bce9 100644
--- a/src/luarocks/build.lua
+++ b/src/luarocks/build.lua
@@ -429,13 +429,13 @@ function build.command(flags, name, version)
429 ok, err = do_build(name, version, deps.get_deps_mode(flags), flags["only-deps"]) 429 ok, err = do_build(name, version, deps.get_deps_mode(flags), flags["only-deps"])
430 if not ok then return nil, err end 430 if not ok then return nil, err end
431 name, version = ok, err 431 name, version = ok, err
432 if flags["only-deps"] then 432
433 return name, version 433 if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then
434 end
435 if (not flags["keep"]) and not cfg.keep_other_versions then
436 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"]) 434 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
437 if not ok then util.printerr(err) end 435 if not ok then util.printerr(err) end
438 end 436 end
437
438 writer.check_dependencies(nil, deps.get_deps_mode(flags))
439 return name, version 439 return name, version
440 end 440 end
441end 441end
diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua
index acbf1dd6..d9419ec3 100644
--- a/src/luarocks/deps.lua
+++ b/src/luarocks/deps.lua
@@ -230,6 +230,28 @@ local function rock_status(name, deps_mode, rocks_provided)
230 return installed and installed.." "..installation_type or "not installed" 230 return installed and installed.." "..installation_type or "not installed"
231end 231end
232 232
233--- Check depenendencies of a package and report any missing ones.
234-- @param name string: package name.
235-- @param version string: package version.
236-- @param dependencies table: array of dependencies.
237-- @param deps_mode string: Which trees to check dependencies for:
238-- "one" for the current default tree, "all" for all trees,
239-- "order" for all trees with priority >= the current default, "none" for no trees.
240function deps.report_missing_dependencies(name, version, dependencies, deps_mode)
241 local first_missing_dep = true
242
243 for _, dep in ipairs(dependencies) do
244 if not match_dep(dep, nil, deps_mode) then
245 if first_missing_dep then
246 util.printout(("Missing dependencies for %s %s:"):format(name, version))
247 first_missing_dep = false
248 end
249
250 util.printout((" %s (%s)"):format(deps.show_dep(dep), rock_status(dep.name, deps_mode)))
251 end
252 end
253end
254
233--- Check dependencies of a rock and attempt to install any missing ones. 255--- Check dependencies of a rock and attempt to install any missing ones.
234-- Packages are installed using the LuaRocks "install" command. 256-- Packages are installed using the LuaRocks "install" command.
235-- Aborts the program if a dependency could not be fulfilled. 257-- Aborts the program if a dependency could not be fulfilled.
@@ -270,20 +292,9 @@ function deps.fulfill_dependencies(rockspec, deps_mode)
270 end 292 end
271 end 293 end
272 294
273 local first_missing_dep = true 295 deps.report_missing_dependencies(rockspec.name, rockspec.version, rockspec.dependencies, deps_mode)
274 296
275 for _, dep in ipairs(rockspec.dependencies) do 297 local first_missing_dep = true
276 if not match_dep(dep, nil, deps_mode, rockspec.rocks_provided) then
277 if first_missing_dep then
278 util.printout(("Missing dependencies for %s %s:"):format(rockspec.name, rockspec.version))
279 first_missing_dep = false
280 end
281
282 util.printout((" %s (%s)"):format(deps.show_dep(dep), rock_status(dep.name, deps_mode, rockspec.rocks_provided)))
283 end
284 end
285
286 first_missing_dep = true
287 298
288 for _, dep in ipairs(rockspec.dependencies) do 299 for _, dep in ipairs(rockspec.dependencies) do
289 if not match_dep(dep, nil, deps_mode, rockspec.rocks_provided) then 300 if not match_dep(dep, nil, deps_mode, rockspec.rocks_provided) then
@@ -505,17 +516,15 @@ function deps.check_external_deps(rockspec, mode)
505 return true 516 return true
506end 517end
507 518
508--- Recursively scan dependencies, to build a transitive closure of all 519--- Recursively add satisfied dependencies of a package to a table,
509-- dependent packages. 520-- to build a transitive closure of all dependent packages.
510-- @param results table: The results table being built. 521-- Additionally ensures that `dependencies` table of the manifest is up-to-date.
511-- @param missing table: The table of missing dependencies being recursively built. 522-- @param results table: The results table being built, maps package names to versions.
512-- @param manifest table: The manifest table containing dependencies. 523-- @param manifest table: The manifest table containing dependencies.
513-- @param name string: Package name. 524-- @param name string: Package name.
514-- @param version string: Package version. 525-- @param version string: Package version.
515-- @return (table, table): The results and a table of missing dependencies. 526function deps.scan_deps(results, manifest, name, version, deps_mode)
516function deps.scan_deps(results, missing, manifest, name, version, deps_mode)
517 assert(type(results) == "table") 527 assert(type(results) == "table")
518 assert(type(missing) == "table")
519 assert(type(manifest) == "table") 528 assert(type(manifest) == "table")
520 assert(type(name) == "string") 529 assert(type(name) == "string")
521 assert(type(version) == "string") 530 assert(type(version) == "string")
@@ -523,7 +532,7 @@ function deps.scan_deps(results, missing, manifest, name, version, deps_mode)
523 local fetch = require("luarocks.fetch") 532 local fetch = require("luarocks.fetch")
524 533
525 if results[name] then 534 if results[name] then
526 return results, missing 535 return
527 end 536 end
528 if not manifest.dependencies then manifest.dependencies = {} end 537 if not manifest.dependencies then manifest.dependencies = {} end
529 local dependencies = manifest.dependencies 538 local dependencies = manifest.dependencies
@@ -533,9 +542,9 @@ function deps.scan_deps(results, missing, manifest, name, version, deps_mode)
533 local rockspec, err 542 local rockspec, err
534 if not deplist then 543 if not deplist then
535 rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version), false) 544 rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version), false)
536 if err then 545 if not rockspec then
537 missing[name.." "..version] = err 546 util.printerr("Couldn't load rockspec for "..name.." "..version..": "..err)
538 return results, missing 547 return
539 end 548 end
540 dependencies_name[version] = rockspec.dependencies 549 dependencies_name[version] = rockspec.dependencies
541 else 550 else
@@ -544,18 +553,11 @@ function deps.scan_deps(results, missing, manifest, name, version, deps_mode)
544 rocks_provided = setmetatable({}, { __index = cfg.rocks_provided_3_0 }) 553 rocks_provided = setmetatable({}, { __index = cfg.rocks_provided_3_0 })
545 } 554 }
546 end 555 end
547 local matched, failures = deps.match_deps(rockspec, nil, deps_mode) 556 local matched = deps.match_deps(rockspec, nil, deps_mode)
548 results[name] = results 557 results[name] = version
549 for _, match in pairs(matched) do 558 for _, match in pairs(matched) do
550 results, missing = deps.scan_deps(results, missing, manifest, match.name, match.version, deps_mode) 559 deps.scan_deps(results, manifest, match.name, match.version, deps_mode)
551 end 560 end
552 if next(failures) then
553 for _, failure in pairs(failures) do
554 missing[deps.show_dep(failure)] = "failed"
555 end
556 end
557 results[name] = version
558 return results, missing
559end 561end
560 562
561local valid_deps_modes = { 563local valid_deps_modes = {
diff --git a/src/luarocks/install.lua b/src/luarocks/install.lua
index c9b085f5..3a33fcae 100644
--- a/src/luarocks/install.lua
+++ b/src/luarocks/install.lua
@@ -164,10 +164,13 @@ function install.command(flags, name, version)
164 end 164 end
165 if not ok then return nil, err end 165 if not ok then return nil, err end
166 name, version = ok, err 166 name, version = ok, err
167
167 if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then 168 if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then
168 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"]) 169 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
169 if not ok then util.printerr(err) end 170 if not ok then util.printerr(err) end
170 end 171 end
172
173 writer.check_dependencies(nil, deps.get_deps_mode(flags))
171 return name, version 174 return name, version
172 else 175 else
173 local search = require("luarocks.search") 176 local search = require("luarocks.search")
diff --git a/src/luarocks/make.lua b/src/luarocks/make.lua
index eb38bff0..d3d02814 100644
--- a/src/luarocks/make.lua
+++ b/src/luarocks/make.lua
@@ -13,6 +13,7 @@ local fetch = require("luarocks.fetch")
13local pack = require("luarocks.pack") 13local pack = require("luarocks.pack")
14local remove = require("luarocks.remove") 14local remove = require("luarocks.remove")
15local deps = require("luarocks.deps") 15local deps = require("luarocks.deps")
16local writer = require("luarocks.manif.writer")
16 17
17make.help_summary = "Compile package in current directory using a rockspec." 18make.help_summary = "Compile package in current directory using a rockspec."
18make.help_arguments = "[--pack-binary-rock] [<rockspec>]" 19make.help_arguments = "[--pack-binary-rock] [<rockspec>]"
@@ -75,10 +76,13 @@ function make.command(flags, rockspec)
75 ok, err = build.build_rockspec(rockspec, false, true, deps.get_deps_mode(flags)) 76 ok, err = build.build_rockspec(rockspec, false, true, deps.get_deps_mode(flags))
76 if not ok then return nil, err end 77 if not ok then return nil, err end
77 local name, version = ok, err 78 local name, version = ok, err
79
78 if (not flags["keep"]) and not cfg.keep_other_versions then 80 if (not flags["keep"]) and not cfg.keep_other_versions then
79 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"]) 81 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
80 if not ok then util.printerr(err) end 82 if not ok then util.printerr(err) end
81 end 83 end
84
85 writer.check_dependencies(nil, deps.get_deps_mode(flags))
82 return name, version 86 return name, version
83 end 87 end
84end 88end
diff --git a/src/luarocks/manif/writer.lua b/src/luarocks/manif/writer.lua
index daa6b005..cf35f38d 100644
--- a/src/luarocks/manif/writer.lua
+++ b/src/luarocks/manif/writer.lua
@@ -82,21 +82,11 @@ local function update_dependencies(manifest, deps_mode)
82 82
83 for pkg, versions in pairs(manifest.repository) do 83 for pkg, versions in pairs(manifest.repository) do
84 for version, repositories in pairs(versions) do 84 for version, repositories in pairs(versions) do
85 local current = pkg.." "..version
86 for _, repo in ipairs(repositories) do 85 for _, repo in ipairs(repositories) do
87 if repo.arch == "installed" then 86 if repo.arch == "installed" then
88 local missing 87 repo.dependencies = {}
89 repo.dependencies, missing = deps.scan_deps({}, {}, manifest, pkg, version, deps_mode) 88 deps.scan_deps(repo.dependencies, {}, manifest, pkg, version, deps_mode)
90 repo.dependencies[pkg] = nil 89 repo.dependencies[pkg] = nil
91 if missing then
92 for miss, err in pairs(missing) do
93 if miss == current then
94 util.printerr("Tree inconsistency detected: "..current.." has no rockspec. "..err)
95 elseif deps_mode ~= "none" then
96 util.printerr("Missing dependency for "..pkg.." "..version..": "..miss)
97 end
98 end
99 end
100 end 90 end
101 end 91 end
102 end 92 end
@@ -414,4 +404,33 @@ function writer.remove_from_manifest(name, version, repo, deps_mode)
414 return save_table(rocks_dir, "manifest", manifest) 404 return save_table(rocks_dir, "manifest", manifest)
415end 405end
416 406
407--- Report missing dependencies for all rocks installed in a repository.
408-- @param repo string or nil: Pathname of a local repository. If not given,
409-- the default local repository is used.
410-- @param deps_mode string: Dependency mode: "one" for the current default tree,
411-- "all" for all trees, "order" for all trees with priority >= the current default,
412-- "none" for using the default dependency mode from the configuration.
413function writer.check_dependencies(repo, deps_mode)
414 local rocks_dir = path.rocks_dir(repo or cfg.root_dir)
415 assert(type(deps_mode) == "string")
416 if deps_mode == "none" then deps_mode = cfg.deps_mode end
417
418 local manifest = manif.load_local_manifest(rocks_dir)
419 if not manifest then
420 return
421 end
422
423 for name, versions in util.sortedpairs(manifest.repository) do
424 for version, version_entries in util.sortedpairs(versions, deps.compare_versions) do
425 for _, entry in ipairs(version_entries) do
426 if entry.arch == "installed" then
427 if manifest.dependencies[name] and manifest.dependencies[name][version] then
428 deps.report_missing_dependencies(name, version, manifest.dependencies[name][version], deps_mode)
429 end
430 end
431 end
432 end
433 end
434end
435
417return writer 436return writer
diff --git a/src/luarocks/remove.lua b/src/luarocks/remove.lua
index e7f37604..08b5bd5e 100644
--- a/src/luarocks/remove.lua
+++ b/src/luarocks/remove.lua
@@ -11,6 +11,7 @@ local path = require("luarocks.path")
11local util = require("luarocks.util") 11local util = require("luarocks.util")
12local cfg = require("luarocks.core.cfg") 12local cfg = require("luarocks.core.cfg")
13local fs = require("luarocks.fs") 13local fs = require("luarocks.fs")
14local writer = require("luarocks.manif.writer")
14 15
15remove.help_summary = "Uninstall a rock." 16remove.help_summary = "Uninstall a rock."
16remove.help_arguments = "[--force|--force-fast] <name> [<version>]" 17remove.help_arguments = "[--force|--force-fast] <name> [<version>]"
@@ -159,7 +160,13 @@ function remove.command(flags, name, version)
159 return nil, "Could not find rock '"..name..(version and " "..version or "").."' in "..path.rocks_tree_to_string(cfg.root_dir) 160 return nil, "Could not find rock '"..name..(version and " "..version or "").."' in "..path.rocks_tree_to_string(cfg.root_dir)
160 end 161 end
161 162
162 return remove.remove_search_results(results, name, deps_mode, flags["force"], flags["force-fast"]) 163 local ok, err = remove.remove_search_results(results, name, deps_mode, flags["force"], flags["force-fast"])
164 if not ok then
165 return nil, err
166 end
167
168 writer.check_dependencies(nil, deps.get_deps_mode(flags))
169 return true
163end 170end
164 171
165return remove 172return remove