xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision fcfe1a9b)
1" tar.vim: Handles browsing tarfiles
2"            AUTOLOAD PORTION
3" Date:			Apr 17, 2013
4" Version:		29
5" Maintainer:	Charles E Campbell <[email protected]>
6" License:		Vim License  (see vim's :help license)
7"
8"	Contains many ideas from Michael Toren's <tar.vim>
9"
10" Copyright:    Copyright (C) 2005-2011 Charles E. Campbell {{{1
11"               Permission is hereby granted to use and distribute this code,
12"               with or without modifications, provided that this copyright
13"               notice is copied with it. Like anything else that's free,
14"               tar.vim and tarPlugin.vim are provided *as is* and comes
15"               with no warranty of any kind, either expressed or implied.
16"               By using this plugin, you agree that in no event will the
17"               copyright holder be liable for any damages resulting from
18"               the use of this software.
19"     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
20" ---------------------------------------------------------------------
21" Load Once: {{{1
22if &cp || exists("g:loaded_tar")
23 finish
24endif
25let g:loaded_tar= "v29"
26if v:version < 702
27 echohl WarningMsg
28 echo "***warning*** this version of tar needs vim 7.2"
29 echohl Normal
30 finish
31endif
32let s:keepcpo= &cpo
33set cpo&vim
34"DechoTabOn
35"call Decho("loading autoload/tar.vim")
36
37" ---------------------------------------------------------------------
38"  Default Settings: {{{1
39if !exists("g:tar_browseoptions")
40 let g:tar_browseoptions= "Ptf"
41endif
42if !exists("g:tar_readoptions")
43 let g:tar_readoptions= "OPxf"
44endif
45if !exists("g:tar_cmd")
46 let g:tar_cmd= "tar"
47endif
48if !exists("g:tar_writeoptions")
49 let g:tar_writeoptions= "uf"
50endif
51if !exists("g:netrw_cygwin")
52 if has("win32") || has("win95") || has("win64") || has("win16")
53  if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
54   let g:netrw_cygwin= 1
55  else
56   let g:netrw_cygwin= 0
57  endif
58 else
59  let g:netrw_cygwin= 0
60 endif
61endif
62if !exists("g:tar_copycmd")
63 if !exists("g:netrw_localcopycmd")
64  if has("win32") || has("win95") || has("win64") || has("win16")
65   if g:netrw_cygwin
66    let g:netrw_localcopycmd= "cp"
67   else
68    let g:netrw_localcopycmd= "copy"
69   endif
70  elseif has("unix") || has("macunix")
71   let g:netrw_localcopycmd= "cp"
72  else
73   let g:netrw_localcopycmd= ""
74  endif
75 endif
76 let g:tar_copycmd= g:netrw_localcopycmd
77endif
78if !exists("g:tar_extractcmd")
79 let g:tar_extractcmd= "tar -xf"
80endif
81
82" set up shell quoting character
83if !exists("g:tar_shq")
84 if exists("+shq") && exists("&shq") && &shq != ""
85  let g:tar_shq= &shq
86 elseif has("win32") || has("win95") || has("win64") || has("win16")
87  if exists("g:netrw_cygwin") && g:netrw_cygwin
88   let g:tar_shq= "'"
89  else
90   let g:tar_shq= '"'
91  endif
92 else
93  let g:tar_shq= "'"
94 endif
95" call Decho("g:tar_shq<".g:tar_shq.">")
96endif
97
98" ----------------
99"  Functions: {{{1
100" ----------------
101
102" ---------------------------------------------------------------------
103" tar#Browse: {{{2
104fun! tar#Browse(tarfile)
105"  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
106  let repkeep= &report
107  set report=10
108
109  " sanity checks
110  if !executable(g:tar_cmd)
111   redraw!
112   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
113   let &report= repkeep
114"   call Dret("tar#Browse")
115   return
116  endif
117  if !filereadable(a:tarfile)
118"   call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
119   if a:tarfile !~# '^\a\+://'
120    " if it's an url, don't complain, let url-handlers such as vim do its thing
121    redraw!
122    echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
123   endif
124   let &report= repkeep
125"   call Dret("tar#Browse : file<".a:tarfile."> not readable")
126   return
127  endif
128  if &ma != 1
129   set ma
130  endif
131  let b:tarfile= a:tarfile
132
133  setlocal noswapfile
134  setlocal buftype=nofile
135  setlocal bufhidden=hide
136  setlocal nobuflisted
137  setlocal nowrap
138  set ft=tar
139
140  " give header
141"  call Decho("printing header")
142  let lastline= line("$")
143  call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
144  call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
145  call setline(lastline+3,'" Select a file with cursor and press ENTER')
146  keepj $put =''
147  keepj sil! 0d
148  keepj $
149
150  let tarfile= a:tarfile
151  if has("win32unix") && executable("cygpath")
152   " assuming cygwin
153   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
154  endif
155
156  let curlast= line("$")
157  if tarfile =~# '\.\(gz\|tgz\)$'
158    let gzip_command = s:get_gzip_command(tarfile)
159"   call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
160   exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
161  elseif tarfile =~# '\.lrp'
162"   call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
163   exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
164  elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$'
165"   call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
166   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
167  elseif tarfile =~# '\.\(lzma\|tlz\)$'
168"   call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
169   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
170  elseif tarfile =~# '\.\(xz\|txz\)$'
171"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
172   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
173  else
174   if tarfile =~ '^\s*-'
175    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
176    let tarfile = substitute(tarfile, '-', './-', '')
177   endif
178"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
179   exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
180  endif
181  if v:shell_error != 0
182   redraw!
183   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
184"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
185   return
186  endif
187  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
188   redraw!
189   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
190   keepj sil! %d
191   let eikeep= &ei
192   set ei=BufReadCmd,FileReadCmd
193   exe "r ".fnameescape(a:tarfile)
194   let &ei= eikeep
195   keepj sil! 1d
196"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
197   return
198  endif
199
200  setlocal noma nomod ro
201  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
202
203  let &report= repkeep
204"  call Dret("tar#Browse : b:tarfile<".b:tarfile.">")
205endfun
206
207" ---------------------------------------------------------------------
208" TarBrowseSelect: {{{2
209fun! s:TarBrowseSelect()
210"  call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">")
211  let repkeep= &report
212  set report=10
213  let fname= getline(".")
214"  call Decho("fname<".fname.">")
215
216  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
217   redraw!
218   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
219"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
220   return
221  endif
222
223  " sanity check
224  if fname =~ '^"'
225   let &report= repkeep
226"   call Dret("TarBrowseSelect")
227   return
228  endif
229
230  " about to make a new window, need to use b:tarfile
231  let tarfile= b:tarfile
232  let curfile= expand("%")
233  if has("win32unix") && executable("cygpath")
234   " assuming cygwin
235   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
236  endif
237
238  new
239  if !exists("g:tar_nomax") || g:tar_nomax == 0
240   wincmd _
241  endif
242  let s:tblfile_{winnr()}= curfile
243  call tar#Read("tarfile:".tarfile.'::'.fname,1)
244  filetype detect
245  set nomod
246  exe 'com! -buffer -nargs=? -complete=file TarDiff	:call tar#Diff(<q-args>,"'.fnameescape(fname).'")'
247
248  let &report= repkeep
249"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
250endfun
251
252" ---------------------------------------------------------------------
253" tar#Read: {{{2
254fun! tar#Read(fname,mode)
255"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
256  let repkeep= &report
257  set report=10
258  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
259  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
260  if has("win32unix") && executable("cygpath")
261   " assuming cygwin
262   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
263  endif
264"  call Decho("tarfile<".tarfile.">")
265"  call Decho("fname<".fname.">")
266
267  if  fname =~ '\.bz2$' && executable("bzcat")
268   let decmp= "|bzcat"
269   let doro = 1
270  elseif      fname =~ '\.gz$'  && executable("zcat")
271   let decmp= "|zcat"
272   let doro = 1
273  elseif  fname =~ '\.lzma$' && executable("lzcat")
274   let decmp= "|lzcat"
275   let doro = 1
276  elseif  fname =~ '\.xz$' && executable("xzcat")
277   let decmp= "|xzcat"
278   let doro = 1
279  else
280   let decmp=""
281   let doro = 0
282   if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$'
283    setlocal bin
284   endif
285  endif
286
287  if exists("g:tar_secure")
288   let tar_secure= " -- "
289  else
290   let tar_secure= " "
291  endif
292
293  if tarfile =~# '\.bz2$'
294"   call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
295   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
296  elseif tarfile =~# '\.\(gz\|tgz\)$'
297    let gzip_command = s:get_gzip_command(tarfile)
298"   call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1))
299   exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
300  elseif tarfile =~# '\.lrp$'
301"   call Decho("6: exe silent r! cat ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
302   exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
303  elseif tarfile =~# '\.lzma$'
304"   call Decho("7: exe silent r! lzma -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
305   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
306  elseif tarfile =~# '\.\(xz\|txz\)$'
307"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
308   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
309  else
310   if tarfile =~ '^\s*-'
311    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
312    let tarfile = substitute(tarfile, '-', './-', '')
313   endif
314"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
315   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
316  endif
317
318  if doro
319   " because the reverse process of compressing changed files back into the tarball is not currently supported
320   setlocal ro
321  endif
322
323  let b:tarfile= a:fname
324  exe "file tarfile::".fnameescape(fname)
325
326  " cleanup
327  keepj sil! 0d
328  set nomod
329
330  let &report= repkeep
331"  call Dret("tar#Read : b:tarfile<".b:tarfile.">")
332endfun
333
334" ---------------------------------------------------------------------
335" tar#Write: {{{2
336fun! tar#Write(fname)
337"  call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
338  let repkeep= &report
339  set report=10
340
341  if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
342   redraw!
343   echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
344"   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
345   return
346  endif
347
348  " sanity checks
349  if !executable(g:tar_cmd)
350   redraw!
351   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
352   let &report= repkeep
353"   call Dret("tar#Write")
354   return
355  endif
356  if !exists("*mkdir")
357   redraw!
358   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
359   let &report= repkeep
360"   call Dret("tar#Write")
361   return
362  endif
363
364  let curdir= getcwd()
365  let tmpdir= tempname()
366"  call Decho("orig tempname<".tmpdir.">")
367  if tmpdir =~ '\.'
368   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
369  endif
370"  call Decho("tmpdir<".tmpdir.">")
371  call mkdir(tmpdir,"p")
372
373  " attempt to change to the indicated directory
374  try
375   exe "cd ".fnameescape(tmpdir)
376  catch /^Vim\%((\a\+)\)\=:E344/
377   redraw!
378   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
379   let &report= repkeep
380"   call Dret("tar#Write")
381   return
382  endtry
383"  call Decho("current directory now: ".getcwd())
384
385  " place temporary files under .../_ZIPVIM_/
386  if isdirectory("_ZIPVIM_")
387   call s:Rmdir("_ZIPVIM_")
388  endif
389  call mkdir("_ZIPVIM_")
390  cd _ZIPVIM_
391"  call Decho("current directory now: ".getcwd())
392
393  let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
394  let fname   = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
395
396  let gzip_command = s:get_gzip_command(tarfile)
397
398  " handle compressed archives
399  if tarfile =~# '\.bz2'
400   call system("bzip2 -d -- ".shellescape(tarfile,0))
401   let tarfile = substitute(tarfile,'\.bz2','','e')
402   let compress= "bzip2 -- ".shellescape(tarfile,0)
403"   call Decho("compress<".compress.">")
404  elseif tarfile =~# '\.gz'
405   call system(gzip_command . " -d -- ".shellescape(tarfile,0))
406   let tarfile = substitute(tarfile,'\.gz','','e')
407   let compress= "gzip -- ".shellescape(tarfile,0)
408"   call Decho("compress<".compress.">")
409  elseif tarfile =~# '\.tgz'
410   call system(gzip_command . " -d -- ".shellescape(tarfile,0))
411   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
412   let compress= "gzip -- ".shellescape(tarfile,0)
413   let tgz     = 1
414"   call Decho("compress<".compress.">")
415  elseif tarfile =~# '\.xz'
416   call system("xz -d -- ".shellescape(tarfile,0))
417   let tarfile = substitute(tarfile,'\.xz','','e')
418   let compress= "xz -- ".shellescape(tarfile,0)
419"   call Decho("compress<".compress.">")
420  elseif tarfile =~# '\.lzma'
421   call system("lzma -d -- ".shellescape(tarfile,0))
422   let tarfile = substitute(tarfile,'\.lzma','','e')
423   let compress= "lzma -- ".shellescape(tarfile,0)
424"   call Decho("compress<".compress.">")
425  endif
426"  call Decho("tarfile<".tarfile.">")
427
428  if v:shell_error != 0
429   redraw!
430   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
431  else
432
433"   call Decho("tarfile<".tarfile."> fname<".fname.">")
434
435   if fname =~ '/'
436    let dirpath = substitute(fname,'/[^/]\+$','','e')
437    if has("win32unix") && executable("cygpath")
438     let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
439    endif
440    call mkdir(dirpath,"p")
441   endif
442   if tarfile !~ '/'
443    let tarfile= curdir.'/'.tarfile
444   endif
445   if tarfile =~ '^\s*-'
446    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
447    let tarfile = substitute(tarfile, '-', './-', '')
448   endif
449"   call Decho("tarfile<".tarfile."> fname<".fname.">")
450
451   if exists("g:tar_secure")
452    let tar_secure= " -- "
453   else
454    let tar_secure= " "
455   endif
456   exe "w! ".fnameescape(fname)
457   if has("win32unix") && executable("cygpath")
458    let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
459   endif
460
461   " delete old file from tarfile
462"   call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
463   call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
464   if v:shell_error != 0
465    redraw!
466    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
467   else
468
469    " update tarfile with new file
470"    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
471    call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
472    if v:shell_error != 0
473     redraw!
474     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
475    elseif exists("compress")
476"     call Decho("call system(".compress.")")
477     call system(compress)
478     if exists("tgz")
479"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
480      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
481     endif
482    endif
483   endif
484
485   " support writing tarfiles across a network
486   if s:tblfile_{winnr()} =~ '^\a\+://'
487"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
488    let tblfile= s:tblfile_{winnr()}
489    1split|enew
490    let binkeep= &l:binary
491    let eikeep = &ei
492    set binary ei=all
493    exe "e! ".fnameescape(tarfile)
494    call netrw#NetWrite(tblfile)
495    let &ei       = eikeep
496    let &l:binary = binkeep
497    q!
498    unlet s:tblfile_{winnr()}
499   endif
500  endif
501
502  " cleanup and restore current directory
503  cd ..
504  call s:Rmdir("_ZIPVIM_")
505  exe "cd ".fnameescape(curdir)
506  setlocal nomod
507
508  let &report= repkeep
509"  call Dret("tar#Write")
510endfun
511
512" ---------------------------------------------------------------------
513" tar#Diff: {{{2
514fun! tar#Diff(userfname,fname)
515"  call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")")
516  let fname= a:fname
517  if a:userfname != ""
518   let fname= a:userfname
519  endif
520  if filereadable(fname)
521   " sets current file (from tarball) for diff'ing
522   " splits window vertically
523   " opens original file, sets it for diff'ing
524   " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes)
525   diffthis
526   wincmd v
527   exe "e ".fnameescape(fname)
528   diffthis
529  else
530   redraw!
531   echo "***warning*** unable to read file<".fname.">"
532  endif
533"  call Dret("tar#Diff")
534endfun
535
536" ---------------------------------------------------------------------
537" s:Rmdir: {{{2
538fun! s:Rmdir(fname)
539"  call Dfunc("Rmdir(fname<".a:fname.">)")
540  if has("unix")
541   call system("/bin/rm -rf -- ".shellescape(a:fname,0))
542  elseif has("win32") || has("win95") || has("win64") || has("win16")
543   if &shell =~? "sh$"
544    call system("/bin/rm -rf -- ".shellescape(a:fname,0))
545   else
546    call system("del /S ".shellescape(a:fname,0))
547   endif
548  endif
549"  call Dret("Rmdir")
550endfun
551
552" ---------------------------------------------------------------------
553" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
554fun! tar#Vimuntar(...)
555"  call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
556  let tarball = expand("%")
557"  call Decho("tarball<".tarball.">")
558  let tarbase = substitute(tarball,'\..*$','','')
559"  call Decho("tarbase<".tarbase.">")
560  let tarhome = expand("%:p")
561  if has("win32") || has("win95") || has("win64") || has("win16")
562   let tarhome= substitute(tarhome,'\\','/','g')
563  endif
564  let tarhome= substitute(tarhome,'/[^/]*$','','')
565"  call Decho("tarhome<".tarhome.">")
566  let tartail = expand("%:t")
567"  call Decho("tartail<".tartail.">")
568  let curdir  = getcwd()
569"  call Decho("curdir <".curdir.">")
570  " set up vimhome
571  if a:0 > 0 && a:1 != ""
572   let vimhome= a:1
573  else
574   let vimhome= vimball#VimballHome()
575  endif
576"  call Decho("vimhome<".vimhome.">")
577
578"  call Decho("curdir<".curdir."> vimhome<".vimhome.">")
579  if simplify(curdir) != simplify(vimhome)
580   " copy (possibly compressed) tarball to .vim/vimfiles
581"   call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
582   call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
583"   call Decho("exe cd ".fnameescape(vimhome))
584   exe "cd ".fnameescape(vimhome)
585  endif
586"  call Decho("getcwd<".getcwd().">")
587
588  " if necessary, decompress the tarball; then, extract it
589  if tartail =~ '\.tgz'
590   let gzip_command = s:get_gzip_command(tarfile)
591   if executable(gzip_command)
592    silent exe "!" . gzip_command . " -d ".shellescape(tartail)
593   elseif executable("gunzip")
594    silent exe "!gunzip ".shellescape(tartail)
595   elseif executable("gzip")
596    silent exe "!gzip -d ".shellescape(tartail)
597   else
598    echoerr "unable to decompress<".tartail."> on this sytem"
599    if simplify(curdir) != simplify(tarhome)
600     " remove decompressed tarball, restore directory
601"     call Decho("delete(".tartail.".tar)")
602     call delete(tartail.".tar")
603"     call Decho("exe cd ".fnameescape(curdir))
604     exe "cd ".fnameescape(curdir)
605    endif
606"    call Dret("tar#Vimuntar")
607    return
608   endif
609  else
610   call vimball#Decompress(tartail,0)
611  endif
612  let extractcmd= netrw#WinPath(g:tar_extractcmd)
613"  call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
614  call system(extractcmd." ".shellescape(tarbase.".tar"))
615
616  " set up help
617  if filereadable("doc/".tarbase.".txt")
618"   call Decho("exe helptags ".getcwd()."/doc")
619   exe "helptags ".getcwd()."/doc"
620  endif
621
622  if simplify(tarhome) != simplify(vimhome)
623   " remove decompressed tarball, restore directory
624   call delete(vimhome."/".tarbase.".tar")
625   exe "cd ".fnameescape(curdir)
626  endif
627
628"  call Dret("tar#Vimuntar")
629endfun
630
631func s:get_gzip_command(file)
632  " Try using the "file" command to get the actual compression type, since
633  " there is no standard way for the naming: ".tgz", ".tbz", ".txz", etc.
634  " If the "file" command doesn't work fall back to just using the file name.
635  if a:file =~# 'z$'
636    let filetype = system('file ' . a:file)
637    if filetype =~ 'bzip2 compressed' && executable('bzip2')
638      return 'bzip2'
639    endif
640    if filetype =~ 'XZ compressed' && executable('xz')
641      return 'xz'
642    endif
643  endif
644  if a:file =~# 'bz2$'
645    return 'bzip2'
646  endif
647  if a:file =~# 'xz$'
648    return 'xz'
649  endif
650  return 'gzip'
651endfunc
652
653" =====================================================================
654" Modelines And Restoration: {{{1
655let &cpo= s:keepcpo
656unlet s:keepcpo
657" vim:ts=8 fdm=marker
658