# HG changeset patch # User Bram Moolenaar # Date 1606304703 -3600 # Node ID 94656f3ff3049a6d4ffed437b74d5c51ed3417d3 # Parent 1d635e77266dc4678d57f9c75d7ba22f12db335c patch 8.2.2044: MS-Windows: swap file test sometimes fails Commit: https://github.com/vim/vim/commit/5ee0981fb5259f94900ab25207caddf1fa61010d Author: Bram Moolenaar Date: Wed Nov 25 12:43:28 2020 +0100 patch 8.2.2044: MS-Windows: swap file test sometimes fails Problem: MS-Windows: swap file test sometimes fails. Solution: Use a more reliable way to change the process ID. When "timeout" fails use "ping" to wait up to ten minutes. (Ken Takata, closes #7365) diff --git a/.github/workflows/ci-windows.yaml b/.github/workflows/ci-windows.yaml --- a/.github/workflows/ci-windows.yaml +++ b/.github/workflows/ci-windows.yaml @@ -215,7 +215,8 @@ jobs: :: Wait about 10 minutes. for /L %%i in (1,1,60) do ( if exist done.txt goto exitloop - timeout 10 + timeout 10 > NUL 2>&1 + if ERRORLEVEL 1 ping -n 11 localhost > NUL ) set timeout=1 :exitloop diff --git a/src/testdir/test_swap.vim b/src/testdir/test_swap.vim --- a/src/testdir/test_swap.vim +++ b/src/testdir/test_swap.vim @@ -403,6 +403,39 @@ func Test_swap_symlink() call delete('Xswapdir', 'rf') endfunc +func s:get_unused_pid(base) + if has('job') + " Execute 'echo' as a temporary job, and return its pid as an unused pid. + if has('win32') + let cmd = 'cmd /c echo' + else + let cmd = 'echo' + endif + let j = job_start(cmd) + while job_status(j) ==# 'run' + sleep 10m + endwhile + if job_status(j) ==# 'dead' + return job_info(j).process + endif + endif + " Must add four for MS-Windows to see it as a different one. + return a:base + 4 +endfunc + +func s:blob_to_pid(b) + return a:b[3] * 16777216 + a:b[2] * 65536 + a:b[1] * 256 + a:b[0] +endfunc + +func s:pid_to_blob(i) + let b = 0z + let b[0] = and(a:i, 0xff) + let b[1] = and(a:i / 256, 0xff) + let b[2] = and(a:i / 65536, 0xff) + let b[3] = and(a:i / 16777216, 0xff) + return b +endfunc + func Test_swap_auto_delete() " Create a valid swapfile by editing a file with a special extension. split Xtest.scr @@ -416,9 +449,9 @@ func Test_swap_auto_delete() " Forget about the file, recreate the swap file, then edit it again. The " swap file should be automatically deleted. bwipe! - " Change the process ID to avoid the "still running" warning. Must add four - " for MS-Windows to see it as a different one. - let swapfile_bytes[24] = swapfile_bytes[24] + 4 + " Change the process ID to avoid the "still running" warning. + let swapfile_bytes[24:27] = s:pid_to_blob(s:get_unused_pid( + \ s:blob_to_pid(swapfile_bytes[24:27]))) call writefile(swapfile_bytes, swapfile_name) edit Xtest.scr " will end up using the same swap file after deleting the existing one diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2044, +/**/ 2043, /**/ 2042,