local git = require('gitsigns.git') local gs_hunks = require("gitsigns.hunks") local Hunk = gs_hunks.Hunk local util = require('gitsigns.util') local a = require('plenary.async') 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) local results = {} if not util.is_unix then a.util.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) git.command({ '-c', 'core.safecrlf=false', 'diff', '--color=never', '--diff-algorithm=' .. diff_algo, '--patch-with-raw', '--unified=0', file_cmp, file_buf, }, { on_stdout = function(_, line) if vim.startswith(line, '@@') then table.insert(results, gs_hunks.parse_diff_line(line)) elseif #results > 0 then table.insert(results[#results].lines, line) end end, }) os.remove(file_buf) os.remove(file_cmp) return results end return M