Skip to content

Commit a250738

Browse files
chrisbraJimZhouZZY
andcommitted
runtime(tar): use readblob() instead of shelling out to file(1)
fixes: ##16761 closes: #16769 Co-authored-by: Jim Zhou <[email protected]> Signed-off-by: Christian Brabandt <[email protected]>
1 parent bc08ceb commit a250738

1 file changed

Lines changed: 38 additions & 20 deletions

File tree

runtime/autoload/tar.vim

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
" 2025 Feb 28 by Vim Project: add support for bzip3 (#16755)
1313
" 2025 Mar 01 by Vim Project: fix syntax error in tar#Read()
1414
" 2025 Mar 02 by Vim Project: escape the filename before using :read
15+
" 2025 Mar 02 by Vim Project: determine the compression using readblob()
16+
" instead of shelling out to file(1)
1517
"
1618
" Contains many ideas from Michael Toren's <tar.vim>
1719
"
@@ -161,23 +163,19 @@ fun! tar#Browse(tarfile)
161163

162164
elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' ||
163165
\ tarfile =~# '\.\(tzst\)$' || tarfile =~# '\.\(tlz4\)$'
164-
if has("unix") && executable("file")
165-
let filekind= system("file ".shellescape(tarfile,1))
166-
else
167-
let filekind= ""
168-
endif
166+
let header= s:Header(tarfile)
169167

170-
if filekind =~ "bzip2"
168+
if header =~? 'bzip2'
171169
exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
172-
elseif filekind =~ "bzip3"
170+
elseif header =~? 'bzip3'
173171
exe "sil! r! bzip3 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
174-
elseif filekind =~ "XZ"
172+
elseif header =~? 'xz'
175173
exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
176-
elseif filekind =~ "Zstandard"
174+
elseif header =~? 'zstd'
177175
exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
178-
elseif filekind =~ "LZ4"
176+
elseif header =~? 'lz4'
179177
exe "sil! r! lz4 --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
180-
else
178+
elseif header =~? 'gzip'
181179
exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
182180
endif
183181

@@ -372,24 +370,20 @@ fun! tar#Read(fname,mode)
372370
exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
373371
exe "read ".escape_file
374372
elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)'
375-
if has("unix") && executable("file")
376-
let filekind= system("file ".shellescape(tarfile,1))
377-
else
378-
let filekind= ""
379-
endif
380-
if filekind =~ "bzip2"
373+
let filekind= s:Header(tarfile)
374+
if filekind =~? "bzip2"
381375
exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
382376
exe "read ".escape_file
383377
elseif filekind =~ "bzip3"
384378
exe "sil! r! bzip3 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
385379
exe "read ".escape_file
386-
elseif filekind =~ "XZ"
380+
elseif filekind =~? "xz"
387381
exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
388382
exe "read ".escape_file
389-
elseif filekind =~ "Zstandard"
383+
elseif filekind =~? "zstd"
390384
exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
391385
exe "read ".escape_file
392-
else
386+
elseif filekind =~? "gzip"
393387
exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
394388
exe "read ".escape_file
395389
endif
@@ -499,6 +493,7 @@ fun! tar#Write(fname)
499493
let tarfile = substitute(tarfile,'\.lzma','','e')
500494
let compress= "lzma -- ".shellescape(tarfile,0)
501495
endif
496+
" Note: no support for name.tar.tbz/.txz/.tgz/.tlz4/.tzst
502497

503498
if v:shell_error != 0
504499
redraw!
@@ -747,6 +742,29 @@ fun! s:Rmdir(fname)
747742
endif
748743
endfun
749744

745+
" s:FileHeader: {{{2
746+
fun! s:Header(fname)
747+
let header= readblob(a:fname, 0, 6)
748+
if header[0:2] == str2blob(['BZh']) " bzip2 header
749+
return "bzip2"
750+
elseif header[0:2] == str2blob(['BZ3']) " bzip3 header
751+
return "bzip3"
752+
elseif header == str2blob(["\3757zXZ\n"]) " xz header
753+
return "xz"
754+
elseif header[0:3] == str2blob(["\x28\xB5\x2F\xFD"]) " zstd header
755+
return "zstd"
756+
elseif header[0:3] == str2blob(["\004\"M\030"]) " lz4 header
757+
return "lz4"
758+
elseif (header[0:1] == str2blob(["\037\235"]) ||
759+
\ header[0:1] == str2blob(["\037\213"]) ||
760+
\ header[0:1] == str2blob(["\037\236"]) ||
761+
\ header[0:1] == str2blob(["\037\240"]) ||
762+
\ header[0:1] == str2blob(["\037\036"]))
763+
return "gzip"
764+
endif
765+
return "unknown"
766+
endfun
767+
750768
" ---------------------------------------------------------------------
751769
" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
752770
fun! tar#Vimuntar(...)

0 commit comments

Comments
 (0)