diff --git a/lua/gitlab/reviewer/diffview.lua b/lua/gitlab/reviewer/diffview.lua new file mode 100644 index 0000000..e1ec160 --- /dev/null +++ b/lua/gitlab/reviewer/diffview.lua @@ -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 diff --git a/lua/gitlab/reviewer/init.lua b/lua/gitlab/reviewer/init.lua index c0ad3f6..f4c0932 100644 --- a/lua/gitlab/reviewer/init.lua +++ b/lua/gitlab/reviewer/init.lua @@ -2,13 +2,15 @@ -- settings and then map all of it's functions local state = require("gitlab.state") local delta = require("gitlab.reviewer.delta") +local diffview = require("gitlab.reviewer.diffview") local M = { reviewer = nil, } local reviewer_map = { - delta = delta + delta = delta, + diffview = diffview } M.init = function() @@ -26,10 +28,11 @@ M.init = function() -- Parameters: -- • {file_name} The name of the file to jump to -- • {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 - -- 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