Skip to content

Commit 18f8330

Browse files
zegervdvsindrets
andauthored
refactor: move show log command to VCSAdapter (#276)
* feat(vcs): Added a `to_range()` method to the Rev class. Co-authored-by: Sindre T. Strøm <sindrets@gmail.com>
1 parent 3812e29 commit 18f8330

File tree

9 files changed

+64
-25
lines changed

9 files changed

+64
-25
lines changed

lua/diffview/scene/views/diff/diff_view.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ end
120120
function DiffView:post_open()
121121
vim.cmd("redraw")
122122

123-
self.commit_log_panel = CommitLogPanel(self.adapter.ctx.toplevel, {
123+
self.commit_log_panel = CommitLogPanel(self.adapter, {
124124
name = ("diffview://%s/log/%d/%s"):format(self.adapter.ctx.dir, self.tabpage, "commit_log"),
125125
})
126126

lua/diffview/scene/views/diff/listeners.lua

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,18 +101,14 @@ return function(view)
101101
end
102102
end,
103103
open_commit_log = function()
104-
if (view.left.type == RevType.STAGE and view.right.type == RevType.LOCAL)
105-
or (
106-
view.left.type == RevType.COMMIT
107-
and vim.tbl_contains({ RevType.STAGE, RevType.LOCAL }, view.right.type)
108-
and view.left:is_head(view.adapter)
109-
) then
104+
local range = view.adapter.Rev.to_range(view.left, view.right)
105+
106+
if not range or view.left:is_head(view.adapter) then
110107
utils.info("Changes not commited yet. No log available for these changes.")
111108
return
112109
end
113110

114-
local rev_arg = ("%s..%s"):format(view.left.commit, view.right.commit or "HEAD")
115-
view.commit_log_panel:update(rev_arg)
111+
view.commit_log_panel:update(range)
116112
end,
117113
toggle_stage_entry = function()
118114
if not (view.left.type == RevType.STAGE and view.right.type == RevType.LOCAL) then

lua/diffview/scene/views/file_history/file_history_view.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function FileHistoryView:init(opt)
3838
end
3939

4040
function FileHistoryView:post_open()
41-
self.commit_log_panel = CommitLogPanel(self.adapter.ctx.toplevel, {
41+
self.commit_log_panel = CommitLogPanel(self.adapter, {
4242
name = ("diffview://%s/log/%d/%s"):format(self.adapter.ctx.dir, self.tabpage, "commit_log"),
4343
})
4444

lua/diffview/scene/views/file_history/listeners.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ return function(view)
138138
if file then
139139
local entry = view.panel:find_entry(file)
140140
if entry then
141-
view.commit_log_panel:update(entry.commit.hash .. "^!")
141+
view.commit_log_panel:update(view.adapter.Rev.to_range(entry.commit.hash))
142142
end
143143
end
144144
end,

lua/diffview/ui/panels/commit_log_panel.lua

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ local utils = require("diffview.utils")
88
local M = {}
99

1010
---@class CommitLogPanel : Panel
11-
---@field git_toplevel string
11+
---@field adapter VCSAdapter
1212
---@field args string[]
1313
---@field job_out string[]
1414
local CommitLogPanel = oop.create_class("CommitLogPanel", Panel)
@@ -47,15 +47,15 @@ end
4747
---@field args string[]
4848
---@field name string
4949

50-
---@param git_toplevel string
50+
---@param adapter VCSAdapter
5151
---@param opt CommitLogPanelSpec
52-
function CommitLogPanel:init(git_toplevel, opt)
52+
function CommitLogPanel:init(adapter, opt)
5353
CommitLogPanel:super().init(self, {
5454
bufname = opt.name,
5555
config = opt.config or get_user_config().commit_log_panel.win_config,
5656
})
5757

58-
self.git_toplevel = git_toplevel
58+
self.adapter = adapter
5959
self.args = opt.args or { "-n256" }
6060

6161
self:on_autocmd("BufWinEnter" , {
@@ -73,14 +73,9 @@ CommitLogPanel.update = async.void(function(self, args)
7373
end
7474

7575
Job:new({
76-
command = "git",
77-
args = utils.vec_join(
78-
"log",
79-
"--first-parent",
80-
"--stat",
81-
args or self.args
82-
),
83-
cwd = self.git_toplevel,
76+
command = self.adapter:bin(),
77+
args = self.adapter:get_log_args(args or self.args),
78+
cwd = self.adapter.ctx.toplevel,
8479
on_exit = vim.schedule_wrap(function(job)
8580
if job.code ~= 0 then
8681
utils.err("Failed to open log!")

lua/diffview/vcs/adapter.lua

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,12 @@ function VCSAdapter:get_show_args(path, rev)
173173
oop.abstract_stub()
174174
end
175175

176+
---@param args string[]
177+
---@return string[] args to show commit log message
178+
function VCSAdapter:get_log_args(args)
179+
oop.abstract_stub()
180+
end
181+
176182
---@param range? { [1]: integer, [2]: integer }
177183
---@param paths string[]
178184
---@param args string[]

lua/diffview/vcs/adapters/git/init.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,10 @@ function GitAdapter:get_show_args(path, rev)
230230
return utils.vec_join(self:args(), "show", ("%s:%s"):format(rev and rev:object_name() or "", path))
231231
end
232232

233+
function GitAdapter:get_log_args(args)
234+
return utils.vec_join("log", "--first-parent", "--stat", args)
235+
end
236+
233237
function GitAdapter:get_dir(path)
234238
local out, code = self:exec_sync({ "rev-parse", "--path-format=absolute", "--git-dir" }, path)
235239
if code ~= 0 then

lua/diffview/vcs/adapters/git/rev.lua

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,35 @@ function GitRev:init(rev_type, revision, track_head)
4949
end
5050
end
5151

52+
---@param rev_from GitRev|string
53+
---@param rev_to? GitRev|string
54+
---@return string?
55+
function GitRev.to_range(rev_from, rev_to)
56+
if type(rev_from) ~= "string" and rev_from.type ~= RevType.COMMIT then
57+
-- The range between either LOCAL or STAGE, and any other rev, will always
58+
-- be empty.
59+
return nil
60+
end
61+
62+
local name_from = type(rev_from) == "string" and rev_from or rev_from:object_name()
63+
local name_to
64+
65+
if rev_to then
66+
if type(rev_to) == "string" then
67+
name_to = rev_to
68+
else
69+
-- If the rev is either of type LOCAL or STAGE, just fall back to HEAD.
70+
name_to = rev_to.type == RevType.COMMIT and rev_to:object_name() or "HEAD"
71+
end
72+
end
73+
74+
if not name_to then
75+
return name_from .. "^!"
76+
else
77+
return name_from .. ".." .. name_to
78+
end
79+
end
80+
5281
---@param name string
5382
---@param adapter GitAdapter
5483
---@return Rev?
@@ -85,8 +114,8 @@ end
85114
---Determine if this rev is currently the head.
86115
---@param adapter GitAdapter
87116
---@return boolean?
88-
function Rev:is_head(adapter)
89-
if not self.type == RevType.COMMIT then
117+
function GitRev:is_head(adapter)
118+
if self.type ~= RevType.COMMIT then
90119
return false
91120
end
92121

lua/diffview/vcs/rev.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ end
6666

6767
---@diagnostic disable: unused-local, missing-return
6868

69+
---Get the argument describing the range between the two given revs. If a
70+
---single rev is given, the returned argument describes the *range* of the
71+
---single commit pointed to by that rev.
72+
---@abstract
73+
---@param rev_from Rev|string
74+
---@param rev_to? Rev|string
75+
---@return string?
76+
function Rev.to_range(rev_from, rev_to) oop.abstract_stub() end
77+
6978
---@param name string
7079
---@param adapter? VCSAdapter
7180
---@return Rev?

0 commit comments

Comments
 (0)