Diffview support (#56)

This MR adds support for diffview as a reviewer. I'll update the README and some other checks for Delta in a followup MR.
This commit is contained in:
mrparalon
2023-09-05 17:44:03 +04:00
committed by GitHub
parent ac2118ceb6
commit a2bd0749f0
2 changed files with 77 additions and 3 deletions

View File

@@ -0,0 +1,71 @@
-- This Module contains all of the code specific to the Delta reviewer.
local state = require("gitlab.state")
local u = require("gitlab.utils")
local M = {
bufnr = nil,
tabnr = nil
}
-- Public Functions
-- These functions are exposed externally and are used
-- when the reviewer is consumed by other code. They must follow the specification
-- outlined in the reviewer/init.lua file
M.open = function()
vim.api.nvim_command(string.format("DiffviewOpen %s", state.INFO.target_branch))
M.tabnr = vim.api.nvim_get_current_tabpage()
end
M.jump = function(file_name, new_line, old_line)
if M.tabnr == nil then
vim.notify("Can't jump to Diffvew. Is it open?", vim.log.levels.ERROR)
return
end
vim.api.nvim_set_current_tabpage(M.tabnr)
vim.cmd("DiffviewFocusFiles")
local view = require("diffview.lib").get_current_view()
if view == nil then
vim.notify("Could not find Diffview view", vim.log.levels.ERROR)
return
end
local files = view.panel:ordered_file_list()
local layout = view.cur_layout
for _, file in ipairs(files) do
if file.path == file_name then
view:set_file(file)
if new_line ~= nil then
layout.b:focus()
vim.api.nvim_win_set_cursor(0, { tonumber(new_line), 0 })
elseif old_line ~= nil then
layout.a:focus()
vim.api.nvim_win_set_cursor(0, { tonumber(old_line), 0 })
end
break
end
end
end
M.get_location = function()
if M.tabnr == nil then return nil, nil, "Diffview reviewer must be initialized first" end
local bufnr = vim.api.nvim_get_current_buf()
-- check if we are in the diffview tab
local tabnr = vim.api.nvim_get_current_tabpage()
if tabnr ~= M.tabnr then return nil, nil, "Line location can only be determined within reviewer window" end
-- check if we are in the diffview buffer
local view = require("diffview.lib").get_current_view()
local layout = view.cur_layout
local file_name = nil
local current_line_changes = nil
if layout.a.file.bufnr == bufnr then
file_name = layout.a.file.path
current_line_changes = { new_line = nil, old_line = vim.api.nvim_win_get_cursor(0)[1] }
return file_name, current_line_changes
elseif layout.b.file.bufnr == bufnr then
file_name = layout.b.file.path
current_line_changes = { new_line = vim.api.nvim_win_get_cursor(0)[1], old_line = nil }
return file_name, current_line_changes
end
return nil, nil, "Line location can only be determined within reviewer window"
end
return M

View File

@@ -2,13 +2,15 @@
-- settings and then map all of it's functions -- settings and then map all of it's functions
local state = require("gitlab.state") local state = require("gitlab.state")
local delta = require("gitlab.reviewer.delta") local delta = require("gitlab.reviewer.delta")
local diffview = require("gitlab.reviewer.diffview")
local M = { local M = {
reviewer = nil, reviewer = nil,
} }
local reviewer_map = { local reviewer_map = {
delta = delta delta = delta,
diffview = diffview
} }
M.init = function() M.init = function()
@@ -26,10 +28,11 @@ M.init = function()
-- Parameters: -- Parameters:
-- • {file_name} The name of the file to jump to -- • {file_name} The name of the file to jump to
-- • {new_line} The new_line of the change -- • {new_line} The new_line of the change
-- • {interval} The old_lien of the change -- • {interval} The old_line of the change
M.get_location = reviewer.get_location M.get_location = reviewer.get_location
-- Returns the current location (based on cursor) from the reviewer window -- Returns the current location (based on cursor) from the reviewer window in format:
-- file_name, {new_line, old_line}, error
end end