Skip to content

Commit 4168602

Browse files
authored
fix: Add lightweight refresh_hunks for staging ops (#428)
After staging/unstaging a hunk, DiffScreen calls Model:fetch() to refresh the view. This runs several git commands that are unnecessary when we know the file state hasn't fundamentally changed: - git rev-parse --show-toplevel (GitFile creation) - git status (conflict check) - git status (file status) Add Model:refresh_hunks() which skips these redundant checks and only fetches what's needed: current lines and updated hunks. This reduces git commands from ~4-6 to ~1-2 per staging operation.
1 parent ecf8f12 commit 4168602

2 files changed

Lines changed: 19 additions & 6 deletions

File tree

lua/vgit/features/screens/DiffScreen/Model.lua

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@ function Model:get_hunks(lines)
5050
return self.git_file:live_hunks(lines)
5151
end
5252

53+
-- Lightweight refresh that skips redundant checks (conflict, status).
54+
-- Use after staging/unstaging when we know the file state hasn't fundamentally changed.
55+
function Model:refresh_hunks(filename)
56+
local lines, lines_err = self:get_lines(filename)
57+
if lines_err then return nil, lines_err end
58+
59+
local hunks, hunks_err = self:get_hunks(lines)
60+
if hunks_err then return nil, hunks_err end
61+
62+
self.state.diff = Diff():generate(hunks, lines, self:get_layout_type())
63+
return self.state.diff
64+
end
65+
5366
function Model:fetch(filename)
5467
if not fs.exists(filename) then return nil, { 'Buffer has no diff associated with it' } end
5568

lua/vgit/features/screens/DiffScreen/init.lua

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ function DiffScreen:reset(buffer)
146146
self.model:reset_file(filename)
147147

148148
loop.free_textlock()
149-
local _, refetch_err = self.model:fetch(buffer:get_name())
149+
local _, refetch_err = self.model:refresh_hunks(buffer:get_name())
150150
loop.free_textlock()
151151

152152
if refetch_err then
@@ -196,7 +196,7 @@ function DiffScreen:stage_hunk(buffer)
196196
self.model:stage_hunk(filename, hunk)
197197

198198
loop.free_textlock()
199-
local _, refetch_err = self.model:fetch(buffer:get_name())
199+
local _, refetch_err = self.model:refresh_hunks(buffer:get_name())
200200
loop.free_textlock()
201201

202202
if refetch_err then
@@ -228,7 +228,7 @@ function DiffScreen:unstage_hunk(buffer)
228228
self.model:unstage_hunk(filename, hunk)
229229

230230
loop.free_textlock()
231-
local _, refetch_err = self.model:fetch(buffer:get_name())
231+
local _, refetch_err = self.model:refresh_hunks(buffer:get_name())
232232
loop.free_textlock()
233233

234234
if refetch_err then
@@ -267,7 +267,7 @@ function DiffScreen:reset_hunk(buffer)
267267
self.model:reset_hunk(filename, hunk)
268268

269269
loop.free_textlock()
270-
local _, refetch_err = self.model:fetch(buffer:get_name())
270+
local _, refetch_err = self.model:refresh_hunks(buffer:get_name())
271271
loop.free_textlock()
272272

273273
if refetch_err then
@@ -295,7 +295,7 @@ function DiffScreen:stage(buffer)
295295
self.model:stage_file(filename)
296296

297297
loop.free_textlock()
298-
local _, refetch_err = self.model:fetch(buffer:get_name())
298+
local _, refetch_err = self.model:refresh_hunks(buffer:get_name())
299299
loop.free_textlock()
300300

301301
if refetch_err then
@@ -320,7 +320,7 @@ function DiffScreen:unstage(buffer)
320320
self.model:unstage_file(filename)
321321

322322
loop.free_textlock()
323-
local _, refetch_err = self.model:fetch(buffer:get_name())
323+
local _, refetch_err = self.model:refresh_hunks(buffer:get_name())
324324
loop.free_textlock()
325325

326326
if refetch_err then

0 commit comments

Comments
 (0)