Bug Fixes (#470)

* fix: Restore buffer local settings outside reviewer (#446)
* fix: do not show healthcheck alert for warnings (#468)
* feat: Add MR URL to the summary details (#467)
* fix: make cycling reviewed files faster (#474)
* feat(pipeline): display trigger jobs for a pipeline in the pipelines popup  (#465)
* fix: Jumping to renamed files (#484)

---------

Co-authored-by: Jakub F. Bortlík <jakub.bortlik@proton.me>
Co-authored-by: Ashish Alex <ashish.alex10@gmail.com>
This commit is contained in:
Harrison (Harry) Cramer
2025-03-01 13:28:02 -05:00
committed by GitHub
parent 3b396a5e6b
commit 9f898aa1a8
23 changed files with 524 additions and 359 deletions

View File

@@ -1,6 +1,5 @@
local u = require("gitlab.utils")
local state = require("gitlab.state")
local reviewer = require("gitlab.reviewer")
local List = require("gitlab.utils.list")
local M = {}
@@ -11,24 +10,24 @@ local M = {}
---@field resolved boolean|nil
---@field created_at string|nil
---Return true if discussion has a placeable diagnostic, false otherwise.
---@param note NoteWithValues
---@param file string
---@return boolean
local filter_discussions_and_notes = function(note, file)
local filter_discussions_and_notes = function(note)
---Do not include unlinked notes
return note.position ~= nil
and (note.position.new_path == file or note.position.old_path == file)
---Skip resolved discussions if user wants to
and not (state.settings.discussion_signs.skip_resolved_discussion and note.resolvable and note.resolved)
---Skip discussions from old revisions
and not (
state.settings.discussion_signs.skip_old_revision_discussion
and note.created_at ~= nil
and u.from_iso_format_date_to_timestamp(note.created_at)
<= u.from_iso_format_date_to_timestamp(state.MR_REVISIONS[1].created_at)
)
end
---Filter all discussions which are relevant for currently visible signs and diagnostics.
---Filter all discussions and drafts which have placeable signs and diagnostics.
---@return Discussion|DraftNote[]
M.filter_placeable_discussions = function()
local discussions = u.ensure_table(state.DISCUSSION_DATA and state.DISCUSSION_DATA.discussions or {})
@@ -41,18 +40,13 @@ M.filter_placeable_discussions = function()
draft_notes = {}
end
local file = reviewer.get_current_file_path()
if not file then
return {}
end
local filtered_discussions = List.new(discussions):filter(function(discussion)
local first_note = discussion.notes[1]
return type(first_note.position) == "table" and filter_discussions_and_notes(first_note, file)
return type(first_note.position) == "table" and filter_discussions_and_notes(first_note)
end)
local filtered_draft_notes = List.new(draft_notes):filter(function(note)
return filter_discussions_and_notes(note, file)
return filter_discussions_and_notes(note)
end)
return u.join(filtered_discussions, filtered_draft_notes)

View File

@@ -85,47 +85,62 @@ local create_multiline_diagnostic = function(d_or_n)
}, d_or_n)
end
---Set diagnostics in currently new SHA.
---Set diagnostics in the given buffer.
---@param namespace number namespace for diagnostics
---@param bufnr number the bufnr for placing the diagnostics
---@param diagnostics table see :h vim.diagnostic.set
---@param opts table? see :h vim.diagnostic.set
local set_diagnostics_in_new_sha = function(namespace, diagnostics, opts)
local view = diffview_lib.get_current_view()
if not view then
return
end
vim.diagnostic.set(namespace, view.cur_layout.b.file.bufnr, diagnostics, opts)
require("gitlab.indicators.signs").set_signs(diagnostics, view.cur_layout.b.file.bufnr)
local set_diagnostics = function(namespace, bufnr, diagnostics, opts)
vim.diagnostic.set(namespace, bufnr, diagnostics, opts)
require("gitlab.indicators.signs").set_signs(diagnostics, bufnr)
end
---Set diagnostics in old SHA.
---@param namespace number namespace for diagnostics
---@param diagnostics table see :h vim.diagnostic.set
---@param opts table? see :h vim.diagnostic.set
local set_diagnostics_in_old_sha = function(namespace, diagnostics, opts)
local view = diffview_lib.get_current_view()
if not view then
return
end
vim.diagnostic.set(namespace, view.cur_layout.a.file.bufnr, diagnostics, opts)
require("gitlab.indicators.signs").set_signs(diagnostics, view.cur_layout.a.file.bufnr)
end
---Refresh the diagnostics for the currently reviewed file
---Refresh the diagnostics for all the reviewed files, and place diagnostics for the currently
---visible buffers.
M.refresh_diagnostics = function()
require("gitlab.indicators.signs").clear_signs()
M.clear_diagnostics()
M.placeable_discussions = indicators_common.filter_placeable_discussions()
local view = diffview_lib.get_current_view()
if view == nil then
u.notify("Could not find Diffview view", vim.log.levels.ERROR)
return
end
M.place_diagnostics(view.cur_layout.a.file.bufnr)
M.place_diagnostics(view.cur_layout.b.file.bufnr)
end
---Filter and place the diagnostics for the given buffer.
---@param bufnr number The number of the buffer for placing diagnostics.
M.place_diagnostics = function(bufnr)
if not state.settings.discussion_signs.enabled then
return
end
local view = diffview_lib.get_current_view()
if view == nil then
u.notify("Could not find Diffview view", vim.log.levels.ERROR)
return
end
local ok, err = pcall(function()
require("gitlab.indicators.signs").clear_signs()
M.clear_diagnostics()
local filtered_discussions = indicators_common.filter_placeable_discussions()
if filtered_discussions == nil then
local file_discussions = List.new(M.placeable_discussions):filter(function(discussion_or_note)
local note = discussion_or_note.notes and discussion_or_note.notes[1] or discussion_or_note
return note.position.new_path == view.cur_layout.b.file.path
or note.position.old_path == view.cur_layout.a.file.path
end)
if #file_discussions == 0 then
return
end
local new_diagnostics = M.parse_new_diagnostics(filtered_discussions)
set_diagnostics_in_new_sha(diagnostics_namespace, new_diagnostics, create_display_opts())
local new_diagnostics, old_diagnostics = List.new(file_discussions):partition(indicators_common.is_new_sha)
local old_diagnostics = M.parse_old_diagnostics(filtered_discussions)
set_diagnostics_in_old_sha(diagnostics_namespace, old_diagnostics, create_display_opts())
if bufnr == view.cur_layout.a.file.bufnr then
set_diagnostics(diagnostics_namespace, bufnr, M.parse_diagnostics(old_diagnostics), create_display_opts())
elseif bufnr == view.cur_layout.b.file.bufnr then
set_diagnostics(diagnostics_namespace, bufnr, M.parse_diagnostics(new_diagnostics), create_display_opts())
end
end)
if not ok then
@@ -134,24 +149,13 @@ M.refresh_diagnostics = function()
end
---Iterates over each discussion and returns a list of tables with sign
---data, for instance group, priority, line number etc for the new SHA
---@param discussions Discussion[]
---data, for instance group, priority, line number etc
---@param discussions List
---@return DiagnosticTable[]
M.parse_new_diagnostics = function(discussions)
local new_diagnostics = List.new(discussions):filter(indicators_common.is_new_sha)
local single_line = new_diagnostics:filter(indicators_common.is_single_line):map(create_single_line_diagnostic)
local multi_line = new_diagnostics:filter(indicators_common.is_multi_line):map(create_multiline_diagnostic)
return u.combine(single_line, multi_line)
end
---Iterates over each discussion and returns a list of tables with sign
---data, for instance group, priority, line number etc for the old SHA
---@param discussions Discussion[]
---@return DiagnosticTable[]
M.parse_old_diagnostics = function(discussions)
local old_diagnostics = List.new(discussions):filter(indicators_common.is_old_sha)
local single_line = old_diagnostics:filter(indicators_common.is_single_line):map(create_single_line_diagnostic)
local multi_line = old_diagnostics:filter(indicators_common.is_multi_line):map(create_multiline_diagnostic)
M.parse_diagnostics = function(discussions)
local single_line, multi_line = discussions:partition(indicators_common.is_single_line)
single_line = single_line:map(create_single_line_diagnostic)
multi_line = multi_line:map(create_multiline_diagnostic)
return u.combine(single_line, multi_line)
end