fix(highlight): support combined diff format for unmerged files
Problem: fugitive shows combined diffs (@@@ headers, 2-char prefixes) for unmerged (UU) files. The parser and highlight pipeline assumed unified diff format (@@, 1-char prefix), causing broken prefix concealment, missing background colors on ` +`/`+ ` lines, and no treesitter highlights due to garbage prefix chars in code arrays. Solution: detect prefix width from the number of leading @ signs in hunk headers. Propagate prefix_width through the parser (new field on diffs.Hunk) and highlight pipeline (prefix stripping, col_offset, concealment, line classification). Add U to filename pattern for unmerged file detection. Skip intra-line diffing for combined diffs since the 2-char prefix semantics don't produce meaningful change groups.
This commit is contained in:
parent
59fcf14817
commit
a6dd0503b3
4 changed files with 232 additions and 29 deletions
|
|
@ -425,6 +425,81 @@ describe('parser', function()
|
|||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('recognizes U prefix for unmerged files', function()
|
||||
local bufnr = create_buffer({
|
||||
'U merge_me.lua',
|
||||
'@@@ -1,3 -1,5 +1,9 @@@',
|
||||
' local M = {}',
|
||||
'++<<<<<<< HEAD',
|
||||
' + return 1',
|
||||
'++=======',
|
||||
'+ return 2',
|
||||
'++>>>>>>> feature',
|
||||
})
|
||||
local hunks = parser.parse_buffer(bufnr)
|
||||
|
||||
assert.are.equal(1, #hunks)
|
||||
assert.are.equal('merge_me.lua', hunks[1].filename)
|
||||
assert.are.equal('lua', hunks[1].ft)
|
||||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('sets prefix_width from @@@ combined diff header', function()
|
||||
local bufnr = create_buffer({
|
||||
'U test.lua',
|
||||
'@@@ -1,3 -1,5 +1,9 @@@',
|
||||
' local M = {}',
|
||||
'++<<<<<<< HEAD',
|
||||
' + return 1',
|
||||
})
|
||||
local hunks = parser.parse_buffer(bufnr)
|
||||
|
||||
assert.are.equal(1, #hunks)
|
||||
assert.are.equal(2, hunks[1].prefix_width)
|
||||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('sets prefix_width 1 for standard @@ unified diff', function()
|
||||
local bufnr = create_buffer({
|
||||
'M test.lua',
|
||||
'@@ -1,2 +1,3 @@',
|
||||
' local x = 1',
|
||||
'+local y = 2',
|
||||
})
|
||||
local hunks = parser.parse_buffer(bufnr)
|
||||
|
||||
assert.are.equal(1, #hunks)
|
||||
assert.are.equal(1, hunks[1].prefix_width)
|
||||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('extracts new range from combined diff header', function()
|
||||
local bufnr = create_buffer({
|
||||
'U test.lua',
|
||||
'@@@ -1,3 -1,5 +1,9 @@@',
|
||||
' local M = {}',
|
||||
})
|
||||
local hunks = parser.parse_buffer(bufnr)
|
||||
|
||||
assert.are.equal(1, #hunks)
|
||||
assert.are.equal(1, hunks[1].file_new_start)
|
||||
assert.are.equal(9, hunks[1].file_new_count)
|
||||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('extracts header context from combined diff header', function()
|
||||
local bufnr = create_buffer({
|
||||
'U test.lua',
|
||||
'@@@ -1,3 -1,5 +1,9 @@@ function M.greet()',
|
||||
' local M = {}',
|
||||
})
|
||||
local hunks = parser.parse_buffer(bufnr)
|
||||
|
||||
assert.are.equal(1, #hunks)
|
||||
assert.are.equal('function M.greet()', hunks[1].header_context)
|
||||
delete_buffer(bufnr)
|
||||
end)
|
||||
|
||||
it('stores repo_root on hunk when available', function()
|
||||
local bufnr = create_buffer({
|
||||
'M lua/test.lua',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue