refactor(git): rewrite diff module around :diffsplit
This commit is contained in:
+29
-16
@@ -176,9 +176,13 @@ local function current_entry(bufnr)
|
||||
return s, s.lines[lnum]
|
||||
end
|
||||
|
||||
---@class ow.Git.StatusView.Pane
|
||||
---@field buf integer
|
||||
---@field name string?
|
||||
|
||||
---@param r ow.Git.Repo
|
||||
---@param path string
|
||||
---@return ow.Git.Diff.Side
|
||||
---@return ow.Git.StatusView.Pane
|
||||
local function head_pane(r, path)
|
||||
local rev = Revision.new({ base = "HEAD", path = path })
|
||||
return {
|
||||
@@ -189,7 +193,7 @@ end
|
||||
|
||||
---@param r ow.Git.Repo
|
||||
---@param path string
|
||||
---@return ow.Git.Diff.Side
|
||||
---@return ow.Git.StatusView.Pane
|
||||
local function worktree_pane(r, path)
|
||||
local buf = vim.fn.bufadd(vim.fs.joinpath(r.worktree, path))
|
||||
vim.fn.bufload(buf)
|
||||
@@ -198,7 +202,7 @@ end
|
||||
|
||||
---@param s ow.Git.StatusView.State
|
||||
---@param path string
|
||||
---@return ow.Git.Diff.Side
|
||||
---@return ow.Git.StatusView.Pane
|
||||
local function index_pane(s, path)
|
||||
local rev = Revision.new({ stage = 0, path = path })
|
||||
return {
|
||||
@@ -209,7 +213,7 @@ end
|
||||
|
||||
---@param s ow.Git.StatusView.State
|
||||
---@param row ow.Git.Status.Row
|
||||
---@return ow.Git.Diff.Side?
|
||||
---@return ow.Git.StatusView.Pane?
|
||||
local function older_pane(s, row)
|
||||
local entry = row.entry
|
||||
if row.section == "staged" then
|
||||
@@ -227,7 +231,7 @@ end
|
||||
|
||||
---@param s ow.Git.StatusView.State
|
||||
---@param row ow.Git.Status.Row
|
||||
---@return ow.Git.Diff.Side?
|
||||
---@return ow.Git.StatusView.Pane?
|
||||
local function newer_pane(s, row)
|
||||
local entry = row.entry
|
||||
if row.section == "staged" then
|
||||
@@ -316,8 +320,7 @@ local function view_row(s, row, focus_left)
|
||||
|
||||
if s.placement ~= "sidebar" then
|
||||
local pane = right or left
|
||||
---@cast pane ow.Git.Diff.Side
|
||||
diff.set_diff(status_win, false)
|
||||
---@cast pane -nil
|
||||
vim.cmd.normal({ "m'", bang = true })
|
||||
vim.api.nvim_win_set_buf(status_win, pane.buf)
|
||||
if pane.name then
|
||||
@@ -332,11 +335,13 @@ local function view_row(s, row, focus_left)
|
||||
end
|
||||
close_other_diff_wins(status_win, target)
|
||||
vim.api.nvim_win_set_width(status_win, WINDOW_WIDTH)
|
||||
diff.set_diff(target, false)
|
||||
vim.api.nvim_win_call(target, function()
|
||||
vim.cmd.diffoff()
|
||||
end)
|
||||
|
||||
if not (left and right) then
|
||||
local side = right or left
|
||||
---@cast side ow.Git.Diff.Side
|
||||
---@cast side ow.Git.StatusView.Pane
|
||||
vim.api.nvim_win_set_buf(target, side.buf)
|
||||
if side.name then
|
||||
util.set_buf_name(side.buf, side.name)
|
||||
@@ -344,15 +349,23 @@ local function view_row(s, row, focus_left)
|
||||
vim.api.nvim_set_current_win(focus_left and target or status_win)
|
||||
return
|
||||
end
|
||||
---@cast left ow.Git.Diff.Side
|
||||
---@cast right ow.Git.Diff.Side
|
||||
---@cast left ow.Git.StatusView.Pane
|
||||
---@cast right ow.Git.StatusView.Pane
|
||||
|
||||
local left_win = vsplit_at(target, "left")
|
||||
local combined = vim.api.nvim_win_get_width(left_win)
|
||||
+ vim.api.nvim_win_get_width(target)
|
||||
vim.api.nvim_win_set_width(left_win, math.floor(combined / 2))
|
||||
vim.api.nvim_win_set_buf(target, right.buf)
|
||||
if right.name then
|
||||
util.set_buf_name(right.buf, right.name)
|
||||
end
|
||||
|
||||
diff.update_pair(left_win, target, { left = left, right = right })
|
||||
local older = left.name or vim.api.nvim_buf_get_name(left.buf)
|
||||
local left_win
|
||||
vim.api.nvim_win_call(target, function()
|
||||
diff.split({
|
||||
target = older,
|
||||
mods = { vertical = true },
|
||||
})
|
||||
left_win = vim.api.nvim_get_current_win()
|
||||
end)
|
||||
vim.api.nvim_set_current_win(focus_left and left_win or status_win)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user