aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/luarocks/repos.lua95
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
281end 281end
282 282
283local function op_install(op) 283local 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
304end 329end
305 330
306local function rollback_install(op) 331local 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 })
335end 360end
336 361
337local function op_delete(op) 362local 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
346end 388end
347 389
348local function rollback_ops(ops, op_fn, n) 390local 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)