aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeonardo Mello <lsvmello@gmail.com>2023-10-03 19:04:19 -0300
committerGitHub <noreply@github.com>2023-10-04 06:04:19 +0800
commit1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130 (patch)
tree5c7d63563d97fbad676dfa651f5dcdc77689f254
parente72b546354cd90bf0cd8ee6dd045538d713009ad (diff)
downloadrneovim-1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130.tar.gz
rneovim-1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130.tar.bz2
rneovim-1e7e9ee91f73c62b8c5ba9dbdabba3a3b6dc0130.zip
fix(path): accept special characters on Windows (#25424)
-rw-r--r--src/nvim/path.c8
-rw-r--r--test/functional/core/path_spec.lua34
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)