gitsigns.nvim/lua/gitsigns/diff_ext.lua
Lewis Russell 2a107231d9 refactor: vendor in async lib
- Typed teal implementation
- Better error diagnostics
- Removes dependency on plenary.nvim
2022-03-25 17:24:05 +00:00

81 lines
1.4 KiB
Lua
Generated

local git_diff = require('gitsigns.git').diff
local gs_hunks = require("gitsigns.hunks")
local Hunk = gs_hunks.Hunk
local util = require('gitsigns.util')
local scheduler = require('gitsigns.async').scheduler
local M = {}
local function write_to_file(path, text)
local f, err = io.open(path, 'wb')
if f == nil then
error(err)
end
for _, l in ipairs(text) do
f:write(l)
f:write('\n')
end
f:close()
end
M.run_diff = function(
text_cmp,
text_buf,
diff_algo,
indent_heuristic)
local results = {}
if vim.in_fast_event() then
scheduler()
end
local file_buf = util.tmpname() .. '_buf'
local file_cmp = util.tmpname() .. '_cmp'
write_to_file(file_buf, text_buf)
write_to_file(file_cmp, text_cmp)
local out = git_diff(file_cmp, file_buf, indent_heuristic, diff_algo)
for _, line in ipairs(out) do
if vim.startswith(line, '@@') then
results[#results + 1] = gs_hunks.parse_diff_line(line)
elseif #results > 0 then
local r = results[#results]
if line:sub(1, 1) == '-' then
r.removed.lines[#r.removed.lines + 1] = line:sub(2)
elseif line:sub(1, 1) == '+' then
r.added.lines[#r.added.lines + 1] = line:sub(2)
end
end
end
os.remove(file_buf)
os.remove(file_cmp)
return results
end
return M