fix(git): only honor -> in porcelain output for renames

This commit is contained in:
2026-04-27 14:23:00 +02:00
parent 15909e3ca1
commit 641d208d78
2 changed files with 20 additions and 7 deletions
+11 -3
View File
@@ -161,10 +161,18 @@ local function do_refresh(repo)
for line in (obj.stdout or ""):gmatch("[^\r\n]+") do for line in (obj.stdout or ""):gmatch("[^\r\n]+") do
if line:sub(1, 2) ~= "##" then if line:sub(1, 2) ~= "##" then
local code = line:sub(1, 2) local code = line:sub(1, 2)
local x = code:sub(1, 1)
local y = code:sub(2, 2)
local path_part = line:sub(4) local path_part = line:sub(4)
local arrow = path_part:find(" -> ", 1, true) -- ` -> ` only appears in renames/copies. Without
if arrow then -- this guard, a literal filename containing the
path_part = path_part:sub(arrow + 4) -- arrow (rare with `core.quotePath=false`) would
-- be mis-parsed.
if x == "R" or x == "C" or y == "R" or y == "C" then
local arrow = path_part:find(" -> ", 1, true)
if arrow then
path_part = path_part:sub(arrow + 4)
end
end end
statuses[vim.fs.joinpath(repo.worktree, path_part)] = statuses[vim.fs.joinpath(repo.worktree, path_part)] =
format(code) format(code)
+9 -4
View File
@@ -165,10 +165,15 @@ local function parse_porcelain(stdout)
local y = line:sub(2, 2) local y = line:sub(2, 2)
local rest = line:sub(4) local rest = line:sub(4)
local orig local orig
local arrow = rest:find(" -> ", 1, true) -- ` -> ` only appears in renames/copies (R/C codes). Without
if arrow then -- this guard, a literal filename containing the arrow would
orig = rest:sub(1, arrow - 1) -- be mis-parsed.
rest = rest:sub(arrow + 4) if x == "R" or x == "C" or y == "R" or y == "C" then
local arrow = rest:find(" -> ", 1, true)
if arrow then
orig = rest:sub(1, arrow - 1)
rest = rest:sub(arrow + 4)
end
end end
local entry = { local entry = {
section = nil, section = nil,