From 0574fb3c6d015b80c1f0330e2bf5a630c5ec306a Mon Sep 17 00:00:00 2001 From: Peter Melnichenko Date: Fri, 28 Oct 2016 17:24:01 +0300 Subject: Refactor store_results in luarocks.manif Instead of passing a function and its arguments to a helper function for it to call it, make a copy of result, and return it, call the function on the outer level and pass the result to helper. --- src/luarocks/manif.lua | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index 2d983a85..15a27c48 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua @@ -161,31 +161,28 @@ function manif.load_manifest(repo_url, lua_version) return manif_core.manifest_loader(pathname, repo_url, lua_version) end ---- Output a table listing items of a package. --- @param itemsfn function: a function for obtaining items of a package. --- pkg and version will be passed to it; it should return a table with --- items as keys. --- @param pkg string: package name --- @param version string: package version --- @param tbl table: the package matching table: keys should be item names --- and values arrays of strings with packages names in "name/version" format. -local function store_package_items(itemsfn, pkg, version, tbl) - assert(type(itemsfn) == "function") - assert(type(pkg) == "string") +--- Update storage table to account for items provided by a package. +-- @param storage table: a table storing items in the following format: +-- keys are item names and values are arrays of packages providing each item, +-- where a package is specified as string `name/version`. +-- @param items table: a table mapping item names to paths. +-- @param name string: package name. +-- @param version string: package version. +local function store_package_items(storage, name, version, items) + assert(type(storage) == "table") + assert(type(items) == "table") + assert(type(name) == "string") assert(type(version) == "string") - assert(type(tbl) == "table") - local pkg_version = pkg.."/"..version - local result = {} + local package_identifier = name.."/"..version - for item, path in pairs(itemsfn(pkg, version)) do - result[item] = path - if not tbl[item] then - tbl[item] = {} + for item_name, path in pairs(items) do + if not storage[item_name] then + storage[item_name] = {} end - table.insert(tbl[item], pkg_version) + + table.insert(storage[item_name], package_identifier) end - return result end --- Sort function for ordering rock identifiers in a manifest's @@ -340,8 +337,11 @@ local function store_results(results, manifest, dep_handler) if not rock_manifest then return nil, "rock_manifest file not found for "..name.." "..version.." - not a LuaRocks 2 tree?" end - entrytable.modules = store_package_items(repos.package_modules, name, version, manifest.modules) - entrytable.commands = store_package_items(repos.package_commands, name, version, manifest.commands) + + entrytable.modules = repos.package_modules(name, version) + store_package_items(manifest.modules, name, version, entrytable.modules) + entrytable.commands = repos.package_commands(name, version) + store_package_items(manifest.commands, name, version, entrytable.commands) end table.insert(versiontable, entrytable) end -- cgit v1.2.3-55-g6feb From 6a6d4e1c2f97b11caf826641b7dc1640effe283e Mon Sep 17 00:00:00 2001 From: Peter Melnichenko Date: Fri, 28 Oct 2016 17:32:43 +0300 Subject: Refactor store_results in luarocks.manif (2) Do not accept a hook function to call after storing results. Simply call it on the outside after calling store_results. --- src/luarocks/manif.lua | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index 15a27c48..4122364a 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua @@ -318,12 +318,10 @@ end -- @param results table: The search results as returned by search.disk_search. -- @param manifest table: A manifest table (must contain repository, modules, commands tables). -- It will be altered to include the search results. --- @param dep_handler: dependency handler function -- @return boolean or (nil, string): true in case of success, or nil followed by an error message. -local function store_results(results, manifest, dep_handler) +local function store_results(results, manifest) assert(type(results) == "table") assert(type(manifest) == "table") - assert((not dep_handler) or type(dep_handler) == "function") for name, versions in pairs(results) do local pkgtable = manifest.repository[name] or {} @@ -349,9 +347,6 @@ local function store_results(results, manifest, dep_handler) end manifest.repository[name] = pkgtable end - if dep_handler then - dep_handler(manifest) - end sort_package_matching_table(manifest.modules) sort_package_matching_table(manifest.commands) return true @@ -385,25 +380,19 @@ function manif.make_manifest(repo, deps_mode, remote) manif_core.cache_manifest(repo, nil, manifest) - local dep_handler = nil - if not remote then - dep_handler = function(manifest) - update_dependencies(manifest, deps_mode) - end - end - local ok, err = store_results(results, manifest, dep_handler) + local ok, err = store_results(results, manifest) if not ok then return nil, err end if remote then local cache = {} for luaver in util.lua_versions() do local vmanifest = { repository = {}, modules = {}, commands = {} } - local dep_handler = function(manifest) - filter_by_lua_version(manifest, luaver, repo, cache) - end - local ok, err = store_results(results, vmanifest, dep_handler) + local ok, err = store_results(results, vmanifest) + filter_by_lua_version(vmanifest, luaver, repo, cache) save_table(repo, "manifest-"..luaver, vmanifest) end + else + update_dependencies(manifest, deps_mode) end return save_table(repo, "manifest", manifest) @@ -445,12 +434,10 @@ function manif.update_manifest(name, version, repo, deps_mode) local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} - local dep_handler = function(manifest) - update_dependencies(manifest, deps_mode) - end - local ok, err = store_results(results, manifest, dep_handler) + local ok, err = store_results(results, manifest) if not ok then return nil, err end + update_dependencies(manifest, deps_mode) return save_table(repo, "manifest", manifest) end -- cgit v1.2.3-55-g6feb From b09ffc7d1c207a5cc4dda7b6ba1f52ede222327b Mon Sep 17 00:00:00 2001 From: Peter Melnichenko Date: Fri, 28 Oct 2016 17:57:42 +0300 Subject: Rename a variable in manif.update_manifest `repo` sometimes means root dir and sometimes means rock dir. At least do not reuse the same variable for both. --- src/luarocks/manif.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index 4122364a..d697a93c 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua @@ -414,31 +414,31 @@ end function manif.update_manifest(name, version, repo, deps_mode) assert(type(name) == "string") assert(type(version) == "string") - repo = path.rocks_dir(repo or cfg.root_dir) + local rocks_dir = path.rocks_dir(repo or cfg.root_dir) assert(type(deps_mode) == "string") if deps_mode == "none" then deps_mode = cfg.deps_mode end - local manifest, err = manif.load_manifest(repo) + local manifest, err = manif.load_manifest(rocks_dir) if not manifest then util.printerr("No existing manifest. Attempting to rebuild...") - local ok, err = manif.make_manifest(repo, deps_mode) + local ok, err = manif.make_manifest(rocks_dir, deps_mode) if not ok then return nil, err end - manifest, err = manif.load_manifest(repo) + manifest, err = manif.load_manifest(rocks_dir) if not manifest then return nil, err end end - local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} + local results = {[name] = {[version] = {{arch = "installed", repo = rocks_dir}}}} local ok, err = store_results(results, manifest) if not ok then return nil, err end update_dependencies(manifest, deps_mode) - return save_table(repo, "manifest", manifest) + return save_table(rocks_dir, "manifest", manifest) end function manif.zip_manifests() -- cgit v1.2.3-55-g6feb From 692c3250cdac66f3dd1379784e57f5e7fa0c53b9 Mon Sep 17 00:00:00 2001 From: Peter Melnichenko Date: Fri, 28 Oct 2016 18:00:12 +0300 Subject: manif.update_manifest: load manifest as local --- src/luarocks/manif.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index d697a93c..6b42912d 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua @@ -419,7 +419,7 @@ function manif.update_manifest(name, version, repo, deps_mode) if deps_mode == "none" then deps_mode = cfg.deps_mode end - local manifest, err = manif.load_manifest(rocks_dir) + local manifest, err = manif_core.load_local_manifest(rocks_dir) if not manifest then util.printerr("No existing manifest. Attempting to rebuild...") local ok, err = manif.make_manifest(rocks_dir, deps_mode) -- cgit v1.2.3-55-g6feb From fb8a377a8735382921f72cd97bb98a0aef38de72 Mon Sep 17 00:00:00 2001 From: Peter Melnichenko Date: Fri, 28 Oct 2016 18:03:30 +0300 Subject: manif.update_manifest: do not update manifest if rebuilt --- src/luarocks/manif.lua | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index 6b42912d..9213f362 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua @@ -422,14 +422,10 @@ function manif.update_manifest(name, version, repo, deps_mode) local manifest, err = manif_core.load_local_manifest(rocks_dir) if not manifest then util.printerr("No existing manifest. Attempting to rebuild...") - local ok, err = manif.make_manifest(rocks_dir, deps_mode) - if not ok then - return nil, err - end - manifest, err = manif.load_manifest(rocks_dir) - if not manifest then - return nil, err - end + -- Manifest built by `manif.make_manifest` should already + -- include information about given name and version, + -- no need to update it. + return manif.make_manifest(rocks_dir, deps_mode) end local results = {[name] = {[version] = {{arch = "installed", repo = rocks_dir}}}} -- cgit v1.2.3-55-g6feb From 7ce4a5c9accb22eb1fc422036c72f809e8c026b9 Mon Sep 17 00:00:00 2001 From: Peter Melnichenko Date: Fri, 28 Oct 2016 18:36:21 +0300 Subject: Update manifest after removal without rebuilding Rename `manif.update_manifest` to `manif.add_to_manifest`. Add `manif.remove_from_manifest` that performs reverse action. Use it in `repos.delete_version` to avoid rebuilding manifest everytime a package is removed. --- src/luarocks/manif.lua | 89 ++++++++++++++++++++++++++++++++++++++++++++++---- src/luarocks/repos.lua | 4 +-- 2 files changed, 84 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index 9213f362..c4c52bd2 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua @@ -185,6 +185,37 @@ local function store_package_items(storage, name, version, items) end end +--- Update storage table removing items provided by a package. +-- @param storage table: a table storing items in the following format: +-- keys are item names and values are arrays of packages providing each item, +-- where a package is specified as string `name/version`. +-- @param items table: a table mapping item names to paths. +-- @param name string: package name. +-- @param version string: package version. +local function remove_package_items(storage, name, version, items) + assert(type(storage) == "table") + assert(type(items) == "table") + assert(type(name) == "string") + assert(type(version) == "string") + + local package_identifier = name.."/"..version + + for item_name, path in pairs(items) do + local all_identifiers = storage[item_name] + + for i, identifier in ipairs(all_identifiers) do + if identifier == package_identifier then + table.remove(all_identifiers, i) + break + end + end + + if #all_identifiers == 0 then + storage[item_name] = nil + end + end +end + --- Sort function for ordering rock identifiers in a manifest's -- modules table. Rocks are ordered alphabetically by name, and then -- by version which greater first. @@ -398,10 +429,8 @@ function manif.make_manifest(repo, deps_mode, remote) return save_table(repo, "manifest", manifest) end ---- Load a manifest file from a local repository and add to the repository --- information with regard to the given name and version. --- A file called 'manifest' will be written in the root of the given --- repository directory. +--- Update manifest file for a local repository +-- adding information about a version of a package installed in that repository. -- @param name string: Name of a package from the repository. -- @param version string: Version of a package from the repository. -- @param repo string or nil: Pathname of a local repository. If not given, @@ -409,14 +438,14 @@ end -- @param deps_mode string: Dependency mode: "one" for the current default tree, -- "all" for all trees, "order" for all trees with priority >= the current default, -- "none" for using the default dependency mode from the configuration. --- @return boolean or (nil, string): True if manifest was generated, +-- @return boolean or (nil, string): True if manifest was updated successfully, -- or nil and an error message. -function manif.update_manifest(name, version, repo, deps_mode) +function manif.add_to_manifest(name, version, repo, deps_mode) assert(type(name) == "string") assert(type(version) == "string") local rocks_dir = path.rocks_dir(repo or cfg.root_dir) assert(type(deps_mode) == "string") - + if deps_mode == "none" then deps_mode = cfg.deps_mode end local manifest, err = manif_core.load_local_manifest(rocks_dir) @@ -437,6 +466,52 @@ function manif.update_manifest(name, version, repo, deps_mode) return save_table(rocks_dir, "manifest", manifest) end +--- Update manifest file for a local repository +-- removing information about a version of a package. +-- @param name string: Name of a package removed from the repository. +-- @param version string: Version of a package removed from the repository. +-- @param repo string or nil: Pathname of a local repository. If not given, +-- the default local repository is used. +-- @param deps_mode string: Dependency mode: "one" for the current default tree, +-- "all" for all trees, "order" for all trees with priority >= the current default, +-- "none" for using the default dependency mode from the configuration. +-- @return boolean or (nil, string): True if manifest was updated successfully, +-- or nil and an error message. +function manif.remove_from_manifest(name, version, repo, deps_mode) + assert(type(name) == "string") + assert(type(version) == "string") + local rocks_dir = path.rocks_dir(repo or cfg.root_dir) + assert(type(deps_mode) == "string") + + if deps_mode == "none" then deps_mode = cfg.deps_mode end + + local manifest, err = manif_core.load_local_manifest(rocks_dir) + if not manifest then + util.printerr("No existing manifest. Attempting to rebuild...") + -- Manifest built by `manif.make_manifest` should already + -- include up-to-date information, no need to update it. + return manif.make_manifest(rocks_dir, deps_mode) + end + + local package_entry = manifest.repository[name] + + local version_entry = package_entry[version][1] + remove_package_items(manifest.modules, name, version, version_entry.modules) + remove_package_items(manifest.commands, name, version, version_entry.commands) + + package_entry[version] = nil + manifest.dependencies[name][version] = nil + + if not next(package_entry) then + -- No more versions of this package. + manifest.repository[name] = nil + manifest.dependencies[name] = nil + end + + update_dependencies(manifest, deps_mode) + return save_table(rocks_dir, "manifest", manifest) +end + function manif.zip_manifests() for ver in util.lua_versions() do local file = "manifest-"..ver diff --git a/src/luarocks/repos.lua b/src/luarocks/repos.lua index c5f157c4..d4d9694e 100644 --- a/src/luarocks/repos.lua +++ b/src/luarocks/repos.lua @@ -312,7 +312,7 @@ function repos.deploy_files(name, version, wrap_bin_scripts, deps_mode) return nil, err end - return manif.update_manifest(name, version, nil, deps_mode) + return manif.add_to_manifest(name, version, nil, deps_mode) end --- Delete a package from the local repository. @@ -398,7 +398,7 @@ function repos.delete_version(name, version, deps_mode, quick) return true end - return manif.make_manifest(cfg.rocks_dir, deps_mode) + return manif.remove_from_manifest(name, version, nil, deps_mode) end return repos -- cgit v1.2.3-55-g6feb