From 4792e0341608dd49478e57e47d51d86586df0cb1 Mon Sep 17 00:00:00 2001 From: Harrison Cramer Date: Tue, 5 Sep 2023 10:22:19 -0400 Subject: [PATCH] Follow-up: Require Different Reviewers This plugin previously only supported the Delta reviewer. Thanks to work from @mrparalon it now supports Diffview also. This MR adjusts the requirements to account for this, and the README. It also addresses a small bug in the original implementation regarding an async file opening action, and applies formatting to the diffview file consistent with the rest of the project --- README.md | 10 +-- lua/gitlab/async.lua | 1 + lua/gitlab/init.lua | 1 + lua/gitlab/reviewer/diffview.lua | 118 +++++++++++++++++-------------- lua/gitlab/server.lua | 5 -- lua/gitlab/utils/init.lua | 15 +++- 6 files changed, 83 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index f1449d1..0201356 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,11 @@ https://github.com/harrisoncramer/gitlab.nvim/assets/32515581/ab5a8597-32fa-4a28 - Go >= v1.19 - make (for install) -- delta ## Quick Start -1. Install Go and Delta Dependencies +1. Install Go +2. Install reviewer: delta or diffview 2. Add configuration (see Installation section) 3. Checkout your feature branch: `git checkout feature-branch` 4. Open Neovim @@ -42,7 +42,7 @@ return { }, build = function () require("gitlab.server").build(true) end, -- Builds the Go binary config = function() - require("gitlab").setup() + require("gitlab").setup() -- Uses delta reviewer by default end, } ``` @@ -87,7 +87,7 @@ Here is the default setup function. All of these values are optional, and if you require("gitlab").setup({ port = 21036, -- The port of the Go server, which runs in the background log_path = vim.fn.stdpath("cache") .. "/gitlab.nvim.log", -- Log path for the Go server - reviewer = "delta", -- The reviewer type (only delta is currently supported) + reviewer = "delta", -- The reviewer type ("delta" or "diffview") popup = { -- The popup for comment creation, editing, and replying exit = "", perform_action = "s", -- Once in normal mode, does action (like saving comment or editing description, etc) @@ -108,7 +108,7 @@ require("gitlab").setup({ resolved = '✓', -- Symbol to show next to resolved discussions unresolved = '✖', -- Symbol to show next to unresolved discussions }, - review_pane = { -- Specific settings for different reviewers, only delta currently supported + review_pane = { -- Specific settings for different reviewers delta = { added_file = "", -- The symbol to show next to added files modified_file = "", -- The symbol to show next to modified files diff --git a/lua/gitlab/async.lua b/lua/gitlab/async.lua index 2239cd9..7186bb3 100644 --- a/lua/gitlab/async.lua +++ b/lua/gitlab/async.lua @@ -3,6 +3,7 @@ local server = require("gitlab.server") local job = require("gitlab.job") local state = require("gitlab.state") +local u = require("gitlab.utils") local M = {} diff --git a/lua/gitlab/init.lua b/lua/gitlab/init.lua index 4f52214..4344c5a 100644 --- a/lua/gitlab/init.lua +++ b/lua/gitlab/init.lua @@ -20,6 +20,7 @@ return { state.setPluginConfiguration() -- Sets configuration from `.gitlab.nvim` file state.merge_settings(args) -- Sets keymaps and other settings from setup function reviewer.init() -- Picks and initializes reviewer (default is Delta) + u.has_reviewer(args.reviewer or "delta") end, -- Global Actions 🌎 summary = async.sequence({ info }, summary.summary), diff --git a/lua/gitlab/reviewer/diffview.lua b/lua/gitlab/reviewer/diffview.lua index e1ec160..c50b3e3 100644 --- a/lua/gitlab/reviewer/diffview.lua +++ b/lua/gitlab/reviewer/diffview.lua @@ -1,71 +1,79 @@ --- This Module contains all of the code specific to the Delta reviewer. -local state = require("gitlab.state") -local u = require("gitlab.utils") +-- This Module contains all of the code specific to the Diffview reviewer. +local state = require("gitlab.state") +local async_ok, async = pcall(require, "diffview.async") -local M = { - bufnr = nil, - tabnr = nil +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() +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) +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 + if not async_ok then + vim.notify("Could not load Diffview async", vim.log.levels.ERROR) return + end + async.await(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 - 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 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" +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() + if view == nil then + vim.notify("Could not find Diffview view", vim.log.levels.ERROR) + return + end + 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/server.lua b/lua/gitlab/server.lua index cc255c3..6d10857 100644 --- a/lua/gitlab/server.lua +++ b/lua/gitlab/server.lua @@ -43,11 +43,6 @@ end -- Builds the Go binary M.build = function(override) - if not u.has_delta() then - vim.notify("Please install delta to use gitlab.nvim!", vim.log.levels.ERROR) - return - end - local file_path = u.current_file_path() local parent_dir = vim.fn.fnamemodify(file_path, ":h:h:h:h") state.settings.bin_path = parent_dir diff --git a/lua/gitlab/utils/init.lua b/lua/gitlab/utils/init.lua index 88f9082..ff6a49b 100644 --- a/lua/gitlab/utils/init.lua +++ b/lua/gitlab/utils/init.lua @@ -4,8 +4,19 @@ M.get_current_line_number = function() return vim.api.nvim_call_function('line', { '.' }) end -M.has_delta = function() - return vim.fn.executable("delta") == 1 +M.has_reviewer = function(reviewer) + local has_reviewer = false + if reviewer == "diffview" then + has_reviewer = vim.fn.exists(":DiffviewOpen") ~= 0 + else + has_reviewer = vim.fn.executable("delta") == 1 + end + + if not has_reviewer then + error(string.format("Please install %s or change your reviewer", reviewer)) + end + + return has_reviewer end M.P = function(...)