Skip to content

Commit 3543c60

Browse files
committed
feature: Add support for handling non-consecutive commit selections
1 parent 6a60fdf commit 3543c60

4 files changed

Lines changed: 66 additions & 20 deletions

File tree

lua/gitlogdiff/actions.lua

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,41 @@ local M = {}
22

33
local function diffview_open(args)
44
vim.cmd("DiffviewOpen " .. table.concat(args, " "))
5-
-- vim.cmd("CodeDiff " .. table.concat(args, " "))
65
end
76

8-
function M.show_selected(hashes)
7+
local function diffview_history(args)
8+
vim.cmd("DiffviewFileHistory " .. table.concat(args, " "))
9+
end
10+
11+
function M.show_selected(hashes, indices)
912
if #hashes == 0 then
1013
vim.notify("No commits selected", vim.log.levels.INFO)
1114
return
1215
end
1316

14-
local ordered = {}
15-
for i = #hashes, 1, -1 do
16-
table.insert(ordered, hashes[i])
17+
local is_consecutive = true
18+
if #indices > 1 then
19+
for i = 2, #indices do
20+
if indices[i] ~= indices[i - 1] + 1 then
21+
is_consecutive = false
22+
break
23+
end
24+
end
1725
end
1826

19-
if #ordered == 1 then
20-
diffview_open({ ordered[1] .. "^.." .. ordered[1] })
21-
return
27+
if is_consecutive then
28+
if #hashes == 1 then
29+
diffview_open({ hashes[1] .. "^.." .. hashes[1] })
30+
else
31+
diffview_open({ hashes[#hashes] .. "^.." .. hashes[1] })
32+
end
33+
else
34+
local args = { "--no-walk" }
35+
for _, h in ipairs(hashes) do
36+
table.insert(args, h)
37+
end
38+
diffview_history(args)
2239
end
23-
24-
diffview_open({ ordered[1] .. ".." .. ordered[#ordered] })
2540
end
2641

2742
return M

lua/gitlogdiff/ui.lua

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,23 @@ function M.toggle()
6767
M.render()
6868
end
6969

70-
function M.get_selected_hashes()
71-
local hashes = {}
70+
function M.get_selected_indices()
71+
local indices = {}
7272
for i = 1, #M.state.commits do
7373
if M.state.selected[i] then
74-
local h = M.state.commits[i]:match("^(%w+)")
75-
if h then
76-
table.insert(hashes, h)
77-
end
74+
table.insert(indices, i)
75+
end
76+
end
77+
return indices
78+
end
79+
80+
function M.get_selected_hashes()
81+
local hashes = {}
82+
local indices = M.get_selected_indices()
83+
for _, i in ipairs(indices) do
84+
local h = M.state.commits[i]:match("^(%w+)")
85+
if h then
86+
table.insert(hashes, h)
7887
end
7988
end
8089
return hashes
@@ -92,7 +101,8 @@ function M.keymaps()
92101
vim.keymap.set("n", "<space>", M.toggle, opts)
93102

94103
vim.keymap.set("n", "<CR>", function()
95-
require("gitlogdiff.actions").show_selected(M.get_selected_hashes())
104+
local ui = require("gitlogdiff.ui")
105+
require("gitlogdiff.actions").show_selected(ui.get_selected_hashes(), ui.get_selected_indices())
96106
end, opts)
97107

98108
vim.keymap.set("n", "q", function()

tests/test_init.lua

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ T["actions"]["show_selected() diffs single commit correctly"] = function()
2323
table.insert(cmds, cmd)
2424
end
2525

26-
actions.show_selected({ "abc1234" })
26+
actions.show_selected({ "abc1234" }, { 1 })
2727
MiniTest.expect.equality(cmds[1], "DiffviewOpen abc1234^..abc1234")
2828
end
2929

@@ -34,8 +34,19 @@ T["actions"]["show_selected() diffs two commits correctly"] = function()
3434
table.insert(cmds, cmd)
3535
end
3636

37-
actions.show_selected({ "newer123", "older456" })
38-
MiniTest.expect.equality(cmds[1], "DiffviewOpen older456..newer123")
37+
actions.show_selected({ "newer123", "older456" }, { 1, 2 })
38+
MiniTest.expect.equality(cmds[1], "DiffviewOpen older456^..newer123")
39+
end
40+
41+
T["actions"]["show_selected() handles non-consecutive commits correctly"] = function()
42+
local actions = require("gitlogdiff.actions")
43+
local cmds = {}
44+
vim.cmd = function(cmd)
45+
table.insert(cmds, cmd)
46+
end
47+
48+
actions.show_selected({ "newer123", "older789" }, { 1, 3 })
49+
MiniTest.expect.equality(cmds[1], "DiffviewFileHistory --no-walk newer123 older789")
3950
end
4051

4152
T["log"] = MiniTest.new_set()

tests/test_ui.lua

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,14 @@ T["get_selected_hashes() works"] = function()
4646
MiniTest.expect.equality(hashes, { "abc1234", "ghi9012" })
4747
end
4848

49+
T["get_selected_indices() works"] = function()
50+
local ui = require("gitlogdiff.ui")
51+
ui.open({ "abc1234 commit1", "def5678 commit2", "ghi9012 commit3" })
52+
ui.state.selected[1] = true
53+
ui.state.selected[3] = true
54+
55+
local indices = ui.get_selected_indices()
56+
MiniTest.expect.equality(indices, { 1, 3 })
57+
end
58+
4959
return T

0 commit comments

Comments
 (0)