]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.2050: tests: Test_cd_completion may fail v9.1.2050
authorMuraoka Taro <koron.kaoriya@gmail.com>
Sat, 3 Jan 2026 23:44:35 +0000 (23:44 +0000)
committerChristian Brabandt <cb@256bit.org>
Sat, 3 Jan 2026 23:47:27 +0000 (23:47 +0000)
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: #19078

Signed-off-by: Muraoka Taro <koron.kaoriya@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_cd.vim
src/version.c

index c12a73ac342099881a22039e9c967707f9a41ff6..115688225723fdef1935c3682efa460f582e6acf 100644 (file)
@@ -224,15 +224,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 [ '/', '\']
index 8311522dfa68f63d251dc9bb046831336194e678..b724308b58e6234b2994cf5e70580fd956086d59 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2050,
 /**/
     2049,
 /**/