diff --git a/lua/git/repo.lua b/lua/git/repo.lua index 5e9bad3..1e3a99c 100644 --- a/lua/git/repo.lua +++ b/lua/git/repo.lua @@ -161,10 +161,18 @@ local function do_refresh(repo) for line in (obj.stdout or ""):gmatch("[^\r\n]+") do if line:sub(1, 2) ~= "##" then 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 arrow = path_part:find(" -> ", 1, true) - if arrow then - path_part = path_part:sub(arrow + 4) + -- ` -> ` only appears in renames/copies. Without + -- this guard, a literal filename containing the + -- 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 statuses[vim.fs.joinpath(repo.worktree, path_part)] = format(code) diff --git a/lua/git/status_win.lua b/lua/git/status_win.lua index 9cf57a9..feb00da 100644 --- a/lua/git/status_win.lua +++ b/lua/git/status_win.lua @@ -165,10 +165,15 @@ local function parse_porcelain(stdout) local y = line:sub(2, 2) local rest = line:sub(4) local orig - local arrow = rest:find(" -> ", 1, true) - if arrow then - orig = rest:sub(1, arrow - 1) - rest = rest:sub(arrow + 4) + -- ` -> ` only appears in renames/copies (R/C codes). Without + -- this guard, a literal filename containing the arrow would + -- be mis-parsed. + 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 local entry = { section = nil,