Commit: runtime(zip): fix failure on Windows CI

1 view
Skip to first unread message

Christian Brabandt

unread,
Jul 30, 2026, 4:30:15 PM (yesterday) Jul 30
to vim...@googlegroups.com
runtime(zip): fix failure on Windows CI

Commit: https://github.com/vim/vim/commit/e241ac0a62b774763733f2ccac4040dfe8aafac8
Author: Christian Brabandt <c...@256bit.org>
Date: Thu Jul 30 20:22:52 2026 +0000

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.

Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim
index 1d0ecff45..61e980743 100644
--- a/runtime/autoload/zip.vim
+++ b/runtime/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/src/testdir/test_plugin_zip.vim b/src/testdir/test_plugin_zip.vim
index 435713154..c46a3efc0 100644
--- a/src/testdir/test_plugin_zip.vim
+++ b/src/testdir/test_plugin_zip.vim
@@ -86,7 +86,7 @@ def g:Test_zip_basic()
### Check opening zip when "unzip" program is missing
var save_zip_unzipcmd = g:zip_unzipcmd
g:zip_unzipcmd = "/"
- assert_match('unzip not available on your system', execute("e X.zip"))
+ 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")
Reply all
Reply to author
Forward
0 new messages