diff options
author | Leonardo Mello <lsvmello@gmail.com> | 2023-10-03 19:04:19 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-04 06:04:19 +0800 |
commit | 1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130 (patch) | |
tree | 5c7d63563d97fbad676dfa651f5dcdc77689f254 | |
parent | e72b546354cd90bf0cd8ee6dd045538d713009ad (diff) | |
download | rneovim-1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130.tar.gz rneovim-1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130.tar.bz2 rneovim-1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130.zip |
fix(path): accept special characters on Windows (#25424)
-rw-r--r-- | src/nvim/path.c | 8 | ||||
-rw-r--r-- | test/functional/core/path_spec.lua | 34 |
2 files changed, 34 insertions, 8 deletions
diff --git a/src/nvim/path.c b/src/nvim/path.c index 21f0543756..5d991ce719 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -648,11 +648,13 @@ static size_t do_path_expand(garray_T *gap, const char *path, size_t wildoff, in } s = p + 1; } else if (path_end >= path + wildoff +#ifdef MSWIN + && vim_strchr("*?[~", (uint8_t)(*path_end)) != NULL +#else && (vim_strchr("*?[{~$", (uint8_t)(*path_end)) != NULL -#ifndef MSWIN - || (!p_fic && (flags & EW_ICASE) && mb_isalpha(utf_ptr2char(path_end))) + || (!p_fic && (flags & EW_ICASE) && mb_isalpha(utf_ptr2char(path_end)))) #endif - )) { // NOLINT(whitespace/parens) + ) { // NOLINT(whitespace/parens) e = p; } len = (size_t)(utfc_ptr2len(path_end)); diff --git a/test/functional/core/path_spec.lua b/test/functional/core/path_spec.lua index a786887bbd..6c677d76d1 100644 --- a/test/functional/core/path_spec.lua +++ b/test/functional/core/path_spec.lua @@ -6,16 +6,19 @@ local command = helpers.command local insert = helpers.insert local feed = helpers.feed local is_os = helpers.is_os +local mkdir = helpers.mkdir +local rmdir = helpers.rmdir +local write_file = helpers.write_file + +local function join_path(...) + local pathsep = (is_os('win') and '\\' or '/') + return table.concat({...}, pathsep) +end describe('path collapse', function() local targetdir local expected_path - local function join_path(...) - local pathsep = (is_os('win') and '\\' or '/') - return table.concat({...}, pathsep) - end - before_each(function() targetdir = join_path('test', 'functional', 'fixtures') clear() @@ -57,6 +60,27 @@ describe('path collapse', function() end) end) +describe('expand wildcard', function() + before_each(clear) + + it('with special characters #24421', function() + local folders = is_os('win') and { + '{folder}', + 'folder$name' + } or { + 'folder-name', + 'folder#name' + } + for _, folder in ipairs(folders) do + mkdir(folder) + local file = join_path(folder, 'file.txt') + write_file(file, '') + eq(file, eval('expand("'..folder..'/*")')) + rmdir(folder) + end + end) +end) + describe('file search', function() before_each(clear) |