local repo = require("git.repo") local status = require("git.status") local util = require("git.util") local M = {} ---@class ow.Git.Statusline.Status ---@field head string? ---@field entry ow.Git.Status.Entry? ---@param entry ow.Git.Status.Entry? ---@return string local function render(entry) if not entry then return "" end local marks = status.marks_for(entry) if #marks == 0 then return "" end local parts = {} for _, mark in ipairs(marks) do table.insert( parts, string.format("%%#%s#%s%%*", mark.hl, mark.char) ) end return table.concat(parts, " ") end ---@param buf integer local function clear(buf) vim.b[buf].git_status = nil vim.b[buf].git_status_string = nil end ---@param buf integer ---@param r ow.Git.Repo? local function update_buf(buf, r) if not vim.api.nvim_buf_is_valid(buf) then return end local name = vim.api.nvim_buf_get_name(buf) if name == "" or util.is_uri(name) then return clear(buf) end r = r or repo.find(buf) if not r then return clear(buf) end local rel = vim.fs.relpath(r.worktree, vim.fn.resolve(name)) if not rel then return clear(buf) end local entry = r.status.entries[rel] vim.b[buf].git_status = { head = r:head(), entry = entry } vim.b[buf].git_status_string = render(entry) end repo.on("refresh", function(r) for buf in pairs(r.buffers) do if vim.api.nvim_buf_is_loaded(buf) then update_buf(buf, r) end end vim.cmd.redrawstatus({ bang = true }) end) vim.api.nvim_create_autocmd("BufWinEnter", { group = vim.api.nvim_create_augroup("ow.git.statusline", { clear = true }), callback = function(args) update_buf(args.buf, nil) end, }) for _, buf in ipairs(vim.api.nvim_list_bufs()) do if vim.api.nvim_buf_is_loaded(buf) then update_buf(buf, nil) end end return M