diff --git a/doc/gitsigns.txt b/doc/gitsigns.txt index c6f49199e..1c746efda 100644 --- a/doc/gitsigns.txt +++ b/doc/gitsigns.txt @@ -300,6 +300,8 @@ blame_line({opts}, {callback?}) *gitsigns.blame_line()* Display full commit message with hunk. • {ignore_whitespace}: (boolean) Ignore whitespace when running blame. + • {rev}: (string) + Revision to blame against. get_hunks({bufnr}) *gitsigns.get_hunks()* Get hunk array for specified buffer. diff --git a/lua/gitsigns/actions.lua b/lua/gitsigns/actions.lua index 452033f0f..ce57edb17 100644 --- a/lua/gitsigns/actions.lua +++ b/lua/gitsigns/actions.lua @@ -898,11 +898,14 @@ end --- Display full commit message with hunk. --- • {ignore_whitespace}: (boolean) --- Ignore whitespace when running blame. +--- • {rev}: (string) +--- Revision to blame against. M.blame_line = async.create(1, function(opts) if popup.focus_open('blame') then return end + --- @type Gitsigns.LineBlameOpts opts = opts or {} local bufnr = current_buf() @@ -926,7 +929,7 @@ M.blame_line = async.create(1, function(opts) loading:close() end) - if not api.nvim_buf_is_valid(bufnr) then + if not manager.schedule(bufnr) then return end diff --git a/lua/gitsigns/cache.lua b/lua/gitsigns/cache.lua index 8fe597e73..34feb5356 100644 --- a/lua/gitsigns/cache.lua +++ b/lua/gitsigns/cache.lua @@ -90,7 +90,7 @@ local BLAME_THRESHOLD_LEN = 1000000 --- @private --- @param lnum integer ---- @param opts Gitsigns.CurrentLineBlameOpts +--- @param opts Gitsigns.BlameOpts --- @return table? function CacheEntry:run_blame(lnum, opts) local bufnr = self.bufnr @@ -124,9 +124,14 @@ local function get_blame_nc(file, lnum) end --- @param lnum integer ---- @param opts Gitsigns.CurrentLineBlameOpts +--- @param opts Gitsigns.BlameOpts --- @return Gitsigns.BlameInfo? function CacheEntry:get_blame(lnum, opts) + if opts.rev then + local buftext = util.buf_lines(self.bufnr) + return self.git_obj:run_blame(buftext, lnum, opts.ignore_whitespace)[lnum] + end + local blame_cache = self.blame if not blame_cache or not blame_cache[lnum] then diff --git a/lua/gitsigns/config.lua b/lua/gitsigns/config.lua index 96f2613f2..960303087 100644 --- a/lua/gitsigns/config.lua +++ b/lua/gitsigns/config.lua @@ -1,14 +1,14 @@ --- @class (exact) Gitsigns.SchemaElem.Deprecated --- --- Used for renaming fields. ---- @field new_field string +--- @field new_field? string --- --- Documentation for deprecation. Will be added to the help file and used in --- the notification if `hard = true`. ---- @field message string +--- @field message? string --- --- Emit a message via vim.notify ---- @field hard boolean +--- @field hard? boolean --- @class (exact) Gitsigns.SchemaElem --- @field type string|string[] @@ -50,12 +50,18 @@ --- @alias Gitsigns.CurrentLineBlameFmtFun fun(user: string, info: table, opts: Gitsigns.CurrentLineBlameFmtOpts): {[1]:string,[2]:string}[] ---- @class (exact) Gitsigns.CurrentLineBlameOpts ---- @field virt_text boolean ---- @field virt_text_pos 'eol'|'overlay'|'right_align' ---- @field delay integer ---- @field ignore_whitespace boolean ---- @field virt_text_priority integer +--- @class (exact) Gitsigns.CurrentLineBlameOpts : Gitsigns.BlameOpts +--- @field virt_text? boolean +--- @field virt_text_pos? 'eol'|'overlay'|'right_align' +--- @field delay? integer +--- @field virt_text_priority? integer + +--- @class (exact) Gitsigns.BlameOpts +--- @field ignore_whitespace? boolean +--- @field rev? string + +--- @class (exact) Gitsigns.LineBlameOpts : Gitsigns.BlameOpts +--- @field full? boolean --- @class (exact) Gitsigns.Config --- @field debug_mode boolean diff --git a/lua/gitsigns/diffthis.lua b/lua/gitsigns/diffthis.lua index 2795c7bf2..a2ff8fa82 100644 --- a/lua/gitsigns/diffthis.lua +++ b/lua/gitsigns/diffthis.lua @@ -39,7 +39,7 @@ local function bufread(bufnr, dbufnr, base) local modifiable = vim.bo[dbufnr].modifiable vim.bo[dbufnr].modifiable = true - Status:update(dbufnr, {head = comp_rev}) + Status:update(dbufnr, { head = comp_rev }) util.set_lines(dbufnr, 0, -1, text)