aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2016-10-29 15:56:26 -0200
committerGitHub <noreply@github.com>2016-10-29 15:56:26 -0200
commitd9437bb79499c25751c304ee684c5de8fbfa1d73 (patch)
treeac82dd9a019ac861eec113cdc729acf71c2889d2
parentf04b02b27fac9c409d0da5628026648f8329a99b (diff)
parent7ce4a5c9accb22eb1fc422036c72f809e8c026b9 (diff)
downloadluarocks-d9437bb79499c25751c304ee684c5de8fbfa1d73.tar.gz
luarocks-d9437bb79499c25751c304ee684c5de8fbfa1d73.tar.bz2
luarocks-d9437bb79499c25751c304ee684c5de8fbfa1d73.zip
Merge pull request #638 from mpeterv/remove-without-manifest-rebuild
Remove packages without manifest rebuild
-rw-r--r--src/luarocks/manif.lua182
-rw-r--r--src/luarocks/repos.lua4
2 files changed, 122 insertions, 64 deletions
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index 2d983a85..c4c52bd2 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -161,31 +161,59 @@ function manif.load_manifest(repo_url, lua_version)
161 return manif_core.manifest_loader(pathname, repo_url, lua_version) 161 return manif_core.manifest_loader(pathname, repo_url, lua_version)
162end 162end
163 163
164--- Output a table listing items of a package. 164--- Update storage table to account for items provided by a package.
165-- @param itemsfn function: a function for obtaining items of a package. 165-- @param storage table: a table storing items in the following format:
166-- pkg and version will be passed to it; it should return a table with 166-- keys are item names and values are arrays of packages providing each item,
167-- items as keys. 167-- where a package is specified as string `name/version`.
168-- @param pkg string: package name 168-- @param items table: a table mapping item names to paths.
169-- @param version string: package version 169-- @param name string: package name.
170-- @param tbl table: the package matching table: keys should be item names 170-- @param version string: package version.
171-- and values arrays of strings with packages names in "name/version" format. 171local function store_package_items(storage, name, version, items)
172local function store_package_items(itemsfn, pkg, version, tbl) 172 assert(type(storage) == "table")
173 assert(type(itemsfn) == "function") 173 assert(type(items) == "table")
174 assert(type(pkg) == "string") 174 assert(type(name) == "string")
175 assert(type(version) == "string") 175 assert(type(version) == "string")
176 assert(type(tbl) == "table")
177 176
178 local pkg_version = pkg.."/"..version 177 local package_identifier = name.."/"..version
179 local result = {}
180 178
181 for item, path in pairs(itemsfn(pkg, version)) do 179 for item_name, path in pairs(items) do
182 result[item] = path 180 if not storage[item_name] then
183 if not tbl[item] then 181 storage[item_name] = {}
184 tbl[item] = {} 182 end
183
184 table.insert(storage[item_name], package_identifier)
185 end
186end
187
188--- Update storage table removing items provided by a package.
189-- @param storage table: a table storing items in the following format:
190-- keys are item names and values are arrays of packages providing each item,
191-- where a package is specified as string `name/version`.
192-- @param items table: a table mapping item names to paths.
193-- @param name string: package name.
194-- @param version string: package version.
195local function remove_package_items(storage, name, version, items)
196 assert(type(storage) == "table")
197 assert(type(items) == "table")
198 assert(type(name) == "string")
199 assert(type(version) == "string")
200
201 local package_identifier = name.."/"..version
202
203 for item_name, path in pairs(items) do
204 local all_identifiers = storage[item_name]
205
206 for i, identifier in ipairs(all_identifiers) do
207 if identifier == package_identifier then
208 table.remove(all_identifiers, i)
209 break
210 end
211 end
212
213 if #all_identifiers == 0 then
214 storage[item_name] = nil
185 end 215 end
186 table.insert(tbl[item], pkg_version)
187 end 216 end
188 return result
189end 217end
190 218
191--- Sort function for ordering rock identifiers in a manifest's 219--- Sort function for ordering rock identifiers in a manifest's
@@ -321,12 +349,10 @@ end
321-- @param results table: The search results as returned by search.disk_search. 349-- @param results table: The search results as returned by search.disk_search.
322-- @param manifest table: A manifest table (must contain repository, modules, commands tables). 350-- @param manifest table: A manifest table (must contain repository, modules, commands tables).
323-- It will be altered to include the search results. 351-- It will be altered to include the search results.
324-- @param dep_handler: dependency handler function
325-- @return boolean or (nil, string): true in case of success, or nil followed by an error message. 352-- @return boolean or (nil, string): true in case of success, or nil followed by an error message.
326local function store_results(results, manifest, dep_handler) 353local function store_results(results, manifest)
327 assert(type(results) == "table") 354 assert(type(results) == "table")
328 assert(type(manifest) == "table") 355 assert(type(manifest) == "table")
329 assert((not dep_handler) or type(dep_handler) == "function")
330 356
331 for name, versions in pairs(results) do 357 for name, versions in pairs(results) do
332 local pkgtable = manifest.repository[name] or {} 358 local pkgtable = manifest.repository[name] or {}
@@ -340,8 +366,11 @@ local function store_results(results, manifest, dep_handler)
340 if not rock_manifest then 366 if not rock_manifest then
341 return nil, "rock_manifest file not found for "..name.." "..version.." - not a LuaRocks 2 tree?" 367 return nil, "rock_manifest file not found for "..name.." "..version.." - not a LuaRocks 2 tree?"
342 end 368 end
343 entrytable.modules = store_package_items(repos.package_modules, name, version, manifest.modules) 369
344 entrytable.commands = store_package_items(repos.package_commands, name, version, manifest.commands) 370 entrytable.modules = repos.package_modules(name, version)
371 store_package_items(manifest.modules, name, version, entrytable.modules)
372 entrytable.commands = repos.package_commands(name, version)
373 store_package_items(manifest.commands, name, version, entrytable.commands)
345 end 374 end
346 table.insert(versiontable, entrytable) 375 table.insert(versiontable, entrytable)
347 end 376 end
@@ -349,9 +378,6 @@ local function store_results(results, manifest, dep_handler)
349 end 378 end
350 manifest.repository[name] = pkgtable 379 manifest.repository[name] = pkgtable
351 end 380 end
352 if dep_handler then
353 dep_handler(manifest)
354 end
355 sort_package_matching_table(manifest.modules) 381 sort_package_matching_table(manifest.modules)
356 sort_package_matching_table(manifest.commands) 382 sort_package_matching_table(manifest.commands)
357 return true 383 return true
@@ -385,34 +411,26 @@ function manif.make_manifest(repo, deps_mode, remote)
385 411
386 manif_core.cache_manifest(repo, nil, manifest) 412 manif_core.cache_manifest(repo, nil, manifest)
387 413
388 local dep_handler = nil 414 local ok, err = store_results(results, manifest)
389 if not remote then
390 dep_handler = function(manifest)
391 update_dependencies(manifest, deps_mode)
392 end
393 end
394 local ok, err = store_results(results, manifest, dep_handler)
395 if not ok then return nil, err end 415 if not ok then return nil, err end
396 416
397 if remote then 417 if remote then
398 local cache = {} 418 local cache = {}
399 for luaver in util.lua_versions() do 419 for luaver in util.lua_versions() do
400 local vmanifest = { repository = {}, modules = {}, commands = {} } 420 local vmanifest = { repository = {}, modules = {}, commands = {} }
401 local dep_handler = function(manifest) 421 local ok, err = store_results(results, vmanifest)
402 filter_by_lua_version(manifest, luaver, repo, cache) 422 filter_by_lua_version(vmanifest, luaver, repo, cache)
403 end
404 local ok, err = store_results(results, vmanifest, dep_handler)
405 save_table(repo, "manifest-"..luaver, vmanifest) 423 save_table(repo, "manifest-"..luaver, vmanifest)
406 end 424 end
425 else
426 update_dependencies(manifest, deps_mode)
407 end 427 end
408 428
409 return save_table(repo, "manifest", manifest) 429 return save_table(repo, "manifest", manifest)
410end 430end
411 431
412--- Load a manifest file from a local repository and add to the repository 432--- Update manifest file for a local repository
413-- information with regard to the given name and version. 433-- adding information about a version of a package installed in that repository.
414-- A file called 'manifest' will be written in the root of the given
415-- repository directory.
416-- @param name string: Name of a package from the repository. 434-- @param name string: Name of a package from the repository.
417-- @param version string: Version of a package from the repository. 435-- @param version string: Version of a package from the repository.
418-- @param repo string or nil: Pathname of a local repository. If not given, 436-- @param repo string or nil: Pathname of a local repository. If not given,
@@ -420,38 +438,78 @@ end
420-- @param deps_mode string: Dependency mode: "one" for the current default tree, 438-- @param deps_mode string: Dependency mode: "one" for the current default tree,
421-- "all" for all trees, "order" for all trees with priority >= the current default, 439-- "all" for all trees, "order" for all trees with priority >= the current default,
422-- "none" for using the default dependency mode from the configuration. 440-- "none" for using the default dependency mode from the configuration.
423-- @return boolean or (nil, string): True if manifest was generated, 441-- @return boolean or (nil, string): True if manifest was updated successfully,
424-- or nil and an error message. 442-- or nil and an error message.
425function manif.update_manifest(name, version, repo, deps_mode) 443function manif.add_to_manifest(name, version, repo, deps_mode)
426 assert(type(name) == "string") 444 assert(type(name) == "string")
427 assert(type(version) == "string") 445 assert(type(version) == "string")
428 repo = path.rocks_dir(repo or cfg.root_dir) 446 local rocks_dir = path.rocks_dir(repo or cfg.root_dir)
429 assert(type(deps_mode) == "string") 447 assert(type(deps_mode) == "string")
430 448
431 if deps_mode == "none" then deps_mode = cfg.deps_mode end 449 if deps_mode == "none" then deps_mode = cfg.deps_mode end
432 450
433 local manifest, err = manif.load_manifest(repo) 451 local manifest, err = manif_core.load_local_manifest(rocks_dir)
434 if not manifest then 452 if not manifest then
435 util.printerr("No existing manifest. Attempting to rebuild...") 453 util.printerr("No existing manifest. Attempting to rebuild...")
436 local ok, err = manif.make_manifest(repo, deps_mode) 454 -- Manifest built by `manif.make_manifest` should already
437 if not ok then 455 -- include information about given name and version,
438 return nil, err 456 -- no need to update it.
439 end 457 return manif.make_manifest(rocks_dir, deps_mode)
440 manifest, err = manif.load_manifest(repo)
441 if not manifest then
442 return nil, err
443 end
444 end 458 end
445 459
446 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} 460 local results = {[name] = {[version] = {{arch = "installed", repo = rocks_dir}}}}
447 461
448 local dep_handler = function(manifest) 462 local ok, err = store_results(results, manifest)
449 update_dependencies(manifest, deps_mode)
450 end
451 local ok, err = store_results(results, manifest, dep_handler)
452 if not ok then return nil, err end 463 if not ok then return nil, err end
453 464
454 return save_table(repo, "manifest", manifest) 465 update_dependencies(manifest, deps_mode)
466 return save_table(rocks_dir, "manifest", manifest)
467end
468
469--- Update manifest file for a local repository
470-- removing information about a version of a package.
471-- @param name string: Name of a package removed from the repository.
472-- @param version string: Version of a package removed from the repository.
473-- @param repo string or nil: Pathname of a local repository. If not given,
474-- the default local repository is used.
475-- @param deps_mode string: Dependency mode: "one" for the current default tree,
476-- "all" for all trees, "order" for all trees with priority >= the current default,
477-- "none" for using the default dependency mode from the configuration.
478-- @return boolean or (nil, string): True if manifest was updated successfully,
479-- or nil and an error message.
480function manif.remove_from_manifest(name, version, repo, deps_mode)
481 assert(type(name) == "string")
482 assert(type(version) == "string")
483 local rocks_dir = path.rocks_dir(repo or cfg.root_dir)
484 assert(type(deps_mode) == "string")
485
486 if deps_mode == "none" then deps_mode = cfg.deps_mode end
487
488 local manifest, err = manif_core.load_local_manifest(rocks_dir)
489 if not manifest then
490 util.printerr("No existing manifest. Attempting to rebuild...")
491 -- Manifest built by `manif.make_manifest` should already
492 -- include up-to-date information, no need to update it.
493 return manif.make_manifest(rocks_dir, deps_mode)
494 end
495
496 local package_entry = manifest.repository[name]
497
498 local version_entry = package_entry[version][1]
499 remove_package_items(manifest.modules, name, version, version_entry.modules)
500 remove_package_items(manifest.commands, name, version, version_entry.commands)
501
502 package_entry[version] = nil
503 manifest.dependencies[name][version] = nil
504
505 if not next(package_entry) then
506 -- No more versions of this package.
507 manifest.repository[name] = nil
508 manifest.dependencies[name] = nil
509 end
510
511 update_dependencies(manifest, deps_mode)
512 return save_table(rocks_dir, "manifest", manifest)
455end 513end
456 514
457function manif.zip_manifests() 515function manif.zip_manifests()
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)
312 return nil, err 312 return nil, err
313 end 313 end
314 314
315 return manif.update_manifest(name, version, nil, deps_mode) 315 return manif.add_to_manifest(name, version, nil, deps_mode)
316end 316end
317 317
318--- Delete a package from the local repository. 318--- Delete a package from the local repository.
@@ -398,7 +398,7 @@ function repos.delete_version(name, version, deps_mode, quick)
398 return true 398 return true
399 end 399 end
400 400
401 return manif.make_manifest(cfg.rocks_dir, deps_mode) 401 return manif.remove_from_manifest(name, version, nil, deps_mode)
402end 402end
403 403
404return repos 404return repos