Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lua/vgit/features/buffer/Hunks.lua
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ function Hunks:stage_all()
local buffer = git_buffer_store.current()
if not buffer then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

loop.free_textlock()
local _, err = buffer:stage()
if err then return console.debug.error(err) end
Expand All @@ -82,6 +85,9 @@ function Hunks:cursor_stage()
if not buffer then return end
if buffer:editing() then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

if not buffer:is_tracked() then
local _, err = buffer:stage()
if err then return console.debug.error(err) end
Expand Down
24 changes: 24 additions & 0 deletions lua/vgit/features/screens/DiffScreen/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,10 @@ function DiffScreen:reset(buffer)
local filename = self.model:get_filename()
if not filename then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
local git_buffer_store = require('vgit.git.git_buffer_store')
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

loop.free_textlock()
self.model:reset_file(filename)

Expand Down Expand Up @@ -185,6 +189,10 @@ function DiffScreen:stage_hunk(buffer)
local hunk, index = self.diff_view:get_hunk_under_cursor()
if not hunk then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
local git_buffer_store = require('vgit.git.git_buffer_store')
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

self.model:stage_hunk(filename, hunk)

loop.free_textlock()
Expand Down Expand Up @@ -212,6 +220,10 @@ function DiffScreen:unstage_hunk(buffer)
local hunk, index = self.diff_view:get_hunk_under_cursor()
if not hunk then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
local git_buffer_store = require('vgit.git.git_buffer_store')
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

loop.free_textlock()
self.model:unstage_hunk(filename, hunk)

Expand Down Expand Up @@ -247,6 +259,10 @@ function DiffScreen:reset_hunk(buffer)

if decision ~= 'yes' and decision ~= 'y' then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
local git_buffer_store = require('vgit.git.git_buffer_store')
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

loop.free_textlock()
self.model:reset_hunk(filename, hunk)

Expand All @@ -271,6 +287,10 @@ function DiffScreen:stage(buffer)
local filename = self.model:get_filename()
if not filename then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
local git_buffer_store = require('vgit.git.git_buffer_store')
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

loop.free_textlock()
self.model:stage_file(filename)

Expand All @@ -292,6 +312,10 @@ function DiffScreen:unstage(buffer)
local filename = self.model:get_filename()
if not filename then return end

-- Performance: Suppress VGitSync broadcast; refresh only this buffer after delay
local git_buffer_store = require('vgit.git.git_buffer_store')
git_buffer_store.suppress_sync_and_refresh(buffer, 200)

loop.free_textlock()
self.model:unstage_file(filename)

Expand Down
26 changes: 26 additions & 0 deletions lua/vgit/git/git_buffer_store.lua
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ local events = {
}
local is_registered = false

-- When true, VGitSync events are suppressed (e.g., during staging operations)
local suppress_sync = false

local git_buffer_store = {}

git_buffer_store.register_events = loop.coroutine(function()
Expand All @@ -40,6 +43,8 @@ git_buffer_store.register_events = loop.coroutine(function()
-- Use vim.schedule to avoid "must not be called in a lua loop callback" error
vim.schedule(function()
event.custom_on('VGitSync', function()
if suppress_sync then return end

git_buffer_store.for_each(function(buffer)
git_buffer_store.dispatch(buffer, 'sync')
end)
Expand Down Expand Up @@ -181,4 +186,25 @@ git_buffer_store.collect = function()
git_buffer_store.dispatch(git_buffer, 'attach')
end

-- Suppress VGitSync broadcast and refresh only the specified buffer after delay.
-- This prevents refreshing all tracked buffers when only one needs updating.
--
-- Note: External git operations during the suppression window won't trigger a
-- refresh until the next VGitSync event. This is an acceptable tradeoff given
-- the short window (typically 200ms).
git_buffer_store.suppress_sync_and_refresh = function(buffer, ms)
local git_buffer = git_buffer_store.get(buffer)
if not git_buffer then return end

suppress_sync = true

vim.defer_fn(loop.coroutine(function()
suppress_sync = false

if git_buffer:is_valid() then
git_buffer_store.dispatch(git_buffer, 'sync')
end
end), ms)
end

return git_buffer_store
Loading