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
This commit is contained in:
Harrison Cramer
2023-09-05 10:22:19 -04:00
parent a2bd0749f0
commit 4792e03416
6 changed files with 83 additions and 67 deletions

View File

@@ -17,11 +17,11 @@ https://github.com/harrisoncramer/gitlab.nvim/assets/32515581/ab5a8597-32fa-4a28
- <a href="https://go.dev/">Go >= v1.19</a>
- <a href="https://www.gnu.org/software/make/manual/make.html">make (for install)</a>
- <a href="https://github.com/dandavison/delta">delta</a>
## Quick Start
1. Install Go and Delta Dependencies
1. Install Go
2. Install reviewer: <a href="https://github.com/dandavison/delta">delta</a> or <a href="https://github.com/sindrets/diffview.nvim">diffview</a>
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 = "<Esc>",
perform_action = "<leader>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

View File

@@ -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 = {}

View File

@@ -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),

View File

@@ -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

View File

@@ -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

View File

@@ -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(...)