79 lines
2.2 KiB
Lua
79 lines
2.2 KiB
Lua
local h = require('dep.helpers')
|
|
local logger = require('dep.log')
|
|
|
|
local fs = {}
|
|
|
|
--- abstract away fs:link to make calling more intuitive
|
|
---@param package package package to update
|
|
---@param cb function callback on success
|
|
function fs:sync(package, cb)
|
|
if not package.exists then
|
|
fs:link(package, cb)
|
|
end
|
|
end
|
|
|
|
--- create a symlink to a local package
|
|
---@param package package package to link
|
|
---@param cb function callback on success
|
|
function fs:link(package, cb)
|
|
h.uv.fs_symlink(package.path, package.dir, nil, function(err, _)
|
|
if err then
|
|
logger:log("error", "failed to symlink %s; reason: %s", package.id, err)
|
|
else
|
|
cb(err)
|
|
end
|
|
end)
|
|
end
|
|
|
|
--- clean out old packages
|
|
---@param package package any package
|
|
function fs:clean(package)
|
|
h.uv.fs_scandir(
|
|
package.get_base_dir(),
|
|
vim.schedule_wrap(function(err, handle)
|
|
if err then
|
|
logger:log("error", "failed to clean; reason: %s", err)
|
|
else
|
|
local queue = {}
|
|
|
|
while handle do
|
|
local name = h.uv.fs_scandir_next(handle)
|
|
if name and name ~= package.get_root().name then
|
|
queue[name] = package.get_base_dir().."/"..name
|
|
elseif name == package.get_root().name then
|
|
-- we need to ensure that there is no chance of nuking dep
|
|
goto continue
|
|
elseif name == nil then
|
|
break
|
|
else
|
|
-- if there's a single error bail out
|
|
logger:log("error", "failed to run clean uv.fs_scandir_next failed")
|
|
return
|
|
end
|
|
::continue::
|
|
end
|
|
|
|
-- keep packages that still exist
|
|
for _, pkg in pairs(package.get_packages()) do
|
|
queue[pkg.name] = nil
|
|
end
|
|
|
|
-- start deleting all of the packages which are chosen for deletion
|
|
for name, dir in pairs(queue) do
|
|
local co = coroutine.create(function()
|
|
local ok = vim.fn.delete(dir, "rf")
|
|
if ok then
|
|
logger:log("clean", "deleted %s", name)
|
|
else
|
|
logger:log("error", "failed to delete %s", name)
|
|
end
|
|
end)
|
|
coroutine.resume(co)
|
|
end
|
|
end
|
|
end)
|
|
)
|
|
end
|
|
|
|
return fs
|