Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 29 additions & 1 deletion lua/gitsigns/actions/blame.lua
Original file line number Diff line number Diff line change
Expand Up @@ -328,30 +328,57 @@ local function pmap(mode, lhs, cb, opts)
end, opts)
end

local blame_bufname_prefix = 'gitsigns-blame:'

---@alias blme_bufname string the buffer name of the blame buffer
---@alias blm_win integer the win id of the blame window
---
---@type table<blme_bufname, blm_win>
local buf_name_to_blame_map = {}

local function is_blame_window_open_for_buffer(blm_bufname)
local blmwin = buf_name_to_blame_map[blm_bufname]
if blmwin then
api.nvim_win_close(blmwin, true)
return true
end
end

--- @async
function M.blame()
local __FUNC__ = 'blame'
local bufnr = api.nvim_get_current_buf()
local win = api.nvim_get_current_win()
local bcache = cache[bufnr]
if not bcache then
local current_bufname = vim.api.nvim_buf_get_name(bufnr)
if vim.startswith(current_bufname, blame_bufname_prefix) then
api.nvim_win_close(0, true)
end
log.dprint('Not attached')
return
end

bcache:get_blame()
local blame = assert(bcache.blame)

blm_bufname = (bcache:get_rev_bufname():gsub('^gitsigns:', blame_bufname_prefix))
if is_blame_window_open_for_buffer(blm_bufname) then
return
end

-- Save position to align 'scrollbind'
local top = vim.fn.line('w0') + vim.wo.scrolloff
local current = vim.fn.line('.')

vim.cmd.vsplit({ mods = { keepalt = true, split = 'aboveleft' } })
local blm_win = api.nvim_get_current_win()

buf_name_to_blame_map[blm_bufname] = blm_win

local blm_bufnr = api.nvim_create_buf(false, true)
api.nvim_win_set_buf(blm_win, blm_bufnr)
api.nvim_buf_set_name(blm_bufnr, (bcache:get_rev_bufname():gsub('^gitsigns:', 'gitsigns-blame:')))
api.nvim_buf_set_name(blm_bufnr, blm_bufname)

local revision = bcache.git_obj.revision

Expand Down Expand Up @@ -476,6 +503,7 @@ function M.blame()
if api.nvim_win_is_valid(win) then
cur_wlo.foldenable, cur_wlo.scrollbind, cur_wlo.wrap = unpack(cur_orig_wlo)
end
buf_name_to_blame_map[blm_bufname] = nil
end,
})

Expand Down
Loading