refactor(git): rename refresh event to change, gate on actual diff

This commit is contained in:
2026-05-19 10:42:13 +02:00
parent 085216a406
commit ab9b70c70a
7 changed files with 25 additions and 16 deletions
+17 -8
View File
@@ -21,7 +21,7 @@ end
---@field index_mode string? ---@field index_mode string?
---@alias ow.Git.Repo.Event ---@alias ow.Git.Repo.Event
---| "refresh" ---| "change"
local global = util.Emitter.new() local global = util.Emitter.new()
@@ -42,6 +42,7 @@ end
---@class ow.Git.Repo.Change ---@class ow.Git.Repo.Change
---@field paths table<string, true> ---@field paths table<string, true>
---@field branch_changed boolean
---@class ow.Git.Repo.RefreshOpts ---@class ow.Git.Repo.RefreshOpts
---@field invalidate boolean? ---@field invalidate boolean?
@@ -196,6 +197,7 @@ function Repo:_fetch_status()
self._pending_invalidate = false self._pending_invalidate = false
end end
local prior_entries = self.status.entries local prior_entries = self.status.entries
local prior_branch = self.status.branch
self._fetch_epoch = self._fetch_epoch + 1 self._fetch_epoch = self._fetch_epoch + 1
local epoch = self._fetch_epoch local epoch = self._fetch_epoch
util.git(STATUS_ARGS, { util.git(STATUS_ARGS, {
@@ -217,9 +219,16 @@ function Repo:_fetch_status()
prior_entries, prior_entries,
self.status.entries self.status.entries
), ),
branch_changed = not vim.deep_equal(
prior_branch,
self.status.branch
),
} }
self._events:emit("refresh", change, self.status) if next(change.paths) == nil and not change.branch_changed then
global:emit("refresh", self, change, self.status) return
end
self._events:emit("change", change, self.status)
global:emit("change", self, change, self.status)
end, end,
}) })
end end
@@ -337,7 +346,7 @@ function Repo:_register_submodule(name)
end end
self._submodules[name] = { self._submodules[name] = {
worktree = wt, worktree = wt,
unsub = child:on("refresh", function() unsub = child:on("change", function()
self:refresh() self:refresh()
end), end),
} }
@@ -479,7 +488,7 @@ function Repo:close()
self._events:clear() self._events:clear()
end end
---@overload fun(event: "refresh", fn: fun(change: ow.Git.Repo.Change, status: ow.Git.Status)): fun() ---@overload fun(event: "change", fn: fun(change: ow.Git.Repo.Change, status: ow.Git.Status)): fun()
function Repo:on(event, fn) function Repo:on(event, fn)
return self._events:on(event, fn) return self._events:on(event, fn)
end end
@@ -636,7 +645,7 @@ end
---@type table<string, true> ---@type table<string, true>
local no_repo_dirs = {} local no_repo_dirs = {}
---@overload fun(event: "refresh", fn: fun(r: ow.Git.Repo, change: ow.Git.Repo.Change, status: ow.Git.Status)): fun() ---@overload fun(event: "change", fn: fun(r: ow.Git.Repo, change: ow.Git.Repo.Change, status: ow.Git.Status)): fun()
function M.on(event, fn) function M.on(event, fn)
return global:on(event, fn) return global:on(event, fn)
end end
@@ -644,8 +653,8 @@ end
---@param prefix string ---@param prefix string
---@param fn fun(buf: integer, r: ow.Git.Repo) ---@param fn fun(buf: integer, r: ow.Git.Repo)
---@return fun() unsubscribe ---@return fun() unsubscribe
function M.on_uri_refresh(prefix, fn) function M.on_uri_change(prefix, fn)
return M.on("refresh", function(r) return M.on("change", function(r)
for buf in pairs(r.buffers) do for buf in pairs(r.buffers) do
if vim.api.nvim_buf_is_loaded(buf) then if vim.api.nvim_buf_is_loaded(buf) then
local name = vim.api.nvim_buf_get_name(buf) local name = vim.api.nvim_buf_get_name(buf)
+1 -1
View File
@@ -170,6 +170,6 @@ function M.complete_glog(arg_lead)
return matches return matches
end end
repo.on_uri_refresh(M.URI_PREFIX, populate) repo.on_uri_change(M.URI_PREFIX, populate)
return M return M
+1 -1
View File
@@ -428,6 +428,6 @@ function M.open_under_cursor()
return false return false
end end
repo.on_uri_refresh(M.URI_PREFIX, refresh) repo.on_uri_change(M.URI_PREFIX, refresh)
return M return M
+1 -1
View File
@@ -671,7 +671,7 @@ local function setup_buffer(bufnr, r, placement, win, invocation_win)
action_help(state[bufnr].placement) action_help(state[bufnr].placement)
end, "Help") end, "Help")
state[bufnr].unsubscribe = r:on("refresh", function() state[bufnr].unsubscribe = r:on("change", function()
refresh(bufnr) refresh(bufnr)
end) end)
vim.api.nvim_create_autocmd("BufEnter", { vim.api.nvim_create_autocmd("BufEnter", {
+1 -1
View File
@@ -64,7 +64,7 @@ local function update_buf(buf, r)
set_status(buf, r, rel) set_status(buf, r, rel)
end end
repo.on("refresh", function(r) repo.on("change", function(r)
local any_visible = false local any_visible = false
for buf in pairs(r.buffers) do for buf in pairs(r.buffers) do
if vim.api.nvim_buf_is_loaded(buf) then if vim.api.nvim_buf_is_loaded(buf) then
+1 -1
View File
@@ -7,7 +7,7 @@ local Decorator = require("nvim-tree.api").Decorator
local repo = require("git.core.repo") local repo = require("git.core.repo")
repo.on("refresh", function() repo.on("change", function()
require("nvim-tree.api").tree.reload() require("nvim-tree.api").tree.reload()
end) end)
+2 -2
View File
@@ -233,7 +233,7 @@ t.test("refresh emits change.paths listing structurally-changed paths", function
t.write(dir, "a", "2") t.write(dir, "a", "2")
---@type ow.Git.Repo.Change? ---@type ow.Git.Repo.Change?
local change_seen local change_seen
local unsub = r:on("refresh", function(change) local unsub = r:on("change", function(change)
change_seen = change change_seen = change
end) end)
r:refresh() r:refresh()
@@ -263,7 +263,7 @@ t.test("submodule: eagerly creates child Repos and subscribes by default", funct
t.write(outer_path .. "/sub", "a", "modified\n") t.write(outer_path .. "/sub", "a", "modified\n")
---@type ow.Git.Repo.Change? ---@type ow.Git.Repo.Change?
local outer_change local outer_change
local unsub = outer:on("refresh", function(change) local unsub = outer:on("change", function(change)
outer_change = change outer_change = change
end) end)
inner:refresh() inner:refresh()