fix(vimscript): normalize multi-slash heads in fnamemodify() #39805

Problem: `fnamemodify(..., ':h')` mishandles POSIX leading slash runs longer than `//`.

Solution: Collapse those slash runs to `/` before computing the head.
This commit is contained in:
Barrett Ruth
2026-05-17 10:54:59 -04:00
committed by GitHub
parent d3cfffc7ee
commit 38c18ad3a8
2 changed files with 51 additions and 0 deletions

View File

@@ -109,6 +109,42 @@ describe('fnamemodify()', function()
eq('.', fnamemodify('hello.txt', ':h'))
eq_slashconvert('path/to', fnamemodify('path/to/hello.txt', ':h'))
if is_os('win') then
-- Current Windows behavior for slash-style UNC paths, such as "//foo/C$/".
eq('/', fnamemodify('/', ':h'))
eq('/', fnamemodify('/foo', ':h'))
eq('//', fnamemodify('//', ':h'))
eq('//', fnamemodify('//foo', ':h'))
eq('//foo', fnamemodify('//foo/bar', ':h'))
eq('//foo', fnamemodify('//foo///bar', ':h'))
eq('//foo', fnamemodify('//foo/C$', ':h'))
eq('//foo/C$', fnamemodify('//foo/C$/', ':h'))
eq('//foo/C$', fnamemodify('//foo/C$/bar', ':h'))
eq('///', fnamemodify('///', ':h'))
eq('////', fnamemodify('////', ':h'))
eq('///', fnamemodify('///foo', ':h'))
eq('///foo', fnamemodify('///foo/bar', ':h'))
eq('///foo', fnamemodify('///foo////bar', ':h'))
else
-- POSIX roots.
eq('/', fnamemodify('/', ':h'))
eq('/', fnamemodify('/foo', ':h'))
-- POSIX permits special handling for exactly two leading slashes.
eq('//', fnamemodify('//', ':h'))
eq('//', fnamemodify('//foo', ':h'))
eq('//foo', fnamemodify('//foo/bar', ':h'))
eq('//foo', fnamemodify('//foo///bar', ':h'))
-- More than two leading slashes are ordinary absolute paths.
eq('/', fnamemodify('///', ':h'))
eq('/', fnamemodify('////', ':h'))
eq('/', fnamemodify('///foo', ':h'))
eq('/foo', fnamemodify('///foo/bar', ':h'))
eq('/foo', fnamemodify('///foo////bar', ':h'))
eq('/foo', fnamemodify('////foo/bar', ':h'))
end
end)
it('handles :t', function()