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.

e241ac0a62

Co-authored-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2026-07-31 09:29:04 +08:00
parent 659259d736
commit 41378d4610
2 changed files with 17 additions and 15 deletions

View File

@@ -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

View File

@@ -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")