diff options
author | Peter Melnichenko <mpeterval@gmail.com> | 2016-10-29 23:19:53 +0300 |
---|---|---|
committer | Peter Melnichenko <mpeterval@gmail.com> | 2016-10-30 12:33:28 +0300 |
commit | e5b7df87128e34b7f99baeb8c17290786e5b5ec9 (patch) | |
tree | 8d42717f3534d02b7b304c2a13b821b99cd67aaf | |
parent | d9437bb79499c25751c304ee684c5de8fbfa1d73 (diff) | |
download | luarocks-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.lua | 10 | ||||
-rw-r--r-- | src/luarocks/deps.lua | 70 | ||||
-rw-r--r-- | src/luarocks/install.lua | 3 | ||||
-rw-r--r-- | src/luarocks/make.lua | 4 | ||||
-rw-r--r-- | src/luarocks/manif.lua | 43 | ||||
-rw-r--r-- | src/luarocks/remove.lua | 9 |
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 |
413 | end | 413 | end |
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" |
401 | end | 401 | end |
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. | ||
410 | function 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 | ||
423 | end | ||
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 |
675 | end | 686 | end |
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. | 695 | function deps.scan_deps(results, manifest, name, version, deps_mode) |
685 | function 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 | ||
725 | end | 727 | end |
726 | 728 | ||
727 | local valid_deps_modes = { | 729 | local 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") | |||
14 | local pack = require("luarocks.pack") | 14 | local pack = require("luarocks.pack") |
15 | local remove = require("luarocks.remove") | 15 | local remove = require("luarocks.remove") |
16 | local deps = require("luarocks.deps") | 16 | local deps = require("luarocks.deps") |
17 | local manif = require("luarocks.manif") | ||
17 | 18 | ||
18 | util.add_run_function(make) | 19 | util.add_run_function(make) |
19 | make.help_summary = "Compile package in current directory using a rockspec." | 20 | make.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 |
86 | end | 90 | end |
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) |
513 | end | 503 | end |
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. | ||
511 | function 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 | ||
532 | end | ||
533 | |||
515 | function manif.zip_manifests() | 534 | function 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") | |||
12 | local util = require("luarocks.util") | 12 | local util = require("luarocks.util") |
13 | local cfg = require("luarocks.cfg") | 13 | local cfg = require("luarocks.cfg") |
14 | local fs = require("luarocks.fs") | 14 | local fs = require("luarocks.fs") |
15 | local manif = require("luarocks.manif") | ||
15 | 16 | ||
16 | util.add_run_function(remove) | 17 | util.add_run_function(remove) |
17 | remove.help_summary = "Uninstall a rock." | 18 | remove.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 | ||
165 | end | 172 | end |
166 | 173 | ||
167 | return remove | 174 | return remove |