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