diff options
| author | Hisham Muhammad <hisham@gobolinux.org> | 2016-10-30 14:47:03 -0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-10-30 14:47:03 -0200 |
| commit | ba1ba4be6e0ecc6936c49fae38c71e22250ceb65 (patch) | |
| tree | 8d42717f3534d02b7b304c2a13b821b99cd67aaf /src | |
| parent | d9437bb79499c25751c304ee684c5de8fbfa1d73 (diff) | |
| parent | e5b7df87128e34b7f99baeb8c17290786e5b5ec9 (diff) | |
| download | luarocks-ba1ba4be6e0ecc6936c49fae38c71e22250ceb65.tar.gz luarocks-ba1ba4be6e0ecc6936c49fae38c71e22250ceb65.tar.bz2 luarocks-ba1ba4be6e0ecc6936c49fae38c71e22250ceb65.zip | |
Merge pull request #641 from mpeterv/missing-deps-check-changes-slurp
Get rid of repeated missing deps checks
Diffstat (limited to 'src')
| -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 |
