aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Melnichenko <mpeterval@gmail.com>2016-10-29 23:19:53 +0300
committerPeter Melnichenko <mpeterval@gmail.com>2016-10-30 12:33:28 +0300
commite5b7df87128e34b7f99baeb8c17290786e5b5ec9 (patch)
tree8d42717f3534d02b7b304c2a13b821b99cd67aaf
parentd9437bb79499c25751c304ee684c5de8fbfa1d73 (diff)
downloadluarocks-e5b7df87128e34b7f99baeb8c17290786e5b5ec9.tar.gz
luarocks-e5b7df87128e34b7f99baeb8c17290786e5b5ec9.tar.bz2
luarocks-e5b7df87128e34b7f99baeb8c17290786e5b5ec9.zip
Get rid of repeated missing deps checks
Do not report missing dependencies on manifest update, which is now done more often. Instead do it at the end of commands that may alter manifest (install, build, make, remove - excluding purge). For reporting reuse format used when showing missing deps to be installed. Do not report missing indirect dependencies, only direct ones.
-rw-r--r--src/luarocks/build.lua10
-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.lua43
-rw-r--r--src/luarocks/remove.lua9
6 files changed, 87 insertions, 52 deletions
diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua
index 20d094b1..96b232ff 100644
--- a/src/luarocks/build.lua
+++ b/src/luarocks/build.lua
@@ -400,14 +400,14 @@ function build.command(flags, name, version)
400 if not ok then return nil, err, cfg.errorcodes.PERMISSIONDENIED end 400 if not ok then return nil, err, cfg.errorcodes.PERMISSIONDENIED end
401 ok, err = do_build(name, version, deps.get_deps_mode(flags), flags["only-deps"]) 401 ok, err = do_build(name, version, deps.get_deps_mode(flags), flags["only-deps"])
402 if not ok then return nil, err end 402 if not ok then return nil, err end
403 local name, version = ok, err 403 name, version = ok, err
404 if flags["only-deps"] then 404
405 return name, version 405 if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then
406 end
407 if (not flags["keep"]) and not cfg.keep_other_versions then
408 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"]) 406 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
409 if not ok then util.printerr(err) end 407 if not ok then util.printerr(err) end
410 end 408 end
409
410 manif.check_dependencies(nil, deps.get_deps_mode(flags))
411 return name, version 411 return name, version
412 end 412 end
413end 413end
diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua
index 756ba6bd..dcebec9b 100644
--- a/src/luarocks/deps.lua
+++ b/src/luarocks/deps.lua
@@ -400,6 +400,28 @@ local function rock_status(name, deps_mode)
400 return installed and installed.." "..installation_type or "not installed" 400 return installed and installed.." "..installation_type or "not installed"
401end 401end
402 402
403--- Check depenendencies of a package and report any missing ones.
404-- @param name string: package name.
405-- @param version string: package version.
406-- @param dependencies table: array of dependencies.
407-- @param deps_mode string: Which trees to check dependencies for:
408-- "one" for the current default tree, "all" for all trees,
409-- "order" for all trees with priority >= the current default, "none" for no trees.
410function deps.report_missing_dependencies(name, version, dependencies, deps_mode)
411 local first_missing_dep = true
412
413 for _, dep in ipairs(dependencies) do
414 if not match_dep(dep, nil, deps_mode) then
415 if first_missing_dep then
416 util.printout(("Missing dependencies for %s %s:"):format(name, version))
417 first_missing_dep = false
418 end
419
420 util.printout((" %s (%s)"):format(deps.show_dep(dep), rock_status(dep.name, deps_mode)))
421 end
422 end
423end
424
403--- Check dependencies of a rock and attempt to install any missing ones. 425--- Check dependencies of a rock and attempt to install any missing ones.
404-- Packages are installed using the LuaRocks "install" command. 426-- Packages are installed using the LuaRocks "install" command.
405-- Aborts the program if a dependency could not be fulfilled. 427-- Aborts the program if a dependency could not be fulfilled.
@@ -439,20 +461,9 @@ function deps.fulfill_dependencies(rockspec, deps_mode)
439 end 461 end
440 end 462 end
441 463
442 local first_missing_dep = true 464 deps.report_missing_dependencies(rockspec.name, rockspec.version, rockspec.dependencies, deps_mode)
443
444 for _, dep in ipairs(rockspec.dependencies) do
445 if not match_dep(dep, nil, deps_mode) then
446 if first_missing_dep then
447 util.printout(("Missing dependencies for %s %s:"):format(rockspec.name, rockspec.version))
448 first_missing_dep = false
449 end
450
451 util.printout((" %s (%s)"):format(deps.show_dep(dep), rock_status(dep.name, deps_mode)))
452 end
453 end
454 465
455 first_missing_dep = true 466 local first_missing_dep = true
456 467
457 for _, dep in ipairs(rockspec.dependencies) do 468 for _, dep in ipairs(rockspec.dependencies) do
458 if not match_dep(dep, nil, deps_mode) then 469 if not match_dep(dep, nil, deps_mode) then
@@ -674,17 +685,15 @@ function deps.check_external_deps(rockspec, mode)
674 return true 685 return true
675end 686end
676 687
677--- Recursively scan dependencies, to build a transitive closure of all 688--- Recursively add satisfied dependencies of a package to a table,
678-- dependent packages. 689-- to build a transitive closure of all dependent packages.
679-- @param results table: The results table being built. 690-- Additionally ensures that `dependencies` table of the manifest is up-to-date.
680-- @param missing table: The table of missing dependencies being recursively built. 691-- @param results table: The results table being built, maps package names to versions.
681-- @param manifest table: The manifest table containing dependencies. 692-- @param manifest table: The manifest table containing dependencies.
682-- @param name string: Package name. 693-- @param name string: Package name.
683-- @param version string: Package version. 694-- @param version string: Package version.
684-- @return (table, table): The results and a table of missing dependencies. 695function deps.scan_deps(results, manifest, name, version, deps_mode)
685function deps.scan_deps(results, missing, manifest, name, version, deps_mode)
686 assert(type(results) == "table") 696 assert(type(results) == "table")
687 assert(type(missing) == "table")
688 assert(type(manifest) == "table") 697 assert(type(manifest) == "table")
689 assert(type(name) == "string") 698 assert(type(name) == "string")
690 assert(type(version) == "string") 699 assert(type(version) == "string")
@@ -692,7 +701,7 @@ function deps.scan_deps(results, missing, manifest, name, version, deps_mode)
692 local fetch = require("luarocks.fetch") 701 local fetch = require("luarocks.fetch")
693 702
694 if results[name] then 703 if results[name] then
695 return results, missing 704 return
696 end 705 end
697 if not manifest.dependencies then manifest.dependencies = {} end 706 if not manifest.dependencies then manifest.dependencies = {} end
698 local dependencies = manifest.dependencies 707 local dependencies = manifest.dependencies
@@ -702,26 +711,19 @@ function deps.scan_deps(results, missing, manifest, name, version, deps_mode)
702 local rockspec, err 711 local rockspec, err
703 if not deplist then 712 if not deplist then
704 rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version), false) 713 rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version), false)
705 if err then 714 if not rockspec then
706 missing[name.." "..version] = err 715 util.printerr("Couldn't load rockspec for "..name.." "..version..": "..err)
707 return results, missing 716 return
708 end 717 end
709 dependencies_name[version] = rockspec.dependencies 718 dependencies_name[version] = rockspec.dependencies
710 else 719 else
711 rockspec = { dependencies = deplist } 720 rockspec = { dependencies = deplist }
712 end 721 end
713 local matched, failures = deps.match_deps(rockspec, nil, deps_mode) 722 local matched = deps.match_deps(rockspec, nil, deps_mode)
714 results[name] = results 723 results[name] = version
715 for _, match in pairs(matched) do 724 for _, match in pairs(matched) do
716 results, missing = deps.scan_deps(results, missing, manifest, match.name, match.version, deps_mode) 725 deps.scan_deps(results, manifest, match.name, match.version, deps_mode)
717 end 726 end
718 if next(failures) then
719 for _, failure in pairs(failures) do
720 missing[deps.show_dep(failure)] = "failed"
721 end
722 end
723 results[name] = version
724 return results, missing
725end 727end
726 728
727local valid_deps_modes = { 729local valid_deps_modes = {
diff --git a/src/luarocks/install.lua b/src/luarocks/install.lua
index b5128430..e28c24f0 100644
--- a/src/luarocks/install.lua
+++ b/src/luarocks/install.lua
@@ -166,10 +166,13 @@ function install.command(flags, name, version)
166 end 166 end
167 if not ok then return nil, err end 167 if not ok then return nil, err end
168 name, version = ok, err 168 name, version = ok, err
169
169 if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then 170 if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then
170 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"]) 171 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
171 if not ok then util.printerr(err) end 172 if not ok then util.printerr(err) end
172 end 173 end
174
175 manif.check_dependencies(nil, deps.get_deps_mode(flags))
173 return name, version 176 return name, version
174 else 177 else
175 local search = require("luarocks.search") 178 local search = require("luarocks.search")
diff --git a/src/luarocks/make.lua b/src/luarocks/make.lua
index 1464def7..15167c1e 100644
--- a/src/luarocks/make.lua
+++ b/src/luarocks/make.lua
@@ -14,6 +14,7 @@ local fetch = require("luarocks.fetch")
14local pack = require("luarocks.pack") 14local pack = require("luarocks.pack")
15local remove = require("luarocks.remove") 15local remove = require("luarocks.remove")
16local deps = require("luarocks.deps") 16local deps = require("luarocks.deps")
17local manif = require("luarocks.manif")
17 18
18util.add_run_function(make) 19util.add_run_function(make)
19make.help_summary = "Compile package in current directory using a rockspec." 20make.help_summary = "Compile package in current directory using a rockspec."
@@ -77,10 +78,13 @@ function make.command(flags, rockspec)
77 ok, err = build.build_rockspec(rockspec, false, true, deps.get_deps_mode(flags)) 78 ok, err = build.build_rockspec(rockspec, false, true, deps.get_deps_mode(flags))
78 if not ok then return nil, err end 79 if not ok then return nil, err end
79 local name, version = ok, err 80 local name, version = ok, err
81
80 if (not flags["keep"]) and not cfg.keep_other_versions then 82 if (not flags["keep"]) and not cfg.keep_other_versions then
81 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"]) 83 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
82 if not ok then util.printerr(err) end 84 if not ok then util.printerr(err) end
83 end 85 end
86
87 manif.check_dependencies(nil, deps.get_deps_mode(flags))
84 return name, version 88 return name, version
85 end 89 end
86end 90end
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index c4c52bd2..86209d06 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -274,21 +274,11 @@ local function update_dependencies(manifest, deps_mode)
274 274
275 for pkg, versions in pairs(manifest.repository) do 275 for pkg, versions in pairs(manifest.repository) do
276 for version, repositories in pairs(versions) do 276 for version, repositories in pairs(versions) do
277 local current = pkg.." "..version
278 for _, repo in ipairs(repositories) do 277 for _, repo in ipairs(repositories) do
279 if repo.arch == "installed" then 278 if repo.arch == "installed" then
280 local missing 279 repo.dependencies = {}
281 repo.dependencies, missing = deps.scan_deps({}, {}, manifest, pkg, version, deps_mode) 280 deps.scan_deps(repo.dependencies, manifest, pkg, version, deps_mode)
282 repo.dependencies[pkg] = nil 281 repo.dependencies[pkg] = nil
283 if missing then
284 for miss, err in pairs(missing) do
285 if miss == current then
286 util.printerr("Tree inconsistency detected: "..current.." has no rockspec. "..err)
287 elseif deps_mode ~= "none" then
288 util.printerr("Missing dependency for "..pkg.." "..version..": "..miss)
289 end
290 end
291 end
292 end 282 end
293 end 283 end
294 end 284 end
@@ -512,6 +502,35 @@ function manif.remove_from_manifest(name, version, repo, deps_mode)
512 return save_table(rocks_dir, "manifest", manifest) 502 return save_table(rocks_dir, "manifest", manifest)
513end 503end
514 504
505--- Report missing dependencies for all rocks installed in a repository.
506-- @param repo string or nil: Pathname of a local repository. If not given,
507-- the default local repository is used.
508-- @param deps_mode string: Dependency mode: "one" for the current default tree,
509-- "all" for all trees, "order" for all trees with priority >= the current default,
510-- "none" for using the default dependency mode from the configuration.
511function manif.check_dependencies(repo, deps_mode)
512 local rocks_dir = path.rocks_dir(repo or cfg.root_dir)
513 assert(type(deps_mode) == "string")
514 if deps_mode == "none" then deps_mode = cfg.deps_mode end
515
516 local manifest = manif_core.load_local_manifest(rocks_dir)
517 if not manifest then
518 return
519 end
520
521 for name, versions in util.sortedpairs(manifest.repository) do
522 for version, version_entries in util.sortedpairs(versions, deps.compare_versions) do
523 for _, entry in ipairs(version_entries) do
524 if entry.arch == "installed" then
525 if manifest.dependencies[name] and manifest.dependencies[name][version] then
526 deps.report_missing_dependencies(name, version, manifest.dependencies[name][version], deps_mode)
527 end
528 end
529 end
530 end
531 end
532end
533
515function manif.zip_manifests() 534function manif.zip_manifests()
516 for ver in util.lua_versions() do 535 for ver in util.lua_versions() do
517 local file = "manifest-"..ver 536 local file = "manifest-"..ver
diff --git a/src/luarocks/remove.lua b/src/luarocks/remove.lua
index 601eedcf..514c6dfa 100644
--- a/src/luarocks/remove.lua
+++ b/src/luarocks/remove.lua
@@ -12,6 +12,7 @@ local path = require("luarocks.path")
12local util = require("luarocks.util") 12local util = require("luarocks.util")
13local cfg = require("luarocks.cfg") 13local cfg = require("luarocks.cfg")
14local fs = require("luarocks.fs") 14local fs = require("luarocks.fs")
15local manif = require("luarocks.manif")
15 16
16util.add_run_function(remove) 17util.add_run_function(remove)
17remove.help_summary = "Uninstall a rock." 18remove.help_summary = "Uninstall a rock."
@@ -161,7 +162,13 @@ function remove.command(flags, name, version)
161 return nil, "Could not find rock '"..name..(version and " "..version or "").."' in "..path.rocks_tree_to_string(cfg.root_dir) 162 return nil, "Could not find rock '"..name..(version and " "..version or "").."' in "..path.rocks_tree_to_string(cfg.root_dir)
162 end 163 end
163 164
164 return remove.remove_search_results(results, name, deps_mode, flags["force"], flags["force-fast"]) 165 local ok, err = remove.remove_search_results(results, name, deps_mode, flags["force"], flags["force-fast"])
166 if not ok then
167 return nil, err
168 end
169
170 manif.check_dependencies(nil, deps.get_deps_mode(flags))
171 return true
165end 172end
166 173
167return remove 174return remove