xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision 2963456f)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*2963456fSBram Moolenaar" Date:		Jan 07, 2020
4*2963456fSBram Moolenaar" Version:	32
5*2963456fSBram 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"
10*2963456fSBram 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
25*2963456fSBram 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
51*2963456fSBram Moolenaarif !exists("g:tar_delfile")
52*2963456fSBram Moolenaar let g:tar_delfile="--delete -f"
53*2963456fSBram 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!
115*2963456fSBram 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\+://'
124*2963456fSBram Moolenaar    " if its an url, don't complain, let url-handlers such as vim do its thing
125c81e5e79SBram Moolenaar    redraw!
126*2963456fSBram 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("$")
161*2963456fSBram Moolenaar
162*2963456fSBram Moolenaar  if tarfile =~# '\.\(gz\)$'
1635c73622aSBram Moolenaar"   call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
164*2963456fSBram Moolenaar   exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
165*2963456fSBram Moolenaar
166*2963456fSBram Moolenaar  elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$'
167*2963456fSBram Moolenaar   if has("unix") && executable("file")
168*2963456fSBram Moolenaar    let filekind= system("file ".shellescape(tarfile,1)) =~ "bzip2"
169*2963456fSBram Moolenaar   else
170*2963456fSBram Moolenaar    let filekind= ""
171*2963456fSBram Moolenaar   endif
172*2963456fSBram Moolenaar
173*2963456fSBram Moolenaar   if filekind =~ "bzip2"
174*2963456fSBram Moolenaar    exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
175*2963456fSBram Moolenaar   elseif filekind =~ "XZ"
176*2963456fSBram Moolenaar    exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
177*2963456fSBram Moolenaar   else
178*2963456fSBram Moolenaar    exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
179*2963456fSBram Moolenaar   endif
180*2963456fSBram Moolenaar
1818c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp'
1825c73622aSBram Moolenaar"   call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
183d4a1aabeSBram Moolenaar   exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
1846be7f873SBram Moolenaar  elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$'
1855c73622aSBram Moolenaar"   call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
186251e1912SBram Moolenaar   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1876be7f873SBram Moolenaar  elseif tarfile =~# '\.\(lzma\|tlz\)$'
1885c73622aSBram Moolenaar"   call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
189251e1912SBram Moolenaar   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
190477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
191477db060SBram Moolenaar"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
192251e1912SBram Moolenaar   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
193910f66f9SBram Moolenaar  else
194ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
1955c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
196ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
197ed39e1d5SBram Moolenaar   endif
1985c73622aSBram Moolenaar"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
199251e1912SBram Moolenaar   exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
200910f66f9SBram Moolenaar  endif
201910f66f9SBram Moolenaar  if v:shell_error != 0
202c81e5e79SBram Moolenaar   redraw!
203d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
204d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
205d68071d8SBram Moolenaar   return
206d68071d8SBram Moolenaar  endif
207*2963456fSBram Moolenaar  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~# '\c\%(warning\|error\|inappropriate\|unrecognized\)')
208c81e5e79SBram Moolenaar   redraw!
209d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
210251e1912SBram Moolenaar   keepj sil! %d
211d68071d8SBram Moolenaar   let eikeep= &ei
212d68071d8SBram Moolenaar   set ei=BufReadCmd,FileReadCmd
213c236c16dSBram Moolenaar   exe "r ".fnameescape(a:tarfile)
214d68071d8SBram Moolenaar   let &ei= eikeep
215251e1912SBram Moolenaar   keepj sil! 1d
216d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
217910f66f9SBram Moolenaar   return
218910f66f9SBram Moolenaar  endif
219a5792f58SBram Moolenaar
220*2963456fSBram Moolenaar  " set up maps supported for tar
221a5792f58SBram Moolenaar  setlocal noma nomod ro
222a5792f58SBram Moolenaar  noremap <silent> <buffer>	<cr>		:call <SID>TarBrowseSelect()<cr>
223*2963456fSBram Moolenaar  noremap <silent> <buffer>	x	 	:call tar#Extract()<cr>
224*2963456fSBram Moolenaar  if &mouse != ""
225*2963456fSBram Moolenaar   noremap <silent> <buffer>	<leftmouse>	<leftmouse>:call <SID>TarBrowseSelect()<cr>
226*2963456fSBram Moolenaar  endif
227a5792f58SBram Moolenaar
228bba577a2SBram Moolenaar  let &report= repkeep
2297fc0c065SBram Moolenaar"  call Dret("tar#Browse : b:tarfile<".b:tarfile.">")
230ab194816SBram Moolenaarendfun
23187e25fdfSBram Moolenaar
232ab194816SBram Moolenaar" ---------------------------------------------------------------------
233a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
234a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
2357fc0c065SBram Moolenaar"  call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">")
236bba577a2SBram Moolenaar  let repkeep= &report
237bba577a2SBram Moolenaar  set report=10
238a5792f58SBram Moolenaar  let fname= getline(".")
239a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
240a5792f58SBram Moolenaar
241ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
242ed39e1d5SBram Moolenaar   redraw!
2435c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
244ed39e1d5SBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
245ed39e1d5SBram Moolenaar   return
246ed39e1d5SBram Moolenaar  endif
247ed39e1d5SBram Moolenaar
248a5792f58SBram Moolenaar  " sanity check
249a5792f58SBram Moolenaar  if fname =~ '^"'
250bba577a2SBram Moolenaar   let &report= repkeep
251a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
252a5792f58SBram Moolenaar   return
253a5792f58SBram Moolenaar  endif
254a5792f58SBram Moolenaar
2557fc0c065SBram Moolenaar  " about to make a new window, need to use b:tarfile
2567fc0c065SBram Moolenaar  let tarfile= b:tarfile
257a5792f58SBram Moolenaar  let curfile= expand("%")
258ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
259910f66f9SBram Moolenaar   " assuming cygwin
2605c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
261910f66f9SBram Moolenaar  endif
262a5792f58SBram Moolenaar
263*2963456fSBram Moolenaar  " open a new window (tar#Read will read a file into it)
264*2963456fSBram Moolenaar  noswapfile new
2658c8de839SBram Moolenaar  if !exists("g:tar_nomax") || g:tar_nomax == 0
266a5792f58SBram Moolenaar   wincmd _
2678c8de839SBram Moolenaar  endif
268a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
2698c8de839SBram Moolenaar  call tar#Read("tarfile:".tarfile.'::'.fname,1)
270a5792f58SBram Moolenaar  filetype detect
271ff034194SBram Moolenaar  set nomod
272ff034194SBram Moolenaar  exe 'com! -buffer -nargs=? -complete=file TarDiff	:call tar#Diff(<q-args>,"'.fnameescape(fname).'")'
273a5792f58SBram Moolenaar
274bba577a2SBram Moolenaar  let &report= repkeep
275a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
276a5792f58SBram Moolenaarendfun
277a5792f58SBram Moolenaar
278a5792f58SBram Moolenaar" ---------------------------------------------------------------------
279a5792f58SBram Moolenaar" tar#Read: {{{2
280a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
281a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
282bba577a2SBram Moolenaar  let repkeep= &report
283bba577a2SBram Moolenaar  set report=10
2848c8de839SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
2858c8de839SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
286ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
287910f66f9SBram Moolenaar   " assuming cygwin
2885c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
289910f66f9SBram Moolenaar  endif
290910f66f9SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
291910f66f9SBram Moolenaar"  call Decho("fname<".fname.">")
292a5792f58SBram Moolenaar
2935c73622aSBram Moolenaar  if  fname =~ '\.bz2$' && executable("bzcat")
2945c73622aSBram Moolenaar   let decmp= "|bzcat"
2955c73622aSBram Moolenaar   let doro = 1
296*2963456fSBram Moolenaar  elseif      fname =~ '\.t\=gz$'  && executable("zcat")
2978c8de839SBram Moolenaar   let decmp= "|zcat"
2988c8de839SBram Moolenaar   let doro = 1
2995c73622aSBram Moolenaar  elseif  fname =~ '\.lzma$' && executable("lzcat")
3005c73622aSBram Moolenaar   let decmp= "|lzcat"
3018c8de839SBram Moolenaar   let doro = 1
302477db060SBram Moolenaar  elseif  fname =~ '\.xz$' && executable("xzcat")
303477db060SBram Moolenaar   let decmp= "|xzcat"
304477db060SBram Moolenaar   let doro = 1
305a5792f58SBram Moolenaar  else
3068c8de839SBram Moolenaar   let decmp=""
3078c8de839SBram Moolenaar   let doro = 0
308477db060SBram Moolenaar   if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$'
3098c8de839SBram Moolenaar    setlocal bin
310a5792f58SBram Moolenaar   endif
3118c8de839SBram Moolenaar  endif
3128c8de839SBram Moolenaar
313ed39e1d5SBram Moolenaar  if exists("g:tar_secure")
314ed39e1d5SBram Moolenaar   let tar_secure= " -- "
3158c8de839SBram Moolenaar  else
316ed39e1d5SBram Moolenaar   let tar_secure= " "
317ed39e1d5SBram Moolenaar  endif
31820aac6c1SBram Moolenaar
3195c73622aSBram Moolenaar  if tarfile =~# '\.bz2$'
320251e1912SBram Moolenaar   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
321*2963456fSBram Moolenaar  elseif tarfile =~# '\.\(gz\)$'
322*2963456fSBram Moolenaar   exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
323*2963456fSBram Moolenaar
324*2963456fSBram Moolenaar  elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)'
325*2963456fSBram Moolenaar   if has("unix") && executable("file")
326*2963456fSBram Moolenaar    let filekind= system("file ".shellescape(tarfile,1))
327*2963456fSBram Moolenaar   else
328*2963456fSBram Moolenaar    let filekind= ""
329*2963456fSBram Moolenaar   endif
330*2963456fSBram Moolenaar   if filekind =~ "bzip2"
331*2963456fSBram Moolenaar    exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
332*2963456fSBram Moolenaar   elseif filekind =~ "XZ"
333*2963456fSBram Moolenaar    exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
334*2963456fSBram Moolenaar   else
335*2963456fSBram Moolenaar    exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
336*2963456fSBram Moolenaar   endif
337*2963456fSBram Moolenaar
338ed39e1d5SBram Moolenaar  elseif tarfile =~# '\.lrp$'
339d4a1aabeSBram Moolenaar   exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
3405c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma$'
341251e1912SBram Moolenaar   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
342477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
343251e1912SBram Moolenaar   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
344ed39e1d5SBram Moolenaar  else
345ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
3465c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
347ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
348ed39e1d5SBram Moolenaar   endif
3495c73622aSBram Moolenaar"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
3505c73622aSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
3518c8de839SBram Moolenaar  endif
3528c8de839SBram Moolenaar
3538c8de839SBram Moolenaar  if doro
3548c8de839SBram Moolenaar   " because the reverse process of compressing changed files back into the tarball is not currently supported
3558c8de839SBram Moolenaar   setlocal ro
3568c8de839SBram Moolenaar  endif
3578c8de839SBram Moolenaar
3587fc0c065SBram Moolenaar  let b:tarfile= a:fname
359c236c16dSBram Moolenaar  exe "file tarfile::".fnameescape(fname)
360a5792f58SBram Moolenaar
361a5792f58SBram Moolenaar  " cleanup
362251e1912SBram Moolenaar  keepj sil! 0d
363a5792f58SBram Moolenaar  set nomod
364a5792f58SBram Moolenaar
365bba577a2SBram Moolenaar  let &report= repkeep
3667fc0c065SBram Moolenaar"  call Dret("tar#Read : b:tarfile<".b:tarfile.">")
367a5792f58SBram Moolenaarendfun
368a5792f58SBram Moolenaar
369a5792f58SBram Moolenaar" ---------------------------------------------------------------------
370a5792f58SBram Moolenaar" tar#Write: {{{2
371a5792f58SBram Moolenaarfun! tar#Write(fname)
3727fc0c065SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
373bba577a2SBram Moolenaar  let repkeep= &report
374bba577a2SBram Moolenaar  set report=10
375a5792f58SBram Moolenaar
376ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
377ed39e1d5SBram Moolenaar   redraw!
3785c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
379ed39e1d5SBram Moolenaar"   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
380ed39e1d5SBram Moolenaar   return
381ed39e1d5SBram Moolenaar  endif
382ed39e1d5SBram Moolenaar
383ab194816SBram Moolenaar  " sanity checks
384910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
385c81e5e79SBram Moolenaar   redraw!
386*2963456fSBram Moolenaar"   call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system')
387bba577a2SBram Moolenaar   let &report= repkeep
388ab194816SBram Moolenaar"   call Dret("tar#Write")
389ab194816SBram Moolenaar   return
390ab194816SBram Moolenaar  endif
391ab194816SBram Moolenaar  if !exists("*mkdir")
392c81e5e79SBram Moolenaar   redraw!
393*2963456fSBram Moolenaar"   call Decho("***error*** (tar#Write) sorry, mkdir() doesn't work on your system")
394a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
395bba577a2SBram Moolenaar   let &report= repkeep
396ab194816SBram Moolenaar"   call Dret("tar#Write")
397ab194816SBram Moolenaar   return
398ab194816SBram Moolenaar  endif
399ab194816SBram Moolenaar
400ab194816SBram Moolenaar  let curdir= getcwd()
401ab194816SBram Moolenaar  let tmpdir= tempname()
402ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
403ab194816SBram Moolenaar  if tmpdir =~ '\.'
404ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
405ab194816SBram Moolenaar  endif
406ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
407ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
408ab194816SBram Moolenaar
409ab194816SBram Moolenaar  " attempt to change to the indicated directory
410ab194816SBram Moolenaar  try
4118c8de839SBram Moolenaar   exe "cd ".fnameescape(tmpdir)
412ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
413c81e5e79SBram Moolenaar   redraw!
414*2963456fSBram Moolenaar"   call Decho("***error*** (tar#Write) cannot cd to temporary directory")
415a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
416bba577a2SBram Moolenaar   let &report= repkeep
417ab194816SBram Moolenaar"   call Dret("tar#Write")
418ab194816SBram Moolenaar   return
419ab194816SBram Moolenaar  endtry
420ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
421ab194816SBram Moolenaar
422a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
423a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
424a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
425ab194816SBram Moolenaar  endif
426a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
427a5792f58SBram Moolenaar  cd _ZIPVIM_
428ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
429ab194816SBram Moolenaar
4307fc0c065SBram Moolenaar  let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
4317fc0c065SBram Moolenaar  let fname   = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
432a5792f58SBram Moolenaar
433a5792f58SBram Moolenaar  " handle compressed archives
4345c73622aSBram Moolenaar  if tarfile =~# '\.bz2'
4355c73622aSBram Moolenaar   call system("bzip2 -d -- ".shellescape(tarfile,0))
4365c73622aSBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
4375c73622aSBram Moolenaar   let compress= "bzip2 -- ".shellescape(tarfile,0)
4385c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
4395c73622aSBram Moolenaar  elseif tarfile =~# '\.gz'
440*2963456fSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
441a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
4425c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
4435c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
444a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
445*2963456fSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
446a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
4475c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
448a5792f58SBram Moolenaar   let tgz     = 1
449ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
450477db060SBram Moolenaar  elseif tarfile =~# '\.xz'
451477db060SBram Moolenaar   call system("xz -d -- ".shellescape(tarfile,0))
452477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.xz','','e')
453477db060SBram Moolenaar   let compress= "xz -- ".shellescape(tarfile,0)
454477db060SBram Moolenaar"   call Decho("compress<".compress.">")
455477db060SBram Moolenaar  elseif tarfile =~# '\.lzma'
456477db060SBram Moolenaar   call system("lzma -d -- ".shellescape(tarfile,0))
457477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.lzma','','e')
458477db060SBram Moolenaar   let compress= "lzma -- ".shellescape(tarfile,0)
459477db060SBram Moolenaar"   call Decho("compress<".compress.">")
460a5792f58SBram Moolenaar  endif
4618c8de839SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
462a5792f58SBram Moolenaar
463a5792f58SBram Moolenaar  if v:shell_error != 0
464c81e5e79SBram Moolenaar   redraw!
465*2963456fSBram Moolenaar"   call Decho("***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname)
466a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
467a5792f58SBram Moolenaar  else
468a5792f58SBram Moolenaar
469a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
470a5792f58SBram Moolenaar
4711cbe5f73SBram Moolenaar   if fname =~ '/'
472a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
473ff034194SBram Moolenaar    if has("win32unix") && executable("cygpath")
4745c73622aSBram Moolenaar     let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
4751cbe5f73SBram Moolenaar    endif
4761cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
4771cbe5f73SBram Moolenaar   endif
478a5792f58SBram Moolenaar   if tarfile !~ '/'
479a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
480a5792f58SBram Moolenaar   endif
481ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
482ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
483ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
484ed39e1d5SBram Moolenaar   endif
485a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
486a5792f58SBram Moolenaar
487ed39e1d5SBram Moolenaar   if exists("g:tar_secure")
488ed39e1d5SBram Moolenaar    let tar_secure= " -- "
489ed39e1d5SBram Moolenaar   else
490ed39e1d5SBram Moolenaar    let tar_secure= " "
491ed39e1d5SBram Moolenaar   endif
4928c8de839SBram Moolenaar   exe "w! ".fnameescape(fname)
493ff034194SBram Moolenaar   if has("win32unix") && executable("cygpath")
4945c73622aSBram Moolenaar    let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
495ab194816SBram Moolenaar   endif
496ab194816SBram Moolenaar
497a5792f58SBram Moolenaar   " delete old file from tarfile
498*2963456fSBram Moolenaar"   call Decho("system(".g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
499*2963456fSBram Moolenaar   call system(g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
500ab194816SBram Moolenaar   if v:shell_error != 0
501c81e5e79SBram Moolenaar    redraw!
502*2963456fSBram Moolenaar"    call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname))
5038c8de839SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
504ab194816SBram Moolenaar   else
505a5792f58SBram Moolenaar
506a5792f58SBram Moolenaar    " update tarfile with new file
5075c73622aSBram Moolenaar"    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
5085c73622aSBram Moolenaar    call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
509a5792f58SBram Moolenaar    if v:shell_error != 0
510c81e5e79SBram Moolenaar     redraw!
511*2963456fSBram Moolenaar"     call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname))
5128c8de839SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
513a5792f58SBram Moolenaar    elseif exists("compress")
514a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
515a5792f58SBram Moolenaar     call system(compress)
516a5792f58SBram Moolenaar     if exists("tgz")
517a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
518a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
519a5792f58SBram Moolenaar     endif
520a5792f58SBram Moolenaar    endif
521a5792f58SBram Moolenaar   endif
522a5792f58SBram Moolenaar
523a5792f58SBram Moolenaar   " support writing tarfiles across a network
524a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
525a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
526a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
527*2963456fSBram Moolenaar    1split|noswapfile enew
5285c73622aSBram Moolenaar    let binkeep= &l:binary
529a5792f58SBram Moolenaar    let eikeep = &ei
530a5792f58SBram Moolenaar    set binary ei=all
531*2963456fSBram Moolenaar    exe "noswapfile e! ".fnameescape(tarfile)
532a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
533a5792f58SBram Moolenaar    let &ei       = eikeep
5345c73622aSBram Moolenaar    let &l:binary = binkeep
535a5792f58SBram Moolenaar    q!
536a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
537a5792f58SBram Moolenaar   endif
538ab194816SBram Moolenaar  endif
539ab194816SBram Moolenaar
540ab194816SBram Moolenaar  " cleanup and restore current directory
541ab194816SBram Moolenaar  cd ..
542a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
543c236c16dSBram Moolenaar  exe "cd ".fnameescape(curdir)
544ab194816SBram Moolenaar  setlocal nomod
545ab194816SBram Moolenaar
546bba577a2SBram Moolenaar  let &report= repkeep
547ab194816SBram Moolenaar"  call Dret("tar#Write")
548ab194816SBram Moolenaarendfun
549ab194816SBram Moolenaar
550ab194816SBram Moolenaar" ---------------------------------------------------------------------
551ff034194SBram Moolenaar" tar#Diff: {{{2
552ff034194SBram Moolenaarfun! tar#Diff(userfname,fname)
553ff034194SBram Moolenaar"  call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")")
554ff034194SBram Moolenaar  let fname= a:fname
555ff034194SBram Moolenaar  if a:userfname != ""
556ff034194SBram Moolenaar   let fname= a:userfname
557ff034194SBram Moolenaar  endif
558ff034194SBram Moolenaar  if filereadable(fname)
559ff034194SBram Moolenaar   " sets current file (from tarball) for diff'ing
560ff034194SBram Moolenaar   " splits window vertically
561ff034194SBram Moolenaar   " opens original file, sets it for diff'ing
562ff034194SBram Moolenaar   " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes)
563ff034194SBram Moolenaar   diffthis
564ff034194SBram Moolenaar   wincmd v
565*2963456fSBram Moolenaar   exe "noswapfile e ".fnameescape(fname)
566ff034194SBram Moolenaar   diffthis
567ff034194SBram Moolenaar  else
568ff034194SBram Moolenaar   redraw!
569ff034194SBram Moolenaar   echo "***warning*** unable to read file<".fname.">"
570ff034194SBram Moolenaar  endif
571ff034194SBram Moolenaar"  call Dret("tar#Diff")
572ff034194SBram Moolenaarendfun
573ff034194SBram Moolenaar
574ff034194SBram Moolenaar" ---------------------------------------------------------------------
575*2963456fSBram Moolenaar" tar#Extract: extract a file from a (possibly compressed) tar archive {{{2
576*2963456fSBram Moolenaarfun! tar#Extract()
577*2963456fSBram Moolenaar"  call Dfunc("tar#Extract()")
578*2963456fSBram Moolenaar
579*2963456fSBram Moolenaar  let repkeep= &report
580*2963456fSBram Moolenaar  set report=10
581*2963456fSBram Moolenaar  let fname= getline(".")
582*2963456fSBram Moolenaar"  call Decho("fname<".fname.">")
583*2963456fSBram Moolenaar
584*2963456fSBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
585*2963456fSBram Moolenaar   redraw!
586*2963456fSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
587*2963456fSBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
588*2963456fSBram Moolenaar   return
589*2963456fSBram Moolenaar  endif
590*2963456fSBram Moolenaar
591*2963456fSBram Moolenaar  " sanity check
592*2963456fSBram Moolenaar  if fname =~ '^"'
593*2963456fSBram Moolenaar   let &report= repkeep
594*2963456fSBram Moolenaar"   call Dret("TarBrowseSelect")
595*2963456fSBram Moolenaar   return
596*2963456fSBram Moolenaar  endif
597*2963456fSBram Moolenaar
598*2963456fSBram Moolenaar  let tarball = expand("%")
599*2963456fSBram Moolenaar"  call Decho("tarball<".tarball.">")
600*2963456fSBram Moolenaar  let tarbase = substitute(tarball,'\..*$','','')
601*2963456fSBram Moolenaar"  call Decho("tarbase<".tarbase.">")
602*2963456fSBram Moolenaar
603*2963456fSBram Moolenaar  let extractcmd= netrw#WinPath(g:tar_extractcmd)
604*2963456fSBram Moolenaar  if filereadable(tarbase.".tar")
605*2963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname).")")
606*2963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname))
607*2963456fSBram Moolenaar   if v:shell_error != 0
608*2963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!" | echohl NONE
609*2963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!")
610*2963456fSBram Moolenaar   else
611*2963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
612*2963456fSBram Moolenaar   endif
613*2963456fSBram Moolenaar
614*2963456fSBram Moolenaar  elseif filereadable(tarbase.".tgz")
615*2963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-z","")
616*2963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname).")")
617*2963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname))
618*2963456fSBram Moolenaar   if v:shell_error != 0
619*2963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tgz ".fname.": failed!" | echohl NONE
620*2963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd."t ".tarbase.".tgz ".fname.": failed!")
621*2963456fSBram Moolenaar   else
622*2963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
623*2963456fSBram Moolenaar   endif
624*2963456fSBram Moolenaar
625*2963456fSBram Moolenaar  elseif filereadable(tarbase.".tar.gz")
626*2963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-z","")
627*2963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname).")")
628*2963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname))
629*2963456fSBram Moolenaar   if v:shell_error != 0
630*2963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!" | echohl NONE
631*2963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!")
632*2963456fSBram Moolenaar   else
633*2963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
634*2963456fSBram Moolenaar   endif
635*2963456fSBram Moolenaar
636*2963456fSBram Moolenaar  elseif filereadable(tarbase.".tbz")
637*2963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-j","")
638*2963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname).")")
639*2963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname))
640*2963456fSBram Moolenaar   if v:shell_error != 0
641*2963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!" | echohl NONE
642*2963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!")
643*2963456fSBram Moolenaar   else
644*2963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
645*2963456fSBram Moolenaar   endif
646*2963456fSBram Moolenaar
647*2963456fSBram Moolenaar  elseif filereadable(tarbase.".tar.bz2")
648*2963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-j","")
649*2963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname).")")
650*2963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname))
651*2963456fSBram Moolenaar   if v:shell_error != 0
652*2963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!" | echohl NONE
653*2963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!")
654*2963456fSBram Moolenaar   else
655*2963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
656*2963456fSBram Moolenaar   endif
657*2963456fSBram Moolenaar
658*2963456fSBram Moolenaar  elseif filereadable(tarbase.".txz")
659*2963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-J","")
660*2963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname).")")
661*2963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname))
662*2963456fSBram Moolenaar   if v:shell_error != 0
663*2963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!" | echohl NONE
664*2963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!")
665*2963456fSBram Moolenaar   else
666*2963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
667*2963456fSBram Moolenaar   endif
668*2963456fSBram Moolenaar
669*2963456fSBram Moolenaar  elseif filereadable(tarbase.".tar.xz")
670*2963456fSBram Moolenaar   let extractcmd= substitute(extractcmd,"-","-J","")
671*2963456fSBram Moolenaar"   call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname).")")
672*2963456fSBram Moolenaar   call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname))
673*2963456fSBram Moolenaar   if v:shell_error != 0
674*2963456fSBram Moolenaar    echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!" | echohl NONE
675*2963456fSBram Moolenaar"    call Decho("***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!")
676*2963456fSBram Moolenaar   else
677*2963456fSBram Moolenaar    echo "***note*** successfully extracted ".fname
678*2963456fSBram Moolenaar   endif
679*2963456fSBram Moolenaar  endif
680*2963456fSBram Moolenaar
681*2963456fSBram Moolenaar  " restore option
682*2963456fSBram Moolenaar  let &report= repkeep
683*2963456fSBram Moolenaar
684*2963456fSBram Moolenaar"  call Dret("tar#Extract")
685*2963456fSBram Moolenaarendfun
686*2963456fSBram Moolenaar
687*2963456fSBram Moolenaar" ---------------------------------------------------------------------
6885c73622aSBram Moolenaar" s:Rmdir: {{{2
689ab194816SBram Moolenaarfun! s:Rmdir(fname)
690ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
691ab194816SBram Moolenaar  if has("unix")
6925c73622aSBram Moolenaar   call system("/bin/rm -rf -- ".shellescape(a:fname,0))
693ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
694ab194816SBram Moolenaar   if &shell =~? "sh$"
6955c73622aSBram Moolenaar    call system("/bin/rm -rf -- ".shellescape(a:fname,0))
696ab194816SBram Moolenaar   else
6975c73622aSBram Moolenaar    call system("del /S ".shellescape(a:fname,0))
698ab194816SBram Moolenaar   endif
699ab194816SBram Moolenaar  endif
700ab194816SBram Moolenaar"  call Dret("Rmdir")
701ab194816SBram Moolenaarendfun
702ab194816SBram Moolenaar
7038c8de839SBram Moolenaar" ---------------------------------------------------------------------
7045c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
7055c73622aSBram Moolenaarfun! tar#Vimuntar(...)
7065c73622aSBram Moolenaar"  call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
7075c73622aSBram Moolenaar  let tarball = expand("%")
7085c73622aSBram Moolenaar"  call Decho("tarball<".tarball.">")
7095c73622aSBram Moolenaar  let tarbase = substitute(tarball,'\..*$','','')
7105c73622aSBram Moolenaar"  call Decho("tarbase<".tarbase.">")
7115c73622aSBram Moolenaar  let tarhome = expand("%:p")
7125c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
7135c73622aSBram Moolenaar   let tarhome= substitute(tarhome,'\\','/','g')
7145c73622aSBram Moolenaar  endif
7155c73622aSBram Moolenaar  let tarhome= substitute(tarhome,'/[^/]*$','','')
7165c73622aSBram Moolenaar"  call Decho("tarhome<".tarhome.">")
7175c73622aSBram Moolenaar  let tartail = expand("%:t")
7185c73622aSBram Moolenaar"  call Decho("tartail<".tartail.">")
7195c73622aSBram Moolenaar  let curdir  = getcwd()
7205c73622aSBram Moolenaar"  call Decho("curdir <".curdir.">")
7215c73622aSBram Moolenaar  " set up vimhome
7225c73622aSBram Moolenaar  if a:0 > 0 && a:1 != ""
7235c73622aSBram Moolenaar   let vimhome= a:1
724c236c16dSBram Moolenaar  else
7255c73622aSBram Moolenaar   let vimhome= vimball#VimballHome()
7265c73622aSBram Moolenaar  endif
7275c73622aSBram Moolenaar"  call Decho("vimhome<".vimhome.">")
7285c73622aSBram Moolenaar
7295c73622aSBram Moolenaar"  call Decho("curdir<".curdir."> vimhome<".vimhome.">")
7305c73622aSBram Moolenaar  if simplify(curdir) != simplify(vimhome)
7315c73622aSBram Moolenaar   " copy (possibly compressed) tarball to .vim/vimfiles
7325c73622aSBram Moolenaar"   call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
7335c73622aSBram Moolenaar   call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
7345c73622aSBram Moolenaar"   call Decho("exe cd ".fnameescape(vimhome))
7355c73622aSBram Moolenaar   exe "cd ".fnameescape(vimhome)
7365c73622aSBram Moolenaar  endif
7375c73622aSBram Moolenaar"  call Decho("getcwd<".getcwd().">")
7385c73622aSBram Moolenaar
7395c73622aSBram Moolenaar  " if necessary, decompress the tarball; then, extract it
7405c73622aSBram Moolenaar  if tartail =~ '\.tgz'
741*2963456fSBram Moolenaar   if executable("gunzip")
7425c73622aSBram Moolenaar    silent exe "!gunzip ".shellescape(tartail)
7435c73622aSBram Moolenaar   elseif executable("gzip")
7445c73622aSBram Moolenaar    silent exe "!gzip -d ".shellescape(tartail)
7455c73622aSBram Moolenaar   else
7465c73622aSBram Moolenaar    echoerr "unable to decompress<".tartail."> on this sytem"
7475c73622aSBram Moolenaar    if simplify(curdir) != simplify(tarhome)
7485c73622aSBram Moolenaar     " remove decompressed tarball, restore directory
7495c73622aSBram Moolenaar"     call Decho("delete(".tartail.".tar)")
7505c73622aSBram Moolenaar     call delete(tartail.".tar")
7515c73622aSBram Moolenaar"     call Decho("exe cd ".fnameescape(curdir))
7525c73622aSBram Moolenaar     exe "cd ".fnameescape(curdir)
7535c73622aSBram Moolenaar    endif
7545c73622aSBram Moolenaar"    call Dret("tar#Vimuntar")
7555c73622aSBram Moolenaar    return
756c236c16dSBram Moolenaar   endif
7578c8de839SBram Moolenaar  else
7585c73622aSBram Moolenaar   call vimball#Decompress(tartail,0)
7598c8de839SBram Moolenaar  endif
7605c73622aSBram Moolenaar  let extractcmd= netrw#WinPath(g:tar_extractcmd)
7615c73622aSBram Moolenaar"  call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
7625c73622aSBram Moolenaar  call system(extractcmd." ".shellescape(tarbase.".tar"))
7635c73622aSBram Moolenaar
7645c73622aSBram Moolenaar  " set up help
7655c73622aSBram Moolenaar  if filereadable("doc/".tarbase.".txt")
7665c73622aSBram Moolenaar"   call Decho("exe helptags ".getcwd()."/doc")
7675c73622aSBram Moolenaar   exe "helptags ".getcwd()."/doc"
7685c73622aSBram Moolenaar  endif
7695c73622aSBram Moolenaar
7705c73622aSBram Moolenaar  if simplify(tarhome) != simplify(vimhome)
7715c73622aSBram Moolenaar   " remove decompressed tarball, restore directory
7725c73622aSBram Moolenaar   call delete(vimhome."/".tarbase.".tar")
7735c73622aSBram Moolenaar   exe "cd ".fnameescape(curdir)
7745c73622aSBram Moolenaar  endif
7755c73622aSBram Moolenaar
7765c73622aSBram Moolenaar"  call Dret("tar#Vimuntar")
7778c8de839SBram Moolenaarendfun
7788c8de839SBram Moolenaar
7795c73622aSBram Moolenaar" =====================================================================
780a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
781a5792f58SBram Moolenaarlet &cpo= s:keepcpo
782a5792f58SBram Moolenaarunlet s:keepcpo
783a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
784