xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision 6c391a74)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
32963456fSBram Moolenaar" Date:		Jan 07, 2020
42963456fSBram Moolenaar" Version:	32
52963456fSBram Moolenaar" Maintainer:	Charles E Campbell <[email protected]>
6a5792f58SBram Moolenaar" License:	Vim License  (see vim's :help license)
787e25fdfSBram Moolenaar"
8a5792f58SBram Moolenaar"	Contains many ideas from Michael Toren's <tar.vim>
987e25fdfSBram Moolenaar"
102963456fSBram Moolenaar" Copyright:    Copyright (C) 2005-2017 Charles E. Campbell {{{1
11a5792f58SBram Moolenaar"               Permission is hereby granted to use and distribute this code,
12a5792f58SBram Moolenaar"               with or without modifications, provided that this copyright
13a5792f58SBram Moolenaar"               notice is copied with it. Like anything else that's free,
148c8de839SBram Moolenaar"               tar.vim and tarPlugin.vim are provided *as is* and comes
158c8de839SBram Moolenaar"               with no warranty of any kind, either expressed or implied.
168c8de839SBram Moolenaar"               By using this plugin, you agree that in no event will the
178c8de839SBram Moolenaar"               copyright holder be liable for any damages resulting from
188c8de839SBram Moolenaar"               the use of this software.
195c73622aSBram Moolenaar"     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
20ab194816SBram Moolenaar" ---------------------------------------------------------------------
21c81e5e79SBram Moolenaar" Load Once: {{{1
225c73622aSBram Moolenaarif &cp || exists("g:loaded_tar")
23a5792f58SBram Moolenaar finish
24a5792f58SBram Moolenaarendif
252963456fSBram Moolenaarlet g:loaded_tar= "v32"
265c73622aSBram Moolenaarif v:version < 702
275c73622aSBram Moolenaar echohl WarningMsg
285c73622aSBram Moolenaar echo "***warning*** this version of tar needs vim 7.2"
295c73622aSBram Moolenaar echohl Normal
305c73622aSBram Moolenaar finish
318c8de839SBram Moolenaarendif
325c73622aSBram Moolenaarlet s:keepcpo= &cpo
335c73622aSBram Moolenaarset cpo&vim
34ff034194SBram Moolenaar"DechoTabOn
355c73622aSBram Moolenaar"call Decho("loading autoload/tar.vim")
3687e25fdfSBram Moolenaar
37a5792f58SBram Moolenaar" ---------------------------------------------------------------------
38a5792f58SBram Moolenaar"  Default Settings: {{{1
39a5792f58SBram Moolenaarif !exists("g:tar_browseoptions")
40a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf"
41a5792f58SBram Moolenaarendif
42a5792f58SBram Moolenaarif !exists("g:tar_readoptions")
43a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf"
44a5792f58SBram Moolenaarendif
45910f66f9SBram Moolenaarif !exists("g:tar_cmd")
46910f66f9SBram Moolenaar let g:tar_cmd= "tar"
47910f66f9SBram Moolenaarendif
48a5792f58SBram Moolenaarif !exists("g:tar_writeoptions")
49a5792f58SBram Moolenaar let g:tar_writeoptions= "uf"
50a5792f58SBram Moolenaarendif
512963456fSBram Moolenaarif !exists("g:tar_delfile")
522963456fSBram Moolenaar let g:tar_delfile="--delete -f"
532963456fSBram Moolenaarendif
54251e1912SBram Moolenaarif !exists("g:netrw_cygwin")
55251e1912SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
56251e1912SBram Moolenaar  if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
57251e1912SBram Moolenaar   let g:netrw_cygwin= 1
58251e1912SBram Moolenaar  else
59251e1912SBram Moolenaar   let g:netrw_cygwin= 0
60251e1912SBram Moolenaar  endif
61251e1912SBram Moolenaar else
62251e1912SBram Moolenaar  let g:netrw_cygwin= 0
63251e1912SBram Moolenaar endif
64251e1912SBram Moolenaarendif
655c73622aSBram Moolenaarif !exists("g:tar_copycmd")
665c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd")
675c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
685c73622aSBram Moolenaar   if g:netrw_cygwin
695c73622aSBram Moolenaar    let g:netrw_localcopycmd= "cp"
705c73622aSBram Moolenaar   else
715c73622aSBram Moolenaar    let g:netrw_localcopycmd= "copy"
725c73622aSBram Moolenaar   endif
735c73622aSBram Moolenaar  elseif has("unix") || has("macunix")
745c73622aSBram Moolenaar   let g:netrw_localcopycmd= "cp"
755c73622aSBram Moolenaar  else
765c73622aSBram Moolenaar   let g:netrw_localcopycmd= ""
775c73622aSBram Moolenaar  endif
785c73622aSBram Moolenaar endif
795c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd
805c73622aSBram Moolenaarendif
815c73622aSBram Moolenaarif !exists("g:tar_extractcmd")
825c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf"
835c73622aSBram Moolenaarendif
848c8de839SBram Moolenaar
858c8de839SBram Moolenaar" set up shell quoting character
86c81e5e79SBram Moolenaarif !exists("g:tar_shq")
87ff034194SBram Moolenaar if exists("+shq") && exists("&shq") && &shq != ""
888c8de839SBram Moolenaar  let g:tar_shq= &shq
898c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16")
908c8de839SBram Moolenaar  if exists("g:netrw_cygwin") && g:netrw_cygwin
91c81e5e79SBram Moolenaar   let g:tar_shq= "'"
92c81e5e79SBram Moolenaar  else
93c81e5e79SBram Moolenaar   let g:tar_shq= '"'
94c81e5e79SBram Moolenaar  endif
958c8de839SBram Moolenaar else
968c8de839SBram Moolenaar  let g:tar_shq= "'"
978c8de839SBram Moolenaar endif
988c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">")
99c81e5e79SBram Moolenaarendif
100a5792f58SBram Moolenaar
101a5792f58SBram Moolenaar" ----------------
102a5792f58SBram Moolenaar"  Functions: {{{1
103a5792f58SBram Moolenaar" ----------------
104a5792f58SBram Moolenaar
105a5792f58SBram Moolenaar" ---------------------------------------------------------------------
106a5792f58SBram Moolenaar" tar#Browse: {{{2
107a5792f58SBram Moolenaarfun! tar#Browse(tarfile)
108a5792f58SBram Moolenaar"  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
109bba577a2SBram Moolenaar  let repkeep= &report
110bba577a2SBram Moolenaar  set report=10
111a5792f58SBram Moolenaar
112a5792f58SBram Moolenaar  " sanity checks
113910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
114c81e5e79SBram Moolenaar   redraw!
1152963456fSBram Moolenaar"   call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system')
116910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
117bba577a2SBram Moolenaar   let &report= repkeep
118a5792f58SBram Moolenaar"   call Dret("tar#Browse")
11987e25fdfSBram Moolenaar   return
12087e25fdfSBram Moolenaar  endif
121a5792f58SBram Moolenaar  if !filereadable(a:tarfile)
122910f66f9SBram Moolenaar"   call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
123a5792f58SBram Moolenaar   if a:tarfile !~# '^\a\+://'
1248024f936SBram Moolenaar    " if it's an url, don't complain, let url-handlers such as vim do its thing
125c81e5e79SBram Moolenaar    redraw!
1262963456fSBram Moolenaar"    call Decho("***error*** (tar#Browse) File not readable<".a:tarfile.">")
127a5792f58SBram Moolenaar    echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
12887e25fdfSBram Moolenaar   endif
129bba577a2SBram Moolenaar   let &report= repkeep
130a5792f58SBram Moolenaar"   call Dret("tar#Browse : file<".a:tarfile."> not readable")
13187e25fdfSBram Moolenaar   return
13287e25fdfSBram Moolenaar  endif
133a5792f58SBram Moolenaar  if &ma != 1
134a5792f58SBram Moolenaar   set ma
13587e25fdfSBram Moolenaar  endif
1367fc0c065SBram Moolenaar  let b:tarfile= a:tarfile
137a5792f58SBram Moolenaar
138a5792f58SBram Moolenaar  setlocal noswapfile
139a5792f58SBram Moolenaar  setlocal buftype=nofile
140a5792f58SBram Moolenaar  setlocal bufhidden=hide
141a5792f58SBram Moolenaar  setlocal nobuflisted
142a5792f58SBram Moolenaar  setlocal nowrap
143a5792f58SBram Moolenaar  set ft=tar
144a5792f58SBram Moolenaar
145a5792f58SBram Moolenaar  " give header
146910f66f9SBram Moolenaar"  call Decho("printing header")
1478c8de839SBram Moolenaar  let lastline= line("$")
1488c8de839SBram Moolenaar  call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
1498c8de839SBram Moolenaar  call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
1508c8de839SBram Moolenaar  call setline(lastline+3,'" Select a file with cursor and press ENTER')
151251e1912SBram Moolenaar  keepj $put =''
1526be7f873SBram Moolenaar  keepj sil! 0d
153251e1912SBram Moolenaar  keepj $
154a5792f58SBram Moolenaar
155910f66f9SBram Moolenaar  let tarfile= a:tarfile
156ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
157910f66f9SBram Moolenaar   " assuming cygwin
1585c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
159a5792f58SBram Moolenaar  endif
160d68071d8SBram Moolenaar  let curlast= line("$")
1612963456fSBram Moolenaar
1622963456fSBram Moolenaar  if tarfile =~# '\.\(gz\)$'
1635c73622aSBram Moolenaar"   call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
1642963456fSBram Moolenaar   exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1652963456fSBram Moolenaar
16623515b4eSBram Moolenaar  elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' || tarfile =~# '\.\(tzs\)$'
1672963456fSBram Moolenaar   if has("unix") && executable("file")
1682963456fSBram Moolenaar    let filekind= system("file ".shellescape(tarfile,1)) =~ "bzip2"
1692963456fSBram Moolenaar   else
1702963456fSBram Moolenaar    let filekind= ""
1712963456fSBram Moolenaar   endif
1722963456fSBram Moolenaar
1732963456fSBram Moolenaar   if filekind =~ "bzip2"
1742963456fSBram Moolenaar    exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1752963456fSBram Moolenaar   elseif filekind =~ "XZ"
1762963456fSBram Moolenaar    exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
17723515b4eSBram Moolenaar   elseif filekind =~ "Zstandard"
17823515b4eSBram Moolenaar    exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1792963456fSBram Moolenaar   else
1802963456fSBram Moolenaar    exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1812963456fSBram Moolenaar   endif
1822963456fSBram Moolenaar
1838c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp'
1845c73622aSBram Moolenaar"   call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
185d4a1aabeSBram Moolenaar   exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
1866be7f873SBram Moolenaar  elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$'
1875c73622aSBram Moolenaar"   call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
188251e1912SBram Moolenaar   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1896be7f873SBram Moolenaar  elseif tarfile =~# '\.\(lzma\|tlz\)$'
1905c73622aSBram Moolenaar"   call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
191251e1912SBram Moolenaar   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
192477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
193477db060SBram Moolenaar"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
194251e1912SBram Moolenaar   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
19523515b4eSBram Moolenaar  elseif tarfile =~# '\.\(zst\|tzs\)$'
19623515b4eSBram Moolenaar   exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
197910f66f9SBram Moolenaar  else
198ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
1995c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
200ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
201ed39e1d5SBram Moolenaar   endif
2025c73622aSBram Moolenaar"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
203251e1912SBram Moolenaar   exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
204910f66f9SBram Moolenaar  endif
205910f66f9SBram Moolenaar  if v:shell_error != 0
206c81e5e79SBram Moolenaar   redraw!
207d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
208d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
209d68071d8SBram Moolenaar   return
210d68071d8SBram Moolenaar  endif
2112963456fSBram Moolenaar  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~# '\c\%(warning\|error\|inappropriate\|unrecognized\)')
212c81e5e79SBram Moolenaar   redraw!
213d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
214251e1912SBram Moolenaar   keepj sil! %d
215d68071d8SBram Moolenaar   let eikeep= &ei
216d68071d8SBram Moolenaar   set ei=BufReadCmd,FileReadCmd
217c236c16dSBram Moolenaar   exe "r ".fnameescape(a:tarfile)
218d68071d8SBram Moolenaar   let &ei= eikeep
219251e1912SBram Moolenaar   keepj sil! 1d
220d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
221910f66f9SBram Moolenaar   return
222910f66f9SBram Moolenaar  endif
223a5792f58SBram Moolenaar
2242963456fSBram Moolenaar  " set up maps supported for tar
225a5792f58SBram Moolenaar  setlocal noma nomod ro
226a5792f58SBram Moolenaar  noremap <silent> <buffer>	<cr>		:call <SID>TarBrowseSelect()<cr>
2272963456fSBram Moolenaar  noremap <silent> <buffer>	x	 	:call tar#Extract()<cr>
2282963456fSBram Moolenaar  if &mouse != ""
2292963456fSBram Moolenaar   noremap <silent> <buffer>	<leftmouse>	<leftmouse>:call <SID>TarBrowseSelect()<cr>
2302963456fSBram Moolenaar  endif
231a5792f58SBram Moolenaar
232bba577a2SBram Moolenaar  let &report= repkeep
2337fc0c065SBram Moolenaar"  call Dret("tar#Browse : b:tarfile<".b:tarfile.">")
234ab194816SBram Moolenaarendfun
23587e25fdfSBram Moolenaar
236ab194816SBram Moolenaar" ---------------------------------------------------------------------
237a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
238a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
2397fc0c065SBram Moolenaar"  call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">")
240bba577a2SBram Moolenaar  let repkeep= &report
241bba577a2SBram Moolenaar  set report=10
242a5792f58SBram Moolenaar  let fname= getline(".")
243a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
244a5792f58SBram Moolenaar
245ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
246ed39e1d5SBram Moolenaar   redraw!
2475c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
248ed39e1d5SBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
249ed39e1d5SBram Moolenaar   return
250ed39e1d5SBram Moolenaar  endif
251ed39e1d5SBram Moolenaar
252a5792f58SBram Moolenaar  " sanity check
253a5792f58SBram Moolenaar  if fname =~ '^"'
254bba577a2SBram Moolenaar   let &report= repkeep
255a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
256a5792f58SBram Moolenaar   return
257a5792f58SBram Moolenaar  endif
258a5792f58SBram Moolenaar
2597fc0c065SBram Moolenaar  " about to make a new window, need to use b:tarfile
2607fc0c065SBram Moolenaar  let tarfile= b:tarfile
261a5792f58SBram Moolenaar  let curfile= expand("%")
262ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
263910f66f9SBram Moolenaar   " assuming cygwin
2645c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
265910f66f9SBram Moolenaar  endif
266a5792f58SBram Moolenaar
2672963456fSBram Moolenaar  " open a new window (tar#Read will read a file into it)
2682963456fSBram Moolenaar  noswapfile new
2698c8de839SBram Moolenaar  if !exists("g:tar_nomax") || g:tar_nomax == 0
270a5792f58SBram Moolenaar   wincmd _
2718c8de839SBram Moolenaar  endif
272a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
2738c8de839SBram Moolenaar  call tar#Read("tarfile:".tarfile.'::'.fname,1)
274a5792f58SBram Moolenaar  filetype detect
275ff034194SBram Moolenaar  set nomod
276ff034194SBram Moolenaar  exe 'com! -buffer -nargs=? -complete=file TarDiff	:call tar#Diff(<q-args>,"'.fnameescape(fname).'")'
277a5792f58SBram Moolenaar
278bba577a2SBram Moolenaar  let &report= repkeep
279a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
280a5792f58SBram Moolenaarendfun
281a5792f58SBram Moolenaar
282a5792f58SBram Moolenaar" ---------------------------------------------------------------------
283a5792f58SBram Moolenaar" tar#Read: {{{2
284a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
285a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
286bba577a2SBram Moolenaar  let repkeep= &report
287bba577a2SBram Moolenaar  set report=10
2888c8de839SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
2898c8de839SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
290ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
291910f66f9SBram Moolenaar   " assuming cygwin
2925c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
293910f66f9SBram Moolenaar  endif
294910f66f9SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
295910f66f9SBram Moolenaar"  call Decho("fname<".fname.">")
296a5792f58SBram Moolenaar
2975c73622aSBram Moolenaar  if  fname =~ '\.bz2$' && executable("bzcat")
2985c73622aSBram Moolenaar   let decmp= "|bzcat"
2995c73622aSBram Moolenaar   let doro = 1
3002963456fSBram Moolenaar  elseif      fname =~ '\.t\=gz$'  && executable("zcat")
3018c8de839SBram Moolenaar   let decmp= "|zcat"
3028c8de839SBram Moolenaar   let doro = 1
3035c73622aSBram Moolenaar  elseif  fname =~ '\.lzma$' && executable("lzcat")
3045c73622aSBram Moolenaar   let decmp= "|lzcat"
3058c8de839SBram Moolenaar   let doro = 1
306477db060SBram Moolenaar  elseif  fname =~ '\.xz$' && executable("xzcat")
307477db060SBram Moolenaar   let decmp= "|xzcat"
308477db060SBram Moolenaar   let doro = 1
30923515b4eSBram Moolenaar  elseif  fname =~ '\.zst$' && executable("zstdcat")
31023515b4eSBram Moolenaar   let decmp= "|zstdcat"
31123515b4eSBram Moolenaar   let doro = 1
312a5792f58SBram Moolenaar  else
3138c8de839SBram Moolenaar   let decmp=""
3148c8de839SBram Moolenaar   let doro = 0
315477db060SBram Moolenaar   if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$'
3168c8de839SBram Moolenaar    setlocal bin
317a5792f58SBram Moolenaar   endif
3188c8de839SBram Moolenaar  endif
3198c8de839SBram Moolenaar
320ed39e1d5SBram Moolenaar  if exists("g:tar_secure")
321ed39e1d5SBram Moolenaar   let tar_secure= " -- "
3228c8de839SBram Moolenaar  else
323ed39e1d5SBram Moolenaar   let tar_secure= " "
324ed39e1d5SBram Moolenaar  endif
32520aac6c1SBram Moolenaar
3265c73622aSBram Moolenaar  if tarfile =~# '\.bz2$'
327251e1912SBram Moolenaar   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
3282963456fSBram Moolenaar  elseif tarfile =~# '\.\(gz\)$'
3292963456fSBram Moolenaar   exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
3302963456fSBram Moolenaar
3312963456fSBram Moolenaar  elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)'
3322963456fSBram Moolenaar   if has("unix") && executable("file")
3332963456fSBram Moolenaar    let filekind= system("file ".shellescape(tarfile,1))
3342963456fSBram Moolenaar   else
3352963456fSBram Moolenaar    let filekind= ""
3362963456fSBram Moolenaar   endif
3372963456fSBram Moolenaar   if filekind =~ "bzip2"
3382963456fSBram Moolenaar    exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
3392963456fSBram Moolenaar   elseif filekind =~ "XZ"
3402963456fSBram Moolenaar    exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
34123515b4eSBram Moolenaar   elseif filekind =~ "Zstandard"
34223515b4eSBram Moolenaar    exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
3432963456fSBram Moolenaar   else
3442963456fSBram Moolenaar    exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
3452963456fSBram Moolenaar   endif
3462963456fSBram Moolenaar
347ed39e1d5SBram Moolenaar  elseif tarfile =~# '\.lrp$'
348d4a1aabeSBram Moolenaar   exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
3495c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma$'
350251e1912SBram Moolenaar   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
351477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
352251e1912SBram Moolenaar   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
353ed39e1d5SBram Moolenaar  else
354ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
3555c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
356ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
357ed39e1d5SBram Moolenaar   endif
3585c73622aSBram Moolenaar"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
3595c73622aSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
3608c8de839SBram Moolenaar  endif
3618c8de839SBram Moolenaar
3628c8de839SBram Moolenaar  if doro
3638c8de839SBram Moolenaar   " because the reverse process of compressing changed files back into the tarball is not currently supported
3648c8de839SBram Moolenaar   setlocal ro
3658c8de839SBram Moolenaar  endif
3668c8de839SBram Moolenaar
3677fc0c065SBram Moolenaar  let b:tarfile= a:fname
368c236c16dSBram Moolenaar  exe "file tarfile::".fnameescape(fname)
369a5792f58SBram Moolenaar
370a5792f58SBram Moolenaar  " cleanup
371251e1912SBram Moolenaar  keepj sil! 0d
372a5792f58SBram Moolenaar  set nomod
373a5792f58SBram Moolenaar
374bba577a2SBram Moolenaar  let &report= repkeep
3757fc0c065SBram Moolenaar"  call Dret("tar#Read : b:tarfile<".b:tarfile.">")
376a5792f58SBram Moolenaarendfun
377a5792f58SBram Moolenaar
378a5792f58SBram Moolenaar" ---------------------------------------------------------------------
379a5792f58SBram Moolenaar" tar#Write: {{{2
380a5792f58SBram Moolenaarfun! tar#Write(fname)
3817fc0c065SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
382bba577a2SBram Moolenaar  let repkeep= &report
383bba577a2SBram Moolenaar  set report=10
384a5792f58SBram Moolenaar
385ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
386ed39e1d5SBram Moolenaar   redraw!
3875c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
388ed39e1d5SBram Moolenaar"   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
389ed39e1d5SBram Moolenaar   return
390ed39e1d5SBram Moolenaar  endif
391ed39e1d5SBram Moolenaar
392ab194816SBram Moolenaar  " sanity checks
393910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
394c81e5e79SBram Moolenaar   redraw!
3952963456fSBram Moolenaar"   call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system')
396bba577a2SBram Moolenaar   let &report= repkeep
397ab194816SBram Moolenaar"   call Dret("tar#Write")
398ab194816SBram Moolenaar   return
399ab194816SBram Moolenaar  endif
400ab194816SBram Moolenaar  if !exists("*mkdir")
401c81e5e79SBram Moolenaar   redraw!
4022963456fSBram Moolenaar"   call Decho("***error*** (tar#Write) sorry, mkdir() doesn't work on your system")
403a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
404bba577a2SBram Moolenaar   let &report= repkeep
405ab194816SBram Moolenaar"   call Dret("tar#Write")
406ab194816SBram Moolenaar   return
407ab194816SBram Moolenaar  endif
408ab194816SBram Moolenaar
409ab194816SBram Moolenaar  let curdir= getcwd()
410ab194816SBram Moolenaar  let tmpdir= tempname()
411ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
412ab194816SBram Moolenaar  if tmpdir =~ '\.'
413ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
414ab194816SBram Moolenaar  endif
415ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
416ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
417ab194816SBram Moolenaar
418ab194816SBram Moolenaar  " attempt to change to the indicated directory
419ab194816SBram Moolenaar  try
4208c8de839SBram Moolenaar   exe "cd ".fnameescape(tmpdir)
421ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
422c81e5e79SBram Moolenaar   redraw!
4232963456fSBram Moolenaar"   call Decho("***error*** (tar#Write) cannot cd to temporary directory")
424a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
425bba577a2SBram Moolenaar   let &report= repkeep
426ab194816SBram Moolenaar"   call Dret("tar#Write")
427ab194816SBram Moolenaar   return
428ab194816SBram Moolenaar  endtry
429ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
430ab194816SBram Moolenaar
431a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
432a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
433a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
434ab194816SBram Moolenaar  endif
435a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
436a5792f58SBram Moolenaar  cd _ZIPVIM_
437ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
438ab194816SBram Moolenaar
4397fc0c065SBram Moolenaar  let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
4407fc0c065SBram Moolenaar  let fname   = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
441a5792f58SBram Moolenaar
442a5792f58SBram Moolenaar  " handle compressed archives
4435c73622aSBram Moolenaar  if tarfile =~# '\.bz2'
4445c73622aSBram Moolenaar   call system("bzip2 -d -- ".shellescape(tarfile,0))
4455c73622aSBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
4465c73622aSBram Moolenaar   let compress= "bzip2 -- ".shellescape(tarfile,0)
4475c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
4485c73622aSBram Moolenaar  elseif tarfile =~# '\.gz'
4492963456fSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
450a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
4515c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
4525c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
453a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
4542963456fSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
455a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
4565c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
457a5792f58SBram Moolenaar   let tgz     = 1
458ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
459477db060SBram Moolenaar  elseif tarfile =~# '\.xz'
460477db060SBram Moolenaar   call system("xz -d -- ".shellescape(tarfile,0))
461477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.xz','','e')
462477db060SBram Moolenaar   let compress= "xz -- ".shellescape(tarfile,0)
463477db060SBram Moolenaar"   call Decho("compress<".compress.">")
46423515b4eSBram Moolenaar  elseif tarfile =~# '\.zst'
46523515b4eSBram Moolenaar   call system("zstd --decompress -- ".shellescape(tarfile,0))
46623515b4eSBram Moolenaar   let tarfile = substitute(tarfile,'\.zst','','e')
46723515b4eSBram Moolenaar   let compress= "zstd -- ".shellescape(tarfile,0)
468477db060SBram Moolenaar  elseif tarfile =~# '\.lzma'
469477db060SBram Moolenaar   call system("lzma -d -- ".shellescape(tarfile,0))
470477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.lzma','','e')
471477db060SBram Moolenaar   let compress= "lzma -- ".shellescape(tarfile,0)
472477db060SBram Moolenaar"   call Decho("compress<".compress.">")
473a5792f58SBram Moolenaar  endif
4748c8de839SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
475a5792f58SBram Moolenaar
476a5792f58SBram Moolenaar  if v:shell_error != 0
477c81e5e79SBram Moolenaar   redraw!
4782963456fSBram Moolenaar"   call Decho("***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname)
479a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
480a5792f58SBram Moolenaar  else
481a5792f58SBram Moolenaar
482a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
483a5792f58SBram Moolenaar
4841cbe5f73SBram Moolenaar   if fname =~ '/'
485a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
486ff034194SBram Moolenaar    if has("win32unix") && executable("cygpath")
4875c73622aSBram Moolenaar     let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
4881cbe5f73SBram Moolenaar    endif
4891cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
4901cbe5f73SBram Moolenaar   endif
491a5792f58SBram Moolenaar   if tarfile !~ '/'
492a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
493a5792f58SBram Moolenaar   endif
494ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
495ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
496ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
497ed39e1d5SBram Moolenaar   endif
498a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
499a5792f58SBram Moolenaar
500ed39e1d5SBram Moolenaar   if exists("g:tar_secure")
501ed39e1d5SBram Moolenaar    let tar_secure= " -- "
502ed39e1d5SBram Moolenaar   else
503ed39e1d5SBram Moolenaar    let tar_secure= " "
504ed39e1d5SBram Moolenaar   endif
5058c8de839SBram Moolenaar   exe "w! ".fnameescape(fname)
506ff034194SBram Moolenaar   if has("win32unix") && executable("cygpath")
5075c73622aSBram Moolenaar    let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
508ab194816SBram Moolenaar   endif
509ab194816SBram Moolenaar
510a5792f58SBram Moolenaar   " delete old file from tarfile
5112963456fSBram Moolenaar"   call Decho("system(".g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
5122963456fSBram Moolenaar   call system(g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
513ab194816SBram Moolenaar   if v:shell_error != 0
514c81e5e79SBram Moolenaar    redraw!
5152963456fSBram Moolenaar"    call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname))
5168c8de839SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
517ab194816SBram Moolenaar   else
518a5792f58SBram Moolenaar
519a5792f58SBram Moolenaar    " update tarfile with new file
5205c73622aSBram Moolenaar"    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
5215c73622aSBram Moolenaar    call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
522a5792f58SBram Moolenaar    if v:shell_error != 0
523c81e5e79SBram Moolenaar     redraw!
5242963456fSBram Moolenaar"     call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname))
5258c8de839SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
526a5792f58SBram Moolenaar    elseif exists("compress")
527a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
528a5792f58SBram Moolenaar     call system(compress)
529a5792f58SBram Moolenaar     if exists("tgz")
530a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
531a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
532a5792f58SBram Moolenaar     endif
533a5792f58SBram Moolenaar    endif
534a5792f58SBram Moolenaar   endif
535a5792f58SBram Moolenaar
536a5792f58SBram Moolenaar   " support writing tarfiles across a network
537a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
538a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
539a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
5402963456fSBram Moolenaar    1split|noswapfile enew
5415c73622aSBram Moolenaar    let binkeep= &l:binary
542a5792f58SBram Moolenaar    let eikeep = &ei
543a5792f58SBram Moolenaar    set binary ei=all
5442963456fSBram Moolenaar    exe "noswapfile e! ".fnameescape(tarfile)
545a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
546a5792f58SBram Moolenaar    let &ei       = eikeep
5475c73622aSBram Moolenaar    let &l:binary = binkeep
548a5792f58SBram Moolenaar    q!
549a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
550a5792f58SBram Moolenaar   endif
551ab194816SBram Moolenaar  endif
552ab194816SBram Moolenaar
553ab194816SBram Moolenaar  " cleanup and restore current directory
554ab194816SBram Moolenaar  cd ..
555a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
556c236c16dSBram Moolenaar  exe "cd ".fnameescape(curdir)
557ab194816SBram Moolenaar  setlocal nomod
558ab194816SBram Moolenaar
559bba577a2SBram Moolenaar  let &report= repkeep
560ab194816SBram Moolenaar"  call Dret("tar#Write")
561ab194816SBram Moolenaarendfun
562ab194816SBram Moolenaar
563ab194816SBram Moolenaar" ---------------------------------------------------------------------
564ff034194SBram Moolenaar" tar#Diff: {{{2
565ff034194SBram Moolenaarfun! tar#Diff(userfname,fname)
566ff034194SBram Moolenaar"  call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")")
567ff034194SBram Moolenaar  let fname= a:fname
568ff034194SBram Moolenaar  if a:userfname != ""
569ff034194SBram Moolenaar   let fname= a:userfname
570ff034194SBram Moolenaar  endif
571ff034194SBram Moolenaar  if filereadable(fname)
572ff034194SBram Moolenaar   " sets current file (from tarball) for diff'ing
573ff034194SBram Moolenaar   " splits window vertically
574ff034194SBram Moolenaar   " opens original file, sets it for diff'ing
575ff034194SBram Moolenaar   " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes)
576ff034194SBram Moolenaar   diffthis
577ff034194SBram Moolenaar   wincmd v
5782963456fSBram Moolenaar   exe "noswapfile e ".fnameescape(fname)
579ff034194SBram Moolenaar   diffthis
580ff034194SBram Moolenaar  else
581ff034194SBram Moolenaar   redraw!
582ff034194SBram Moolenaar   echo "***warning*** unable to read file<".fname.">"
583ff034194SBram Moolenaar  endif
584ff034194SBram Moolenaar"  call Dret("tar#Diff")
585ff034194SBram Moolenaarendfun
586ff034194SBram Moolenaar
587ff034194SBram Moolenaar" ---------------------------------------------------------------------
5882963456fSBram Moolenaar" tar#Extract: extract a file from a (possibly compressed) tar archive {{{2
5892963456fSBram Moolenaarfun! tar#Extract()
5902963456fSBram Moolenaar"  call Dfunc("tar#Extract()")
5912963456fSBram Moolenaar
5922963456fSBram Moolenaar  let repkeep= &report
5932963456fSBram Moolenaar  set report=10
5942963456fSBram Moolenaar  let fname= getline(".")
5952963456fSBram Moolenaar"  call Decho("fname<".fname.">")
5962963456fSBram Moolenaar
5972963456fSBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
5982963456fSBram Moolenaar   redraw!
5992963456fSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
6002963456fSBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
6012963456fSBram Moolenaar   return
6022963456fSBram Moolenaar  endif
6032963456fSBram Moolenaar
6042963456fSBram Moolenaar  " sanity check
6052963456fSBram Moolenaar  if fname =~ '^"'
6062963456fSBram Moolenaar   let &report= repkeep
6072963456fSBram Moolenaar"   call Dret("TarBrowseSelect")
6082963456fSBram Moolenaar   return
6092963456fSBram Moolenaar  endif
6102963456fSBram Moolenaar
6112963456fSBram Moolenaar  let tarball = expand("%")
6122963456fSBram Moolenaar"  call Decho("tarball<".tarball.">")
6132963456fSBram Moolenaar  let tarbase = substitute(tarball,'\..*$','','')
6142963456fSBram Moolenaar"  call Decho("tarbase<".tarbase.">")
6152963456fSBram Moolenaar
6162963456fSBram Moolenaar  let extractcmd= netrw#WinPath(g:tar_extractcmd)
6172963456fSBram Moolenaar  if filereadable(tarbase.".tar")
6182963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname).")")
6192963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname))
6202963456fSBram Moolenaar   if v:shell_error != 0
6212963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!" | echohl NONE
6222963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!")
6232963456fSBram Moolenaar   else
6242963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
6252963456fSBram Moolenaar   endif
6262963456fSBram Moolenaar
6272963456fSBram Moolenaar  elseif filereadable(tarbase.".tgz")
6282963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-z","")
6292963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname).")")
6302963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname))
6312963456fSBram Moolenaar   if v:shell_error != 0
6322963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tgz ".fname.": failed!" | echohl NONE
6332963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd."t ".tarbase.".tgz ".fname.": failed!")
6342963456fSBram Moolenaar   else
6352963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
6362963456fSBram Moolenaar   endif
6372963456fSBram Moolenaar
6382963456fSBram Moolenaar  elseif filereadable(tarbase.".tar.gz")
6392963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-z","")
6402963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname).")")
6412963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname))
6422963456fSBram Moolenaar   if v:shell_error != 0
6432963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!" | echohl NONE
6442963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!")
6452963456fSBram Moolenaar   else
6462963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
6472963456fSBram Moolenaar   endif
6482963456fSBram Moolenaar
6492963456fSBram Moolenaar  elseif filereadable(tarbase.".tbz")
6502963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-j","")
6512963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname).")")
6522963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname))
6532963456fSBram Moolenaar   if v:shell_error != 0
6542963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!" | echohl NONE
6552963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!")
6562963456fSBram Moolenaar   else
6572963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
6582963456fSBram Moolenaar   endif
6592963456fSBram Moolenaar
6602963456fSBram Moolenaar  elseif filereadable(tarbase.".tar.bz2")
6612963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-j","")
6622963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname).")")
6632963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname))
6642963456fSBram Moolenaar   if v:shell_error != 0
6652963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!" | echohl NONE
6662963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!")
6672963456fSBram Moolenaar   else
6682963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
6692963456fSBram Moolenaar   endif
6702963456fSBram Moolenaar
6712963456fSBram Moolenaar  elseif filereadable(tarbase.".txz")
6722963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-J","")
6732963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname).")")
6742963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname))
6752963456fSBram Moolenaar   if v:shell_error != 0
6762963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!" | echohl NONE
6772963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!")
6782963456fSBram Moolenaar   else
6792963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
6802963456fSBram Moolenaar   endif
6812963456fSBram Moolenaar
6822963456fSBram Moolenaar  elseif filereadable(tarbase.".tar.xz")
6832963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-J","")
6842963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname).")")
6852963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname))
6862963456fSBram Moolenaar   if v:shell_error != 0
6872963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!" | echohl NONE
6882963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!")
6892963456fSBram Moolenaar   else
6902963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
6912963456fSBram Moolenaar   endif
69223515b4eSBram Moolenaar
69323515b4eSBram Moolenaar  elseif filereadable(tarbase.".tzs")
69423515b4eSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","--zstd","")
69523515b4eSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tzs ".shellescape(fname).")")
69623515b4eSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname))
69723515b4eSBram Moolenaar   if v:shell_error != 0
69823515b4eSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!" | echohl NONE
69923515b4eSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!")
70023515b4eSBram Moolenaar   else
70123515b4eSBram Moolenaar    echo "***note*** successfully extracted ".fname
70223515b4eSBram Moolenaar   endif
70323515b4eSBram Moolenaar
70423515b4eSBram Moolenaar  elseif filereadable(tarbase.".tar.zst")
70523515b4eSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","--zstd","")
70623515b4eSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.zst ".shellescape(fname).")")
70723515b4eSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname))
70823515b4eSBram Moolenaar   if v:shell_error != 0
70923515b4eSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!" | echohl NONE
71023515b4eSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!")
71123515b4eSBram Moolenaar   else
71223515b4eSBram Moolenaar    echo "***note*** successfully extracted ".fname
71323515b4eSBram Moolenaar   endif
7142963456fSBram Moolenaar  endif
7152963456fSBram Moolenaar
7162963456fSBram Moolenaar  " restore option
7172963456fSBram Moolenaar  let &report= repkeep
7182963456fSBram Moolenaar
7192963456fSBram Moolenaar"  call Dret("tar#Extract")
7202963456fSBram Moolenaarendfun
7212963456fSBram Moolenaar
7222963456fSBram Moolenaar" ---------------------------------------------------------------------
7235c73622aSBram Moolenaar" s:Rmdir: {{{2
724ab194816SBram Moolenaarfun! s:Rmdir(fname)
725ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
726ab194816SBram Moolenaar  if has("unix")
7275c73622aSBram Moolenaar   call system("/bin/rm -rf -- ".shellescape(a:fname,0))
728ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
729ab194816SBram Moolenaar   if &shell =~? "sh$"
7305c73622aSBram Moolenaar    call system("/bin/rm -rf -- ".shellescape(a:fname,0))
731ab194816SBram Moolenaar   else
7325c73622aSBram Moolenaar    call system("del /S ".shellescape(a:fname,0))
733ab194816SBram Moolenaar   endif
734ab194816SBram Moolenaar  endif
735ab194816SBram Moolenaar"  call Dret("Rmdir")
736ab194816SBram Moolenaarendfun
737ab194816SBram Moolenaar
7388c8de839SBram Moolenaar" ---------------------------------------------------------------------
7395c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
7405c73622aSBram Moolenaarfun! tar#Vimuntar(...)
7415c73622aSBram Moolenaar"  call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
7425c73622aSBram Moolenaar  let tarball = expand("%")
7435c73622aSBram Moolenaar"  call Decho("tarball<".tarball.">")
7445c73622aSBram Moolenaar  let tarbase = substitute(tarball,'\..*$','','')
7455c73622aSBram Moolenaar"  call Decho("tarbase<".tarbase.">")
7465c73622aSBram Moolenaar  let tarhome = expand("%:p")
7475c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
7485c73622aSBram Moolenaar   let tarhome= substitute(tarhome,'\\','/','g')
7495c73622aSBram Moolenaar  endif
7505c73622aSBram Moolenaar  let tarhome= substitute(tarhome,'/[^/]*$','','')
7515c73622aSBram Moolenaar"  call Decho("tarhome<".tarhome.">")
7525c73622aSBram Moolenaar  let tartail = expand("%:t")
7535c73622aSBram Moolenaar"  call Decho("tartail<".tartail.">")
7545c73622aSBram Moolenaar  let curdir  = getcwd()
7555c73622aSBram Moolenaar"  call Decho("curdir <".curdir.">")
7565c73622aSBram Moolenaar  " set up vimhome
7575c73622aSBram Moolenaar  if a:0 > 0 && a:1 != ""
7585c73622aSBram Moolenaar   let vimhome= a:1
759c236c16dSBram Moolenaar  else
7605c73622aSBram Moolenaar   let vimhome= vimball#VimballHome()
7615c73622aSBram Moolenaar  endif
7625c73622aSBram Moolenaar"  call Decho("vimhome<".vimhome.">")
7635c73622aSBram Moolenaar
7645c73622aSBram Moolenaar"  call Decho("curdir<".curdir."> vimhome<".vimhome.">")
7655c73622aSBram Moolenaar  if simplify(curdir) != simplify(vimhome)
7665c73622aSBram Moolenaar   " copy (possibly compressed) tarball to .vim/vimfiles
7675c73622aSBram Moolenaar"   call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
7685c73622aSBram Moolenaar   call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
7695c73622aSBram Moolenaar"   call Decho("exe cd ".fnameescape(vimhome))
7705c73622aSBram Moolenaar   exe "cd ".fnameescape(vimhome)
7715c73622aSBram Moolenaar  endif
7725c73622aSBram Moolenaar"  call Decho("getcwd<".getcwd().">")
7735c73622aSBram Moolenaar
7745c73622aSBram Moolenaar  " if necessary, decompress the tarball; then, extract it
7755c73622aSBram Moolenaar  if tartail =~ '\.tgz'
7762963456fSBram Moolenaar   if executable("gunzip")
7775c73622aSBram Moolenaar    silent exe "!gunzip ".shellescape(tartail)
7785c73622aSBram Moolenaar   elseif executable("gzip")
7795c73622aSBram Moolenaar    silent exe "!gzip -d ".shellescape(tartail)
7805c73622aSBram Moolenaar   else
781*6c391a74SBram Moolenaar    echoerr "unable to decompress<".tartail."> on this system"
7825c73622aSBram Moolenaar    if simplify(curdir) != simplify(tarhome)
7835c73622aSBram Moolenaar     " remove decompressed tarball, restore directory
7845c73622aSBram Moolenaar"     call Decho("delete(".tartail.".tar)")
7855c73622aSBram Moolenaar     call delete(tartail.".tar")
7865c73622aSBram Moolenaar"     call Decho("exe cd ".fnameescape(curdir))
7875c73622aSBram Moolenaar     exe "cd ".fnameescape(curdir)
7885c73622aSBram Moolenaar    endif
7895c73622aSBram Moolenaar"    call Dret("tar#Vimuntar")
7905c73622aSBram Moolenaar    return
791c236c16dSBram Moolenaar   endif
7928c8de839SBram Moolenaar  else
7935c73622aSBram Moolenaar   call vimball#Decompress(tartail,0)
7948c8de839SBram Moolenaar  endif
7955c73622aSBram Moolenaar  let extractcmd= netrw#WinPath(g:tar_extractcmd)
7965c73622aSBram Moolenaar"  call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
7975c73622aSBram Moolenaar  call system(extractcmd." ".shellescape(tarbase.".tar"))
7985c73622aSBram Moolenaar
7995c73622aSBram Moolenaar  " set up help
8005c73622aSBram Moolenaar  if filereadable("doc/".tarbase.".txt")
8015c73622aSBram Moolenaar"   call Decho("exe helptags ".getcwd()."/doc")
8025c73622aSBram Moolenaar   exe "helptags ".getcwd()."/doc"
8035c73622aSBram Moolenaar  endif
8045c73622aSBram Moolenaar
8055c73622aSBram Moolenaar  if simplify(tarhome) != simplify(vimhome)
8065c73622aSBram Moolenaar   " remove decompressed tarball, restore directory
8075c73622aSBram Moolenaar   call delete(vimhome."/".tarbase.".tar")
8085c73622aSBram Moolenaar   exe "cd ".fnameescape(curdir)
8095c73622aSBram Moolenaar  endif
8105c73622aSBram Moolenaar
8115c73622aSBram Moolenaar"  call Dret("tar#Vimuntar")
8128c8de839SBram Moolenaarendfun
8138c8de839SBram Moolenaar
8145c73622aSBram Moolenaar" =====================================================================
815a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
816a5792f58SBram Moolenaarlet &cpo= s:keepcpo
817a5792f58SBram Moolenaarunlet s:keepcpo
818a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
819