115 lines
2.6 KiB
Lua
115 lines
2.6 KiB
Lua
-- integration with git operations
|
|
local fs = require("oil.fs")
|
|
|
|
local M = {}
|
|
|
|
---@param path string
|
|
---@return string|nil
|
|
M.get_root = function(path)
|
|
local git_dir = vim.fs.find(".git", { upward = true, path = path })[1]
|
|
if git_dir then
|
|
return vim.fs.dirname(git_dir)
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
---@param path string
|
|
---@param cb fun(err: nil|string)
|
|
M.add = function(path, cb)
|
|
local root = M.get_root(path)
|
|
if not root then
|
|
return cb()
|
|
end
|
|
|
|
local stderr = ""
|
|
local jid = vim.fn.jobstart({ "git", "add", path }, {
|
|
cwd = root,
|
|
stderr_buffered = true,
|
|
on_stderr = function(_, data)
|
|
stderr = table.concat(data, "\n")
|
|
end,
|
|
on_exit = function(_, code)
|
|
if code ~= 0 then
|
|
cb("Error in git add: " .. stderr)
|
|
else
|
|
cb()
|
|
end
|
|
end,
|
|
})
|
|
if jid <= 0 then
|
|
cb()
|
|
end
|
|
end
|
|
|
|
---@param path string
|
|
---@param cb fun(err: nil|string)
|
|
M.rm = function(path, cb)
|
|
local root = M.get_root(path)
|
|
if not root then
|
|
return cb()
|
|
end
|
|
|
|
local stderr = ""
|
|
local jid = vim.fn.jobstart({ "git", "rm", "-r", path }, {
|
|
cwd = root,
|
|
stderr_buffered = true,
|
|
on_stderr = function(_, data)
|
|
stderr = table.concat(data, "\n")
|
|
end,
|
|
on_exit = function(_, code)
|
|
if code ~= 0 then
|
|
stderr = vim.trim(stderr)
|
|
if stderr:match("^fatal: pathspec '.*' did not match any files$") then
|
|
cb()
|
|
else
|
|
cb("Error in git rm: " .. stderr)
|
|
end
|
|
else
|
|
cb()
|
|
end
|
|
end,
|
|
})
|
|
if jid <= 0 then
|
|
cb()
|
|
end
|
|
end
|
|
|
|
---@param entry_type oil.EntryType
|
|
---@param src_path string
|
|
---@param dest_path string
|
|
---@param cb fun(err: nil|string)
|
|
M.mv = function(entry_type, src_path, dest_path, cb)
|
|
local src_git = M.get_root(src_path)
|
|
if not src_git or src_git ~= M.get_root(dest_path) then
|
|
fs.recursive_move(entry_type, src_path, dest_path, cb)
|
|
return
|
|
end
|
|
|
|
local stderr = ""
|
|
local jid = vim.fn.jobstart({ "git", "mv", src_path, dest_path }, {
|
|
cwd = src_git,
|
|
stderr_buffered = true,
|
|
on_stderr = function(_, data)
|
|
stderr = table.concat(data, "\n")
|
|
end,
|
|
on_exit = function(_, code)
|
|
if code ~= 0 then
|
|
stderr = vim.trim(stderr)
|
|
if stderr:match("^fatal: not under version control") then
|
|
fs.recursive_move(entry_type, src_path, dest_path, cb)
|
|
else
|
|
cb("Error in git mv: " .. stderr)
|
|
end
|
|
else
|
|
cb()
|
|
end
|
|
end,
|
|
})
|
|
if jid <= 0 then
|
|
-- Failed to run git, fall back to normal filesystem operations
|
|
fs.recursive_move(entry_type, src_path, dest_path, cb)
|
|
end
|
|
end
|
|
|
|
return M
|