From 6c3502d85ab4d8fa26378b532290a2bac06d4fd2 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sun, 4 Jan 2026 18:50:50 +0800 Subject: [PATCH] vim-patch:9.1.2050: tests: Test_cd_completion may fail Problem: tests: Test_cd_completion() may fail depending on the contents of the root directory of the current drive on Windows. readdir() may return a directory that cannot "cd" to, causing this test to fail. An example of such a directory is "System Volume Information" which only admin can "cd" to. Solution: When determining the directory to use for testing, use the directory that we actually "cd" to successfully. In addition, directories with '$' in their names are also excluded, as they are considered environment variables during completion and do not work as expected. Example: "$RECYCLE.BIN" (Muraoka Taro). closes: vim/vim#19078 https://github.com/vim/vim/commit/6625ba359e33f8223d146f3ae87a880c446b5470 Co-authored-by: Muraoka Taro --- test/old/testdir/test_cd.vim | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/test/old/testdir/test_cd.vim b/test/old/testdir/test_cd.vim index 5d6d4018c4..1b0ef9ef81 100644 --- a/test/old/testdir/test_cd.vim +++ b/test/old/testdir/test_cd.vim @@ -227,15 +227,42 @@ func Test_cd_completion() if has('win32') " Test Windows absolute path completion + let saved_cwd = getcwd() + " Retrieve a suitable dir in the current drive - let dir = readdir('/', 'isdirectory("/" .. v:val) && len(v:val) > 2')[-1] + for d in readdir('/', 'isdirectory("/" .. v:val) && len(v:val) > 2') + " Paths containing '$' such as "$RECYCLE.BIN" are skipped because + " they are considered environment variables and completion does not + " work. + if d =~ '\V$' + continue + endif + " Skip directories that we don't have permission to "cd" into by + " actually "cd"ing into them and making sure they don't fail. + " Directory "System Volume Information" is an example of this. + try + call chdir('/' .. d) + let dir = d + " Yay! We found a suitable dir! + break + catch /:E472:/ + " Just skip directories where "cd" fails + continue + finally + call chdir(saved_cwd) + endtry + endfor + if !exists('dir') + throw 'Skipped: no testable directories found in the current drive root' + endif + " Get partial path let partial = dir[0:-2] - " Get the current drive letter - let old = chdir('/' . dir) + " Get the current drive letter and full path of the target dir + call chdir('/' .. dir) let full = getcwd() let drive = full[0] - call chdir(old) + call chdir(saved_cwd) for cmd in ['cd', 'chdir', 'lcd', 'lchdir', 'tcd', 'tchdir'] for sep in [ '/', '\']