|
12 | 12 | " 2025 Feb 28 by Vim Project: add support for bzip3 (#16755) |
13 | 13 | " 2025 Mar 01 by Vim Project: fix syntax error in tar#Read() |
14 | 14 | " 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) |
15 | 17 | " |
16 | 18 | " Contains many ideas from Michael Toren's <tar.vim> |
17 | 19 | " |
@@ -161,23 +163,19 @@ fun! tar#Browse(tarfile) |
161 | 163 |
|
162 | 164 | elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' || |
163 | 165 | \ 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) |
169 | 167 |
|
170 | | - if filekind =~ "bzip2" |
| 168 | + if header =~? 'bzip2' |
171 | 169 | exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
172 | | - elseif filekind =~ "bzip3" |
| 170 | + elseif header =~? 'bzip3' |
173 | 171 | exe "sil! r! bzip3 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
174 | | - elseif filekind =~ "XZ" |
| 172 | + elseif header =~? 'xz' |
175 | 173 | exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
176 | | - elseif filekind =~ "Zstandard" |
| 174 | + elseif header =~? 'zstd' |
177 | 175 | exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
178 | | - elseif filekind =~ "LZ4" |
| 176 | + elseif header =~? 'lz4' |
179 | 177 | exe "sil! r! lz4 --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
180 | | - else |
| 178 | + elseif header =~? 'gzip' |
181 | 179 | exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
182 | 180 | endif |
183 | 181 |
|
@@ -372,24 +370,20 @@ fun! tar#Read(fname,mode) |
372 | 370 | exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
373 | 371 | exe "read ".escape_file |
374 | 372 | 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" |
381 | 375 | exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
382 | 376 | exe "read ".escape_file |
383 | 377 | elseif filekind =~ "bzip3" |
384 | 378 | exe "sil! r! bzip3 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
385 | 379 | exe "read ".escape_file |
386 | | - elseif filekind =~ "XZ" |
| 380 | + elseif filekind =~? "xz" |
387 | 381 | exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
388 | 382 | exe "read ".escape_file |
389 | | - elseif filekind =~ "Zstandard" |
| 383 | + elseif filekind =~? "zstd" |
390 | 384 | exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
391 | 385 | exe "read ".escape_file |
392 | | - else |
| 386 | + elseif filekind =~? "gzip" |
393 | 387 | exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
394 | 388 | exe "read ".escape_file |
395 | 389 | endif |
@@ -499,6 +493,7 @@ fun! tar#Write(fname) |
499 | 493 | let tarfile = substitute(tarfile,'\.lzma','','e') |
500 | 494 | let compress= "lzma -- ".shellescape(tarfile,0) |
501 | 495 | endif |
| 496 | + " Note: no support for name.tar.tbz/.txz/.tgz/.tlz4/.tzst |
502 | 497 |
|
503 | 498 | if v:shell_error != 0 |
504 | 499 | redraw! |
@@ -747,6 +742,29 @@ fun! s:Rmdir(fname) |
747 | 742 | endif |
748 | 743 | endfun |
749 | 744 |
|
| 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 | + |
750 | 768 | " --------------------------------------------------------------------- |
751 | 769 | " tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 |
752 | 770 | fun! tar#Vimuntar(...) |
|
0 commit comments