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) |