130 lines
3.6 KiB
Lua
130 lines
3.6 KiB
Lua
local Revision = require("git.core.revision")
|
|
local h = require("test.git.helpers")
|
|
local t = require("test")
|
|
|
|
---@return integer[]
|
|
local function diff_wins()
|
|
local wins = {}
|
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
|
|
if vim.wo[win].diff then
|
|
table.insert(wins, win)
|
|
end
|
|
end
|
|
return wins
|
|
end
|
|
|
|
---@param role "left"|"right"
|
|
---@return integer
|
|
local function vertical_diff_win(role)
|
|
local wins = diff_wins()
|
|
table.sort(wins, function(a, b)
|
|
return vim.api.nvim_win_get_position(a)[2]
|
|
< vim.api.nvim_win_get_position(b)[2]
|
|
end)
|
|
local win = role == "left" and wins[1] or wins[#wins]
|
|
if not win then
|
|
error("diff window not found")
|
|
end
|
|
return win
|
|
end
|
|
|
|
---@param dir string
|
|
local function cleanup_dir_buffers(dir)
|
|
for _, buf in ipairs(vim.api.nvim_list_bufs()) do
|
|
local name = vim.api.nvim_buf_get_name(buf)
|
|
if name:find(dir, 1, true) then
|
|
pcall(vim.api.nvim_buf_delete, buf, { force = true })
|
|
end
|
|
end
|
|
end
|
|
|
|
t.test("open from worktree focuses the index pane", function()
|
|
local dir = h.make_repo({ ["a.txt"] = "old\n" })
|
|
t.write(dir, "a.txt", "new\n")
|
|
vim.cmd.edit(vim.fs.joinpath(dir, "a.txt"))
|
|
|
|
local current_buf = vim.api.nvim_get_current_buf()
|
|
require("git.diffsplit").open()
|
|
|
|
t.wait_for(function()
|
|
return #diff_wins() == 2
|
|
end, "diff windows to open")
|
|
|
|
t.eq(vim.api.nvim_get_current_win(), vertical_diff_win("left"))
|
|
t.truthy(
|
|
vim.api.nvim_get_current_buf() ~= current_buf,
|
|
"worktree buffer should lose focus"
|
|
)
|
|
end)
|
|
|
|
t.test("open from index focuses the worktree pane", function()
|
|
local dir = h.make_repo({ ["a.txt"] = "old\n" })
|
|
t.write(dir, "a.txt", "new\n")
|
|
local r = assert(require("git.core.repo").resolve(dir))
|
|
local index_buf = require("git.object").buf_for(
|
|
r,
|
|
Revision.new({ stage = 0, path = "a.txt" })
|
|
)
|
|
vim.api.nvim_set_current_buf(index_buf)
|
|
|
|
require("git.diffsplit").open({ layout = "vertical" })
|
|
|
|
t.wait_for(function()
|
|
return #diff_wins() == 2
|
|
end, "diff windows to open")
|
|
|
|
local right = vertical_diff_win("right")
|
|
t.eq(
|
|
vim.api.nvim_get_current_win(),
|
|
right,
|
|
"worktree buffer should be focused"
|
|
)
|
|
t.truthy(
|
|
vim.api.nvim_get_current_buf() ~= index_buf,
|
|
"index buffer should lose focus"
|
|
)
|
|
end)
|
|
|
|
t.test("open_pair keeps old on the left when splitright is set", function()
|
|
local dir = vim.fn.tempname()
|
|
vim.fn.mkdir(dir, "p")
|
|
t.defer(function()
|
|
cleanup_dir_buffers(dir)
|
|
vim.fn.delete(dir, "rf")
|
|
end)
|
|
|
|
local old = vim.fs.joinpath(dir, "old.txt")
|
|
local new = vim.fs.joinpath(dir, "new.txt")
|
|
vim.fn.writefile({ "old" }, old)
|
|
vim.fn.writefile({ "new" }, new)
|
|
|
|
local prev_splitright = vim.o.splitright
|
|
vim.o.splitright = true
|
|
t.defer(function()
|
|
vim.o.splitright = prev_splitright
|
|
end)
|
|
|
|
local old_buf = vim.fn.bufadd(old)
|
|
local new_buf = vim.fn.bufadd(new)
|
|
vim.fn.bufload(old_buf)
|
|
vim.fn.bufload(new_buf)
|
|
|
|
require("git.diffsplit").open_pair(old_buf, new_buf, {
|
|
layout = "vertical",
|
|
})
|
|
|
|
t.wait_for(function()
|
|
return #diff_wins() == 2
|
|
end, "diff windows to open")
|
|
|
|
local left = vertical_diff_win("left")
|
|
local right = vertical_diff_win("right")
|
|
t.eq(vim.api.nvim_win_get_buf(left), old_buf, "old pane should be left")
|
|
t.eq(vim.api.nvim_win_get_buf(right), new_buf, "new pane should be right")
|
|
t.eq(
|
|
vim.api.nvim_get_current_win(),
|
|
right,
|
|
"new pane should be focused by default"
|
|
)
|
|
end)
|