Problem: the codebase still used the upstream \`oil\` naming everywhere — URL schemes, the \`:Oil\` command, highlight groups, user events, module paths, filetypes, buffer/window variables, LuaCATS type annotations, vimdoc help tags, syntax groups, and internal identifiers. Solution: mechanical rename of every reference. URL schemes now use \`canola://\` (plus \`canola-ssh://\`, \`canola-s3://\`, \`canola-sss://\`, \`canola-trash://\`, \`canola-test://\`). The \`:Canola\` command replaces \`:Oil\`. All highlight groups, user events, augroups, namespaces, filetypes, require paths, type annotations, help tags, and identifiers follow suit. The \`upstream\` remote to \`stevearc/oil.nvim\` has been removed and the \`vim.g.oil\` deprecation shim dropped.
118 lines
2.7 KiB
Lua
118 lines
2.7 KiB
Lua
-- integration with git operations
|
|
local fs = require('canola.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 canola.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')
|
|
or stderr:match('^fatal: source directory is empty')
|
|
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
|