diff options
| author | Hisham Muhammad <hisham@gobolinux.org> | 2019-11-11 18:46:57 -0300 |
|---|---|---|
| committer | Hisham Muhammad <hisham@gobolinux.org> | 2019-11-29 18:36:42 -0300 |
| commit | c00be6f54916528883fdf79b1ff99263b7a93fb5 (patch) | |
| tree | d6bb61404326fbc4394833e4fc9e26125dba3320 | |
| parent | d4990de9dcfead8cbef9aec79c0f088655595f11 (diff) | |
| download | luarocks-c00be6f54916528883fdf79b1ff99263b7a93fb5.tar.gz luarocks-c00be6f54916528883fdf79b1ff99263b7a93fb5.tar.bz2 luarocks-c00be6f54916528883fdf79b1ff99263b7a93fb5.zip | |
repos: speed up file installs and deletes
| -rw-r--r-- | src/luarocks/repos.lua | 95 |
1 files changed, 71 insertions, 24 deletions
diff --git a/src/luarocks/repos.lua b/src/luarocks/repos.lua index 2b0d3fcb..e9dddc7c 100644 --- a/src/luarocks/repos.lua +++ b/src/luarocks/repos.lua | |||
| @@ -280,27 +280,52 @@ local function backup_existing(should_backup, target) | |||
| 280 | end | 280 | end |
| 281 | end | 281 | end |
| 282 | 282 | ||
| 283 | local function op_install(op) | 283 | local function prepare_op_install() |
| 284 | local ok, err = fs.make_dir(dir.dir_name(op.dst)) | 284 | local mkdirs = {} |
| 285 | if not ok then | 285 | local rmdirs = {} |
| 286 | return nil, err | ||
| 287 | end | ||
| 288 | 286 | ||
| 289 | local backup, err = backup_existing(op.backup, op.realdst or op.dst) | 287 | local function memoize_mkdir(d) |
| 290 | if err then | 288 | if mkdirs[d] then |
| 291 | return nil, err | 289 | return true |
| 292 | end | 290 | end |
| 293 | if backup then | 291 | local ok, err = fs.make_dir(d) |
| 294 | op.backup_file = backup | 292 | if not ok then |
| 293 | return nil, err | ||
| 294 | end | ||
| 295 | mkdirs[d] = true | ||
| 296 | return true | ||
| 295 | end | 297 | end |
| 296 | 298 | ||
| 297 | ok, err = op.fn(op.src, op.dst, op.backup) | 299 | local function op_install(op) |
| 298 | if not ok then | 300 | local ok, err = memoize_mkdir(dir.dir_name(op.dst)) |
| 299 | return nil, err | 301 | if not ok then |
| 302 | return nil, err | ||
| 303 | end | ||
| 304 | |||
| 305 | local backup, err = backup_existing(op.backup, op.realdst or op.dst) | ||
| 306 | if err then | ||
| 307 | return nil, err | ||
| 308 | end | ||
| 309 | if backup then | ||
| 310 | op.backup_file = backup | ||
| 311 | end | ||
| 312 | |||
| 313 | ok, err = op.fn(op.src, op.dst, op.backup) | ||
| 314 | if not ok then | ||
| 315 | return nil, err | ||
| 316 | end | ||
| 317 | |||
| 318 | rmdirs[dir.dir_name(op.src)] = true | ||
| 319 | return true | ||
| 300 | end | 320 | end |
| 301 | 321 | ||
| 302 | fs.remove_dir_tree_if_empty(dir.dir_name(op.src)) | 322 | local function done_op_install() |
| 303 | return true | 323 | for d, _ in pairs(rmdirs) do |
| 324 | fs.remove_dir_tree_if_empty(d) | ||
| 325 | end | ||
| 326 | end | ||
| 327 | |||
| 328 | return op_install, done_op_install | ||
| 304 | end | 329 | end |
| 305 | 330 | ||
| 306 | local function rollback_install(op) | 331 | local function rollback_install(op) |
| @@ -334,15 +359,32 @@ local function rollback_rename(op) | |||
| 334 | return op_rename({ src = op.dst, dst = op.src }) | 359 | return op_rename({ src = op.dst, dst = op.src }) |
| 335 | end | 360 | end |
| 336 | 361 | ||
| 337 | local function op_delete(op) | 362 | local function prepare_op_delete() |
| 338 | if op.suffix then | 363 | local deletes = {} |
| 339 | local suffix = check_suffix(op.name, op.suffix) | 364 | local rmdirs = {} |
| 340 | op.name = op.name .. suffix | 365 | |
| 366 | local function done_op_delete() | ||
| 367 | for _, f in ipairs(deletes) do | ||
| 368 | os.remove(f) | ||
| 369 | end | ||
| 370 | |||
| 371 | for d, _ in pairs(rmdirs) do | ||
| 372 | fs.remove_dir_tree_if_empty(d) | ||
| 373 | end | ||
| 341 | end | 374 | end |
| 342 | 375 | ||
| 343 | local ok, err = fs.delete(op.name) | 376 | local function op_delete(op) |
| 344 | fs.remove_dir_tree_if_empty(dir.dir_name(op.name)) | 377 | if op.suffix then |
| 345 | return ok, err | 378 | local suffix = check_suffix(op.name, op.suffix) |
| 379 | op.name = op.name .. suffix | ||
| 380 | end | ||
| 381 | |||
| 382 | table.insert(deletes, op.name) | ||
| 383 | |||
| 384 | rmdirs[dir.dir_name(op.name)] = true | ||
| 385 | end | ||
| 386 | |||
| 387 | return op_delete, done_op_delete | ||
| 346 | end | 388 | end |
| 347 | 389 | ||
| 348 | local function rollback_ops(ops, op_fn, n) | 390 | local function rollback_ops(ops, op_fn, n) |
| @@ -451,6 +493,7 @@ function repos.deploy_files(name, version, wrap_bin_scripts, deps_mode) | |||
| 451 | return nil, err | 493 | return nil, err |
| 452 | end | 494 | end |
| 453 | end | 495 | end |
| 496 | local op_install, done_op_install = prepare_op_install() | ||
| 454 | for i, op in ipairs(installs) do | 497 | for i, op in ipairs(installs) do |
| 455 | local ok, err = op_install(op) | 498 | local ok, err = op_install(op) |
| 456 | if not ok then | 499 | if not ok then |
| @@ -459,6 +502,7 @@ function repos.deploy_files(name, version, wrap_bin_scripts, deps_mode) | |||
| 459 | return nil, err | 502 | return nil, err |
| 460 | end | 503 | end |
| 461 | end | 504 | end |
| 505 | done_op_install() | ||
| 462 | 506 | ||
| 463 | local writer = require("luarocks.manif.writer") | 507 | local writer = require("luarocks.manif.writer") |
| 464 | return writer.add_to_manifest(name, version, nil, deps_mode) | 508 | return writer.add_to_manifest(name, version, nil, deps_mode) |
| @@ -544,9 +588,12 @@ function repos.delete_version(name, version, deps_mode, quick) | |||
| 544 | end) | 588 | end) |
| 545 | end | 589 | end |
| 546 | 590 | ||
| 591 | local op_delete, done_op_delete = prepare_op_delete() | ||
| 547 | for _, op in ipairs(deletes) do | 592 | for _, op in ipairs(deletes) do |
| 548 | op_delete(op) | 593 | op_delete(op) |
| 549 | end | 594 | end |
| 595 | done_op_delete() | ||
| 596 | |||
| 550 | if not quick then | 597 | if not quick then |
| 551 | for _, op in ipairs(renames) do | 598 | for _, op in ipairs(renames) do |
| 552 | op_rename(op) | 599 | op_rename(op) |
