From 41378d46102e68ff395ee26301b080bc3ffc9368 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 31 Jul 2026 09:29:04 +0800 Subject: [PATCH] vim-patch:e241ac0: runtime(zip): fix failure on Windows CI Problem: The zip autoload script aborts loading when the "zip" command is not available, so even read-only browsing of an archive fails with E117 (zip#Browse undefined) on systems that have "unzip" but not "zip" (e.g. the Windows CI runner). Regressed in b0e0b22. Solution: Drop the load-time executable gate and check each command per operation instead, so a missing "zip" only affects writing. Update the test to match the reworded message. https://github.com/vim/vim/commit/e241ac0a62b774763733f2ccac4040dfe8aafac8 Co-authored-by: Christian Brabandt --- .../pack/dist/opt/old-zip/autoload/zip.vim | 30 ++++++++++--------- test/old/testdir/test_plugin_zip.vim | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/runtime/pack/dist/opt/old-zip/autoload/zip.vim b/runtime/pack/dist/opt/old-zip/autoload/zip.vim index 561cda4072..a1bf8fd0dc 100644 --- a/runtime/pack/dist/opt/old-zip/autoload/zip.vim +++ b/runtime/pack/dist/opt/old-zip/autoload/zip.vim @@ -114,22 +114,17 @@ endfun " sanity checks " s:SafeExecutable: {{{2 fun! s:SafeExecutable(exe) - if !executable(a:exe) && !s:isPS() - call s:Mess('Error', "***error*** (zip) '".a:exe."' not available on your system") + " fails when exe is a full path with spaces + let exe = substitute(a:exe, '\s\+.*$', '', '') + if !executable(exe) && !s:isPS() return v:false endif - if !dist#vim#IsSafeExecutable('zip', a:exe) && !s:isPS() - call s:Mess('Error', "Warning: NOT executing " .. a:exe .. " from current directory!") + if !dist#vim#IsSafeExecutable('zip', exe) && !s:isPS() + call s:Mess('Error', "Warning: NOT executing " .. a:exe .. " from current directory!") return v:false endif return v:true endfun -" guarantee default command is exist and not be injected by environment -" every default command should be checked -if !s:SafeExecutable(g:zip_zipcmd) | finish | endif -if !s:SafeExecutable(g:zip_unzipcmd) | finish | endif -if !s:SafeExecutable(g:zip_extractcmd) | finish | endif - " ---------------- " PowerShell: {{{1 " ---------------- @@ -260,8 +255,8 @@ fun! zip#Browse(zipfile) defer s:RestoreOpts(dict) " sanity checks - if !executable(g:zip_unzipcmd) && !s:isPS() - call s:Mess('Error', "***error*** (zip#Browse) unzip not available on your system") + if !s:SafeExecutable(g:zip_unzipcmd) + call s:Mess('Error', "***error*** (zip#Browse) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program") return endif if !filereadable(a:zipfile) @@ -368,7 +363,7 @@ fun! zip#Read(fname,mode) endif let fname = fname->substitute('[', '[[]', 'g')->escape('?*\\') " sanity check - if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','','')) && !s:isPS() + if !s:SafeExecutable(g:zip_unzipcmd) call s:Mess('Error', "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program") return endif @@ -404,7 +399,7 @@ fun! zip#Write(fname) defer s:RestoreOpts(dict) " sanity checks - if !executable(substitute(g:zip_zipcmd,'\s\+.*$','','')) && &shell !~ 'pwsh' + if !s:SafeExecutable(g:zip_zipcmd) call s:Mess('Error', "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program") return endif @@ -532,6 +527,13 @@ fun! zip#Extract() let dict = s:SetSaneOpts() defer s:RestoreOpts(dict) + + " sanity checks + if !s:SafeExecutable(g:zip_extractcmd) + call s:Mess('Error', "***error*** (zip#Extract) sorry, your system doesn't appear to have the ".g:zip_extractcmd." program") + return + endif + let fname= getline(".") " sanity check diff --git a/test/old/testdir/test_plugin_zip.vim b/test/old/testdir/test_plugin_zip.vim index ae645c7063..e0491ac95e 100644 --- a/test/old/testdir/test_plugin_zip.vim +++ b/test/old/testdir/test_plugin_zip.vim @@ -87,7 +87,7 @@ func Test_zip_basic() "## Check opening zip when "unzip" program is missing let save_zip_unzipcmd = g:zip_unzipcmd let g:zip_unzipcmd = "/" - call assert_match('unzip not available on your system', execute("e X.zip")) + call assert_match('(zip#Browse) sorry, your system doesn''t appear to have the / program', execute("e X.zip")) "## Check when "unzip" don't work if executable("false")