xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision 7fc0c065)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*7fc0c065SBram Moolenaar" Date:			Aug 09, 2010
4*7fc0c065SBram Moolenaar" Version:		26
5c81e5e79SBram Moolenaar" Maintainer:	Charles E Campbell, Jr <[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"
105c73622aSBram Moolenaar" Copyright:    Copyright (C) 2005-2009 Charles E. Campbell, Jr. {{{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*7fc0c065SBram Moolenaarlet g:loaded_tar= "v26"
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
345c73622aSBram Moolenaar"call Decho("loading autoload/tar.vim")
3587e25fdfSBram Moolenaar
36a5792f58SBram Moolenaar" ---------------------------------------------------------------------
37a5792f58SBram Moolenaar"  Default Settings: {{{1
38a5792f58SBram Moolenaarif !exists("g:tar_browseoptions")
39a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf"
40a5792f58SBram Moolenaarendif
41a5792f58SBram Moolenaarif !exists("g:tar_readoptions")
42a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf"
43a5792f58SBram Moolenaarendif
44910f66f9SBram Moolenaarif !exists("g:tar_cmd")
45910f66f9SBram Moolenaar let g:tar_cmd= "tar"
46910f66f9SBram Moolenaarendif
47a5792f58SBram Moolenaarif !exists("g:tar_writeoptions")
48a5792f58SBram Moolenaar let g:tar_writeoptions= "uf"
49a5792f58SBram Moolenaarendif
505c73622aSBram Moolenaarif !exists("g:tar_copycmd")
515c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd")
525c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
535c73622aSBram Moolenaar   if g:netrw_cygwin
545c73622aSBram Moolenaar    let g:netrw_localcopycmd= "cp"
555c73622aSBram Moolenaar   else
565c73622aSBram Moolenaar    let g:netrw_localcopycmd= "copy"
575c73622aSBram Moolenaar   endif
585c73622aSBram Moolenaar  elseif has("unix") || has("macunix")
595c73622aSBram Moolenaar   let g:netrw_localcopycmd= "cp"
605c73622aSBram Moolenaar  else
615c73622aSBram Moolenaar   let g:netrw_localcopycmd= ""
625c73622aSBram Moolenaar  endif
635c73622aSBram Moolenaar endif
645c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd
655c73622aSBram Moolenaarendif
668c8de839SBram Moolenaarif !exists("g:netrw_cygwin")
678c8de839SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
688c8de839SBram Moolenaar  if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
698c8de839SBram Moolenaar   let g:netrw_cygwin= 1
708c8de839SBram Moolenaar  else
718c8de839SBram Moolenaar   let g:netrw_cygwin= 0
728c8de839SBram Moolenaar  endif
738c8de839SBram Moolenaar else
748c8de839SBram Moolenaar  let g:netrw_cygwin= 0
758c8de839SBram Moolenaar endif
768c8de839SBram Moolenaarendif
775c73622aSBram Moolenaarif !exists("g:tar_extractcmd")
785c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf"
795c73622aSBram Moolenaarendif
808c8de839SBram Moolenaar
818c8de839SBram Moolenaar" set up shell quoting character
82c81e5e79SBram Moolenaarif !exists("g:tar_shq")
838c8de839SBram Moolenaar if exists("&shq") && &shq != ""
848c8de839SBram Moolenaar  let g:tar_shq= &shq
858c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16")
868c8de839SBram Moolenaar  if exists("g:netrw_cygwin") && g:netrw_cygwin
87c81e5e79SBram Moolenaar   let g:tar_shq= "'"
88c81e5e79SBram Moolenaar  else
89c81e5e79SBram Moolenaar   let g:tar_shq= '"'
90c81e5e79SBram Moolenaar  endif
918c8de839SBram Moolenaar else
928c8de839SBram Moolenaar  let g:tar_shq= "'"
938c8de839SBram Moolenaar endif
948c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">")
95c81e5e79SBram Moolenaarendif
96a5792f58SBram Moolenaar
97a5792f58SBram Moolenaar" ----------------
98a5792f58SBram Moolenaar"  Functions: {{{1
99a5792f58SBram Moolenaar" ----------------
100a5792f58SBram Moolenaar
101a5792f58SBram Moolenaar" ---------------------------------------------------------------------
102a5792f58SBram Moolenaar" tar#Browse: {{{2
103a5792f58SBram Moolenaarfun! tar#Browse(tarfile)
104a5792f58SBram Moolenaar"  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
105bba577a2SBram Moolenaar  let repkeep= &report
106bba577a2SBram Moolenaar  set report=10
107a5792f58SBram Moolenaar
108a5792f58SBram Moolenaar  " sanity checks
109910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
110c81e5e79SBram Moolenaar   redraw!
111910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
112bba577a2SBram Moolenaar   let &report= repkeep
113a5792f58SBram Moolenaar"   call Dret("tar#Browse")
11487e25fdfSBram Moolenaar   return
11587e25fdfSBram Moolenaar  endif
116a5792f58SBram Moolenaar  if !filereadable(a:tarfile)
117910f66f9SBram Moolenaar"   call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
118a5792f58SBram Moolenaar   if a:tarfile !~# '^\a\+://'
119a5792f58SBram Moolenaar    " if its an url, don't complain, let url-handlers such as vim do its thing
120c81e5e79SBram Moolenaar    redraw!
121a5792f58SBram Moolenaar    echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
12287e25fdfSBram Moolenaar   endif
123bba577a2SBram Moolenaar   let &report= repkeep
124a5792f58SBram Moolenaar"   call Dret("tar#Browse : file<".a:tarfile."> not readable")
12587e25fdfSBram Moolenaar   return
12687e25fdfSBram Moolenaar  endif
127a5792f58SBram Moolenaar  if &ma != 1
128a5792f58SBram Moolenaar   set ma
12987e25fdfSBram Moolenaar  endif
130*7fc0c065SBram Moolenaar  let b:tarfile= a:tarfile
131a5792f58SBram Moolenaar
132a5792f58SBram Moolenaar  setlocal noswapfile
133a5792f58SBram Moolenaar  setlocal buftype=nofile
134a5792f58SBram Moolenaar  setlocal bufhidden=hide
135a5792f58SBram Moolenaar  setlocal nobuflisted
136a5792f58SBram Moolenaar  setlocal nowrap
137a5792f58SBram Moolenaar  set ft=tar
138a5792f58SBram Moolenaar
139a5792f58SBram Moolenaar  " give header
140910f66f9SBram Moolenaar"  call Decho("printing header")
1418c8de839SBram Moolenaar  let lastline= line("$")
1428c8de839SBram Moolenaar  call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
1438c8de839SBram Moolenaar  call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
1448c8de839SBram Moolenaar  call setline(lastline+3,'" Select a file with cursor and press ENTER')
1458c8de839SBram Moolenaar  $put =''
146a5792f58SBram Moolenaar  0d
147a5792f58SBram Moolenaar  $
148a5792f58SBram Moolenaar
149910f66f9SBram Moolenaar  let tarfile= a:tarfile
150910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
151910f66f9SBram Moolenaar   " assuming cygwin
1525c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
153a5792f58SBram Moolenaar  endif
154d68071d8SBram Moolenaar  let curlast= line("$")
155910f66f9SBram Moolenaar  if tarfile =~# '\.\(gz\|tgz\)$'
1565c73622aSBram Moolenaar"   call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
1575c73622aSBram Moolenaar   exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1588c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp'
1595c73622aSBram Moolenaar"   call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
1605c73622aSBram Moolenaar   exe "silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
161910f66f9SBram Moolenaar  elseif tarfile =~# '\.bz2$'
1625c73622aSBram Moolenaar"   call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
1635c73622aSBram Moolenaar   exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1645c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma$'
1655c73622aSBram Moolenaar"   call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
1665c73622aSBram Moolenaar   exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
167477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
168477db060SBram Moolenaar"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
169477db060SBram Moolenaar   exe "silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
170910f66f9SBram Moolenaar  else
171ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
1725c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
173ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
174ed39e1d5SBram Moolenaar   endif
1755c73622aSBram Moolenaar"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
1765c73622aSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
177910f66f9SBram Moolenaar  endif
178910f66f9SBram Moolenaar  if v:shell_error != 0
179c81e5e79SBram Moolenaar   redraw!
180d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
181d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
182d68071d8SBram Moolenaar   return
183d68071d8SBram Moolenaar  endif
184c81e5e79SBram Moolenaar  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
185c81e5e79SBram Moolenaar   redraw!
186d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
187d68071d8SBram Moolenaar   silent %d
188d68071d8SBram Moolenaar   let eikeep= &ei
189d68071d8SBram Moolenaar   set ei=BufReadCmd,FileReadCmd
190c236c16dSBram Moolenaar   exe "r ".fnameescape(a:tarfile)
191d68071d8SBram Moolenaar   let &ei= eikeep
192d68071d8SBram Moolenaar   1d
193d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
194910f66f9SBram Moolenaar   return
195910f66f9SBram Moolenaar  endif
196a5792f58SBram Moolenaar
197a5792f58SBram Moolenaar  setlocal noma nomod ro
198a5792f58SBram Moolenaar  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
199a5792f58SBram Moolenaar
200bba577a2SBram Moolenaar  let &report= repkeep
201*7fc0c065SBram Moolenaar"  call Dret("tar#Browse : b:tarfile<".b:tarfile.">")
202ab194816SBram Moolenaarendfun
20387e25fdfSBram Moolenaar
204ab194816SBram Moolenaar" ---------------------------------------------------------------------
205a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
206a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
207*7fc0c065SBram Moolenaar"  call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">")
208bba577a2SBram Moolenaar  let repkeep= &report
209bba577a2SBram Moolenaar  set report=10
210a5792f58SBram Moolenaar  let fname= getline(".")
211a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
212a5792f58SBram Moolenaar
213ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
214ed39e1d5SBram Moolenaar   redraw!
2155c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
216ed39e1d5SBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
217ed39e1d5SBram Moolenaar   return
218ed39e1d5SBram Moolenaar  endif
219ed39e1d5SBram Moolenaar
220a5792f58SBram Moolenaar  " sanity check
221a5792f58SBram Moolenaar  if fname =~ '^"'
222bba577a2SBram Moolenaar   let &report= repkeep
223a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
224a5792f58SBram Moolenaar   return
225a5792f58SBram Moolenaar  endif
226a5792f58SBram Moolenaar
227*7fc0c065SBram Moolenaar  " about to make a new window, need to use b:tarfile
228*7fc0c065SBram Moolenaar  let tarfile= b:tarfile
229a5792f58SBram Moolenaar  let curfile= expand("%")
230910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
231910f66f9SBram Moolenaar   " assuming cygwin
2325c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
233910f66f9SBram Moolenaar  endif
234a5792f58SBram Moolenaar
235a5792f58SBram Moolenaar  new
2368c8de839SBram Moolenaar  if !exists("g:tar_nomax") || g:tar_nomax == 0
237a5792f58SBram Moolenaar   wincmd _
2388c8de839SBram Moolenaar  endif
239a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
2408c8de839SBram Moolenaar  call tar#Read("tarfile:".tarfile.'::'.fname,1)
241a5792f58SBram Moolenaar  filetype detect
242a5792f58SBram Moolenaar
243bba577a2SBram Moolenaar  let &report= repkeep
244a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
245a5792f58SBram Moolenaarendfun
246a5792f58SBram Moolenaar
247a5792f58SBram Moolenaar" ---------------------------------------------------------------------
248a5792f58SBram Moolenaar" tar#Read: {{{2
249a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
250a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
251bba577a2SBram Moolenaar  let repkeep= &report
252bba577a2SBram Moolenaar  set report=10
2538c8de839SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
2548c8de839SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
255910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
256910f66f9SBram Moolenaar   " assuming cygwin
2575c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
258910f66f9SBram Moolenaar  endif
259910f66f9SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
260910f66f9SBram Moolenaar"  call Decho("fname<".fname.">")
261a5792f58SBram Moolenaar
2625c73622aSBram Moolenaar  if  fname =~ '\.bz2$' && executable("bzcat")
2635c73622aSBram Moolenaar   let decmp= "|bzcat"
2645c73622aSBram Moolenaar   let doro = 1
2655c73622aSBram Moolenaar  elseif      fname =~ '\.gz$'  && executable("zcat")
2668c8de839SBram Moolenaar   let decmp= "|zcat"
2678c8de839SBram Moolenaar   let doro = 1
2685c73622aSBram Moolenaar  elseif  fname =~ '\.lzma$' && executable("lzcat")
2695c73622aSBram Moolenaar   let decmp= "|lzcat"
2708c8de839SBram Moolenaar   let doro = 1
271477db060SBram Moolenaar  elseif  fname =~ '\.xz$' && executable("xzcat")
272477db060SBram Moolenaar   let decmp= "|xzcat"
273477db060SBram Moolenaar   let doro = 1
274a5792f58SBram Moolenaar  else
2758c8de839SBram Moolenaar   let decmp=""
2768c8de839SBram Moolenaar   let doro = 0
277477db060SBram Moolenaar   if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$'
2788c8de839SBram Moolenaar    setlocal bin
279a5792f58SBram Moolenaar   endif
2808c8de839SBram Moolenaar  endif
2818c8de839SBram Moolenaar
282ed39e1d5SBram Moolenaar  if exists("g:tar_secure")
283ed39e1d5SBram Moolenaar   let tar_secure= " -- "
2848c8de839SBram Moolenaar  else
285ed39e1d5SBram Moolenaar   let tar_secure= " "
286ed39e1d5SBram Moolenaar  endif
2875c73622aSBram Moolenaar  if tarfile =~# '\.bz2$'
2885c73622aSBram Moolenaar"   call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
2895c73622aSBram Moolenaar   exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
2905c73622aSBram Moolenaar  elseif tarfile =~# '\.\(gz\|tgz\)$'
2915c73622aSBram Moolenaar"   call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1))
2925c73622aSBram Moolenaar   exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
293ed39e1d5SBram Moolenaar  elseif tarfile =~# '\.lrp$'
2945c73622aSBram Moolenaar"   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)
2955c73622aSBram Moolenaar   exe "silent r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
2965c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma$'
2975c73622aSBram Moolenaar"   call Decho("7: exe silent r! lzma -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
2985c73622aSBram Moolenaar   exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
299477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
300477db060SBram Moolenaar"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
301477db060SBram Moolenaar   exe "silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
302ed39e1d5SBram Moolenaar  else
303ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
3045c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
305ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
306ed39e1d5SBram Moolenaar   endif
3075c73622aSBram Moolenaar"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
3085c73622aSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
3098c8de839SBram Moolenaar  endif
3108c8de839SBram Moolenaar
3118c8de839SBram Moolenaar  if doro
3128c8de839SBram Moolenaar   " because the reverse process of compressing changed files back into the tarball is not currently supported
3138c8de839SBram Moolenaar   setlocal ro
3148c8de839SBram Moolenaar  endif
3158c8de839SBram Moolenaar
316*7fc0c065SBram Moolenaar  let b:tarfile= a:fname
317c236c16dSBram Moolenaar  exe "file tarfile::".fnameescape(fname)
318a5792f58SBram Moolenaar
319a5792f58SBram Moolenaar  " cleanup
320a5792f58SBram Moolenaar  0d
321a5792f58SBram Moolenaar  set nomod
322a5792f58SBram Moolenaar
323bba577a2SBram Moolenaar  let &report= repkeep
324*7fc0c065SBram Moolenaar"  call Dret("tar#Read : b:tarfile<".b:tarfile.">")
325a5792f58SBram Moolenaarendfun
326a5792f58SBram Moolenaar
327a5792f58SBram Moolenaar" ---------------------------------------------------------------------
328a5792f58SBram Moolenaar" tar#Write: {{{2
329a5792f58SBram Moolenaarfun! tar#Write(fname)
330*7fc0c065SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
331bba577a2SBram Moolenaar  let repkeep= &report
332bba577a2SBram Moolenaar  set report=10
333a5792f58SBram Moolenaar
334ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
335ed39e1d5SBram Moolenaar   redraw!
3365c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
337ed39e1d5SBram Moolenaar"   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
338ed39e1d5SBram Moolenaar   return
339ed39e1d5SBram Moolenaar  endif
340ed39e1d5SBram Moolenaar
341ab194816SBram Moolenaar  " sanity checks
342910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
343c81e5e79SBram Moolenaar   redraw!
344910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
345bba577a2SBram Moolenaar   let &report= repkeep
346ab194816SBram Moolenaar"   call Dret("tar#Write")
347ab194816SBram Moolenaar   return
348ab194816SBram Moolenaar  endif
349ab194816SBram Moolenaar  if !exists("*mkdir")
350c81e5e79SBram Moolenaar   redraw!
351a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
352bba577a2SBram Moolenaar   let &report= repkeep
353ab194816SBram Moolenaar"   call Dret("tar#Write")
354ab194816SBram Moolenaar   return
355ab194816SBram Moolenaar  endif
356ab194816SBram Moolenaar
357ab194816SBram Moolenaar  let curdir= getcwd()
358ab194816SBram Moolenaar  let tmpdir= tempname()
359ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
360ab194816SBram Moolenaar  if tmpdir =~ '\.'
361ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
362ab194816SBram Moolenaar  endif
363ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
364ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
365ab194816SBram Moolenaar
366ab194816SBram Moolenaar  " attempt to change to the indicated directory
367ab194816SBram Moolenaar  try
3688c8de839SBram Moolenaar   exe "cd ".fnameescape(tmpdir)
369ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
370c81e5e79SBram Moolenaar   redraw!
371a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
372bba577a2SBram Moolenaar   let &report= repkeep
373ab194816SBram Moolenaar"   call Dret("tar#Write")
374ab194816SBram Moolenaar   return
375ab194816SBram Moolenaar  endtry
376ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
377ab194816SBram Moolenaar
378a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
379a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
380a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
381ab194816SBram Moolenaar  endif
382a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
383a5792f58SBram Moolenaar  cd _ZIPVIM_
384ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
385ab194816SBram Moolenaar
386*7fc0c065SBram Moolenaar  let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
387*7fc0c065SBram Moolenaar  let fname   = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
388a5792f58SBram Moolenaar
389a5792f58SBram Moolenaar  " handle compressed archives
3905c73622aSBram Moolenaar  if tarfile =~# '\.bz2'
3915c73622aSBram Moolenaar   call system("bzip2 -d -- ".shellescape(tarfile,0))
3925c73622aSBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
3935c73622aSBram Moolenaar   let compress= "bzip2 -- ".shellescape(tarfile,0)
3945c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
3955c73622aSBram Moolenaar  elseif tarfile =~# '\.gz'
3965c73622aSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
397a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
3985c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
3995c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
400a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
4015c73622aSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
402a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
4035c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
404a5792f58SBram Moolenaar   let tgz     = 1
405ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
406477db060SBram Moolenaar  elseif tarfile =~# '\.xz'
407477db060SBram Moolenaar   call system("xz -d -- ".shellescape(tarfile,0))
408477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.xz','','e')
409477db060SBram Moolenaar   let compress= "xz -- ".shellescape(tarfile,0)
410477db060SBram Moolenaar"   call Decho("compress<".compress.">")
411477db060SBram Moolenaar  elseif tarfile =~# '\.lzma'
412477db060SBram Moolenaar   call system("lzma -d -- ".shellescape(tarfile,0))
413477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.lzma','','e')
414477db060SBram Moolenaar   let compress= "lzma -- ".shellescape(tarfile,0)
415477db060SBram Moolenaar"   call Decho("compress<".compress.">")
416a5792f58SBram Moolenaar  endif
4178c8de839SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
418a5792f58SBram Moolenaar
419a5792f58SBram Moolenaar  if v:shell_error != 0
420c81e5e79SBram Moolenaar   redraw!
421a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
422a5792f58SBram Moolenaar  else
423a5792f58SBram Moolenaar
424a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
425a5792f58SBram Moolenaar
4261cbe5f73SBram Moolenaar   if fname =~ '/'
427a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
4281cbe5f73SBram Moolenaar    if executable("cygpath")
4295c73622aSBram Moolenaar     let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
4301cbe5f73SBram Moolenaar    endif
4311cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
4321cbe5f73SBram Moolenaar   endif
433a5792f58SBram Moolenaar   if tarfile !~ '/'
434a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
435a5792f58SBram Moolenaar   endif
436ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
437ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
438ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
439ed39e1d5SBram Moolenaar   endif
440a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
441a5792f58SBram Moolenaar
442ed39e1d5SBram Moolenaar   if exists("g:tar_secure")
443ed39e1d5SBram Moolenaar    let tar_secure= " -- "
444ed39e1d5SBram Moolenaar   else
445ed39e1d5SBram Moolenaar    let tar_secure= " "
446ed39e1d5SBram Moolenaar   endif
4478c8de839SBram Moolenaar   exe "w! ".fnameescape(fname)
448ab194816SBram Moolenaar   if executable("cygpath")
4495c73622aSBram Moolenaar    let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
450ab194816SBram Moolenaar   endif
451ab194816SBram Moolenaar
452a5792f58SBram Moolenaar   " delete old file from tarfile
4535c73622aSBram Moolenaar"   call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
4545c73622aSBram Moolenaar   call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
455ab194816SBram Moolenaar   if v:shell_error != 0
456c81e5e79SBram Moolenaar    redraw!
4578c8de839SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
458ab194816SBram Moolenaar   else
459a5792f58SBram Moolenaar
460a5792f58SBram Moolenaar    " update tarfile with new file
4615c73622aSBram Moolenaar"    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
4625c73622aSBram Moolenaar    call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
463a5792f58SBram Moolenaar    if v:shell_error != 0
464c81e5e79SBram Moolenaar     redraw!
4658c8de839SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
466a5792f58SBram Moolenaar    elseif exists("compress")
467a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
468a5792f58SBram Moolenaar     call system(compress)
469a5792f58SBram Moolenaar     if exists("tgz")
470a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
471a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
472a5792f58SBram Moolenaar     endif
473a5792f58SBram Moolenaar    endif
474a5792f58SBram Moolenaar   endif
475a5792f58SBram Moolenaar
476a5792f58SBram Moolenaar   " support writing tarfiles across a network
477a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
478a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
479a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
480a5792f58SBram Moolenaar    1split|enew
4815c73622aSBram Moolenaar    let binkeep= &l:binary
482a5792f58SBram Moolenaar    let eikeep = &ei
483a5792f58SBram Moolenaar    set binary ei=all
484c236c16dSBram Moolenaar    exe "e! ".fnameescape(tarfile)
485a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
486a5792f58SBram Moolenaar    let &ei       = eikeep
4875c73622aSBram Moolenaar    let &l:binary = binkeep
488a5792f58SBram Moolenaar    q!
489a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
490a5792f58SBram Moolenaar   endif
491ab194816SBram Moolenaar  endif
492ab194816SBram Moolenaar
493ab194816SBram Moolenaar  " cleanup and restore current directory
494ab194816SBram Moolenaar  cd ..
495a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
496c236c16dSBram Moolenaar  exe "cd ".fnameescape(curdir)
497ab194816SBram Moolenaar  setlocal nomod
498ab194816SBram Moolenaar
499bba577a2SBram Moolenaar  let &report= repkeep
500ab194816SBram Moolenaar"  call Dret("tar#Write")
501ab194816SBram Moolenaarendfun
502ab194816SBram Moolenaar
503ab194816SBram Moolenaar" ---------------------------------------------------------------------
5045c73622aSBram Moolenaar" s:Rmdir: {{{2
505ab194816SBram Moolenaarfun! s:Rmdir(fname)
506ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
507ab194816SBram Moolenaar  if has("unix")
5085c73622aSBram Moolenaar   call system("/bin/rm -rf -- ".shellescape(a:fname,0))
509ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
510ab194816SBram Moolenaar   if &shell =~? "sh$"
5115c73622aSBram Moolenaar    call system("/bin/rm -rf -- ".shellescape(a:fname,0))
512ab194816SBram Moolenaar   else
5135c73622aSBram Moolenaar    call system("del /S ".shellescape(a:fname,0))
514ab194816SBram Moolenaar   endif
515ab194816SBram Moolenaar  endif
516ab194816SBram Moolenaar"  call Dret("Rmdir")
517ab194816SBram Moolenaarendfun
518ab194816SBram Moolenaar
5198c8de839SBram Moolenaar" ---------------------------------------------------------------------
5205c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
5215c73622aSBram Moolenaarfun! tar#Vimuntar(...)
5225c73622aSBram Moolenaar"  call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
5235c73622aSBram Moolenaar  let tarball = expand("%")
5245c73622aSBram Moolenaar"  call Decho("tarball<".tarball.">")
5255c73622aSBram Moolenaar  let tarbase = substitute(tarball,'\..*$','','')
5265c73622aSBram Moolenaar"  call Decho("tarbase<".tarbase.">")
5275c73622aSBram Moolenaar  let tarhome = expand("%:p")
5285c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
5295c73622aSBram Moolenaar   let tarhome= substitute(tarhome,'\\','/','g')
5305c73622aSBram Moolenaar  endif
5315c73622aSBram Moolenaar  let tarhome= substitute(tarhome,'/[^/]*$','','')
5325c73622aSBram Moolenaar"  call Decho("tarhome<".tarhome.">")
5335c73622aSBram Moolenaar  let tartail = expand("%:t")
5345c73622aSBram Moolenaar"  call Decho("tartail<".tartail.">")
5355c73622aSBram Moolenaar  let curdir  = getcwd()
5365c73622aSBram Moolenaar"  call Decho("curdir <".curdir.">")
5375c73622aSBram Moolenaar  " set up vimhome
5385c73622aSBram Moolenaar  if a:0 > 0 && a:1 != ""
5395c73622aSBram Moolenaar   let vimhome= a:1
540c236c16dSBram Moolenaar  else
5415c73622aSBram Moolenaar   let vimhome= vimball#VimballHome()
5425c73622aSBram Moolenaar  endif
5435c73622aSBram Moolenaar"  call Decho("vimhome<".vimhome.">")
5445c73622aSBram Moolenaar
5455c73622aSBram Moolenaar"  call Decho("curdir<".curdir."> vimhome<".vimhome.">")
5465c73622aSBram Moolenaar  if simplify(curdir) != simplify(vimhome)
5475c73622aSBram Moolenaar   " copy (possibly compressed) tarball to .vim/vimfiles
5485c73622aSBram Moolenaar"   call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
5495c73622aSBram Moolenaar   call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
5505c73622aSBram Moolenaar"   call Decho("exe cd ".fnameescape(vimhome))
5515c73622aSBram Moolenaar   exe "cd ".fnameescape(vimhome)
5525c73622aSBram Moolenaar  endif
5535c73622aSBram Moolenaar"  call Decho("getcwd<".getcwd().">")
5545c73622aSBram Moolenaar
5555c73622aSBram Moolenaar  " if necessary, decompress the tarball; then, extract it
5565c73622aSBram Moolenaar  if tartail =~ '\.tgz'
5575c73622aSBram Moolenaar   if executable("gunzip")
5585c73622aSBram Moolenaar    silent exe "!gunzip ".shellescape(tartail)
5595c73622aSBram Moolenaar   elseif executable("gzip")
5605c73622aSBram Moolenaar    silent exe "!gzip -d ".shellescape(tartail)
5615c73622aSBram Moolenaar   else
5625c73622aSBram Moolenaar    echoerr "unable to decompress<".tartail."> on this sytem"
5635c73622aSBram Moolenaar    if simplify(curdir) != simplify(tarhome)
5645c73622aSBram Moolenaar     " remove decompressed tarball, restore directory
5655c73622aSBram Moolenaar"     call Decho("delete(".tartail.".tar)")
5665c73622aSBram Moolenaar     call delete(tartail.".tar")
5675c73622aSBram Moolenaar"     call Decho("exe cd ".fnameescape(curdir))
5685c73622aSBram Moolenaar     exe "cd ".fnameescape(curdir)
5695c73622aSBram Moolenaar    endif
5705c73622aSBram Moolenaar"    call Dret("tar#Vimuntar")
5715c73622aSBram Moolenaar    return
572c236c16dSBram Moolenaar   endif
5738c8de839SBram Moolenaar  else
5745c73622aSBram Moolenaar   call vimball#Decompress(tartail,0)
5758c8de839SBram Moolenaar  endif
5765c73622aSBram Moolenaar  let extractcmd= netrw#WinPath(g:tar_extractcmd)
5775c73622aSBram Moolenaar"  call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
5785c73622aSBram Moolenaar  call system(extractcmd." ".shellescape(tarbase.".tar"))
5795c73622aSBram Moolenaar
5805c73622aSBram Moolenaar  " set up help
5815c73622aSBram Moolenaar  if filereadable("doc/".tarbase.".txt")
5825c73622aSBram Moolenaar"   call Decho("exe helptags ".getcwd()."/doc")
5835c73622aSBram Moolenaar   exe "helptags ".getcwd()."/doc"
5845c73622aSBram Moolenaar  endif
5855c73622aSBram Moolenaar
5865c73622aSBram Moolenaar  if simplify(tarhome) != simplify(vimhome)
5875c73622aSBram Moolenaar   " remove decompressed tarball, restore directory
5885c73622aSBram Moolenaar   call delete(vimhome."/".tarbase.".tar")
5895c73622aSBram Moolenaar   exe "cd ".fnameescape(curdir)
5905c73622aSBram Moolenaar  endif
5915c73622aSBram Moolenaar
5925c73622aSBram Moolenaar"  call Dret("tar#Vimuntar")
5938c8de839SBram Moolenaarendfun
5948c8de839SBram Moolenaar
5955c73622aSBram Moolenaar" =====================================================================
596a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
597a5792f58SBram Moolenaarlet &cpo= s:keepcpo
598a5792f58SBram Moolenaarunlet s:keepcpo
599a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
600