xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision 5c73622a)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*5c73622aSBram Moolenaar" Date:			Dec 28, 2009
4*5c73622aSBram Moolenaar" Version:		24
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"
10*5c73622aSBram 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.
19*5c73622aSBram Moolenaar"     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
20ab194816SBram Moolenaar" ---------------------------------------------------------------------
21c81e5e79SBram Moolenaar" Load Once: {{{1
22*5c73622aSBram Moolenaarif &cp || exists("g:loaded_tar")
23a5792f58SBram Moolenaar finish
24a5792f58SBram Moolenaarendif
25*5c73622aSBram Moolenaarlet g:loaded_tar= "v24"
26*5c73622aSBram Moolenaarif v:version < 702
27*5c73622aSBram Moolenaar echohl WarningMsg
28*5c73622aSBram Moolenaar echo "***warning*** this version of tar needs vim 7.2"
29*5c73622aSBram Moolenaar echohl Normal
30*5c73622aSBram Moolenaar finish
318c8de839SBram Moolenaarendif
32*5c73622aSBram Moolenaarlet s:keepcpo= &cpo
33*5c73622aSBram Moolenaarset cpo&vim
34*5c73622aSBram 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
50*5c73622aSBram Moolenaarif !exists("g:tar_copycmd")
51*5c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd")
52*5c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
53*5c73622aSBram Moolenaar   if g:netrw_cygwin
54*5c73622aSBram Moolenaar    let g:netrw_localcopycmd= "cp"
55*5c73622aSBram Moolenaar   else
56*5c73622aSBram Moolenaar    let g:netrw_localcopycmd= "copy"
57*5c73622aSBram Moolenaar   endif
58*5c73622aSBram Moolenaar  elseif has("unix") || has("macunix")
59*5c73622aSBram Moolenaar   let g:netrw_localcopycmd= "cp"
60*5c73622aSBram Moolenaar  else
61*5c73622aSBram Moolenaar   let g:netrw_localcopycmd= ""
62*5c73622aSBram Moolenaar  endif
63*5c73622aSBram Moolenaar endif
64*5c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd
65*5c73622aSBram 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
77*5c73622aSBram Moolenaarif !exists("g:tar_extractcmd")
78*5c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf"
79*5c73622aSBram 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
130a5792f58SBram Moolenaar  let w: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
152*5c73622aSBram 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\)$'
156*5c73622aSBram Moolenaar"   call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
157*5c73622aSBram Moolenaar   exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1588c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp'
159*5c73622aSBram Moolenaar"   call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
160*5c73622aSBram Moolenaar   exe "silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
161910f66f9SBram Moolenaar  elseif tarfile =~# '\.bz2$'
162*5c73622aSBram Moolenaar"   call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
163*5c73622aSBram Moolenaar   exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
164*5c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma$'
165*5c73622aSBram Moolenaar"   call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
166*5c73622aSBram Moolenaar   exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
167910f66f9SBram Moolenaar  else
168ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
169*5c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
170ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
171ed39e1d5SBram Moolenaar   endif
172*5c73622aSBram Moolenaar"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
173*5c73622aSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
174910f66f9SBram Moolenaar  endif
175910f66f9SBram Moolenaar  if v:shell_error != 0
176c81e5e79SBram Moolenaar   redraw!
177d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
178d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
179d68071d8SBram Moolenaar   return
180d68071d8SBram Moolenaar  endif
181c81e5e79SBram Moolenaar  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
182c81e5e79SBram Moolenaar   redraw!
183d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
184d68071d8SBram Moolenaar   silent %d
185d68071d8SBram Moolenaar   let eikeep= &ei
186d68071d8SBram Moolenaar   set ei=BufReadCmd,FileReadCmd
187c236c16dSBram Moolenaar   exe "r ".fnameescape(a:tarfile)
188d68071d8SBram Moolenaar   let &ei= eikeep
189d68071d8SBram Moolenaar   1d
190d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
191910f66f9SBram Moolenaar   return
192910f66f9SBram Moolenaar  endif
193a5792f58SBram Moolenaar
194a5792f58SBram Moolenaar  setlocal noma nomod ro
195a5792f58SBram Moolenaar  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
196a5792f58SBram Moolenaar
197bba577a2SBram Moolenaar  let &report= repkeep
198a5792f58SBram Moolenaar"  call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
199ab194816SBram Moolenaarendfun
20087e25fdfSBram Moolenaar
201ab194816SBram Moolenaar" ---------------------------------------------------------------------
202a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
203a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
204a5792f58SBram Moolenaar"  call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
205bba577a2SBram Moolenaar  let repkeep= &report
206bba577a2SBram Moolenaar  set report=10
207a5792f58SBram Moolenaar  let fname= getline(".")
208a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
209a5792f58SBram Moolenaar
210ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
211ed39e1d5SBram Moolenaar   redraw!
212*5c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
213ed39e1d5SBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
214ed39e1d5SBram Moolenaar   return
215ed39e1d5SBram Moolenaar  endif
216ed39e1d5SBram Moolenaar
217a5792f58SBram Moolenaar  " sanity check
218a5792f58SBram Moolenaar  if fname =~ '^"'
219bba577a2SBram Moolenaar   let &report= repkeep
220a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
221a5792f58SBram Moolenaar   return
222a5792f58SBram Moolenaar  endif
223a5792f58SBram Moolenaar
224a5792f58SBram Moolenaar  " about to make a new window, need to use w:tarfile
225a5792f58SBram Moolenaar  let tarfile= w:tarfile
226a5792f58SBram Moolenaar  let curfile= expand("%")
227910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
228910f66f9SBram Moolenaar   " assuming cygwin
229*5c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
230910f66f9SBram Moolenaar  endif
231a5792f58SBram Moolenaar
232a5792f58SBram Moolenaar  new
2338c8de839SBram Moolenaar  if !exists("g:tar_nomax") || g:tar_nomax == 0
234a5792f58SBram Moolenaar   wincmd _
2358c8de839SBram Moolenaar  endif
236a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
2378c8de839SBram Moolenaar  call tar#Read("tarfile:".tarfile.'::'.fname,1)
238a5792f58SBram Moolenaar  filetype detect
239a5792f58SBram Moolenaar
240bba577a2SBram Moolenaar  let &report= repkeep
241a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
242a5792f58SBram Moolenaarendfun
243a5792f58SBram Moolenaar
244a5792f58SBram Moolenaar" ---------------------------------------------------------------------
245a5792f58SBram Moolenaar" tar#Read: {{{2
246a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
247a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
248bba577a2SBram Moolenaar  let repkeep= &report
249bba577a2SBram Moolenaar  set report=10
2508c8de839SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
2518c8de839SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
252910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
253910f66f9SBram Moolenaar   " assuming cygwin
254*5c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
255910f66f9SBram Moolenaar  endif
256910f66f9SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
257910f66f9SBram Moolenaar"  call Decho("fname<".fname.">")
258a5792f58SBram Moolenaar
259*5c73622aSBram Moolenaar  if  fname =~ '\.bz2$' && executable("bzcat")
260*5c73622aSBram Moolenaar   let decmp= "|bzcat"
261*5c73622aSBram Moolenaar   let doro = 1
262*5c73622aSBram Moolenaar  elseif      fname =~ '\.gz$'  && executable("zcat")
2638c8de839SBram Moolenaar   let decmp= "|zcat"
2648c8de839SBram Moolenaar   let doro = 1
265*5c73622aSBram Moolenaar  elseif  fname =~ '\.lzma$' && executable("lzcat")
266*5c73622aSBram Moolenaar   let decmp= "|lzcat"
2678c8de839SBram Moolenaar   let doro = 1
268a5792f58SBram Moolenaar  else
2698c8de839SBram Moolenaar   let decmp=""
2708c8de839SBram Moolenaar   let doro = 0
271*5c73622aSBram Moolenaar   if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.zip$\|\.Z$'
2728c8de839SBram Moolenaar    setlocal bin
273a5792f58SBram Moolenaar   endif
2748c8de839SBram Moolenaar  endif
2758c8de839SBram Moolenaar
276ed39e1d5SBram Moolenaar  if exists("g:tar_secure")
277ed39e1d5SBram Moolenaar   let tar_secure= " -- "
2788c8de839SBram Moolenaar  else
279ed39e1d5SBram Moolenaar   let tar_secure= " "
280ed39e1d5SBram Moolenaar  endif
281*5c73622aSBram Moolenaar  if tarfile =~# '\.bz2$'
282*5c73622aSBram 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)
283*5c73622aSBram Moolenaar   exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
284*5c73622aSBram Moolenaar  elseif tarfile =~# '\.\(gz\|tgz\)$'
285*5c73622aSBram Moolenaar"   call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1))
286*5c73622aSBram Moolenaar   exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
287ed39e1d5SBram Moolenaar  elseif tarfile =~# '\.lrp$'
288*5c73622aSBram 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)
289*5c73622aSBram Moolenaar   exe "silent r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
290*5c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma$'
291*5c73622aSBram 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)
292*5c73622aSBram Moolenaar   exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
293ed39e1d5SBram Moolenaar  else
294ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
295*5c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
296ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
297ed39e1d5SBram Moolenaar   endif
298*5c73622aSBram Moolenaar"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
299*5c73622aSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
3008c8de839SBram Moolenaar  endif
3018c8de839SBram Moolenaar
3028c8de839SBram Moolenaar  if doro
3038c8de839SBram Moolenaar   " because the reverse process of compressing changed files back into the tarball is not currently supported
3048c8de839SBram Moolenaar   setlocal ro
3058c8de839SBram Moolenaar  endif
3068c8de839SBram Moolenaar
307a5792f58SBram Moolenaar  let w:tarfile= a:fname
308c236c16dSBram Moolenaar  exe "file tarfile::".fnameescape(fname)
309a5792f58SBram Moolenaar
310a5792f58SBram Moolenaar  " cleanup
311a5792f58SBram Moolenaar  0d
312a5792f58SBram Moolenaar  set nomod
313a5792f58SBram Moolenaar
314bba577a2SBram Moolenaar  let &report= repkeep
315a5792f58SBram Moolenaar"  call Dret("tar#Read : w:tarfile<".w:tarfile.">")
316a5792f58SBram Moolenaarendfun
317a5792f58SBram Moolenaar
318a5792f58SBram Moolenaar" ---------------------------------------------------------------------
319a5792f58SBram Moolenaar" tar#Write: {{{2
320a5792f58SBram Moolenaarfun! tar#Write(fname)
321a5792f58SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
322bba577a2SBram Moolenaar  let repkeep= &report
323bba577a2SBram Moolenaar  set report=10
324a5792f58SBram Moolenaar
325ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
326ed39e1d5SBram Moolenaar   redraw!
327*5c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
328ed39e1d5SBram Moolenaar"   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
329ed39e1d5SBram Moolenaar   return
330ed39e1d5SBram Moolenaar  endif
331ed39e1d5SBram Moolenaar
332ab194816SBram Moolenaar  " sanity checks
333910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
334c81e5e79SBram Moolenaar   redraw!
335910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
336bba577a2SBram Moolenaar   let &report= repkeep
337ab194816SBram Moolenaar"   call Dret("tar#Write")
338ab194816SBram Moolenaar   return
339ab194816SBram Moolenaar  endif
340ab194816SBram Moolenaar  if !exists("*mkdir")
341c81e5e79SBram Moolenaar   redraw!
342a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
343bba577a2SBram Moolenaar   let &report= repkeep
344ab194816SBram Moolenaar"   call Dret("tar#Write")
345ab194816SBram Moolenaar   return
346ab194816SBram Moolenaar  endif
347ab194816SBram Moolenaar
348ab194816SBram Moolenaar  let curdir= getcwd()
349ab194816SBram Moolenaar  let tmpdir= tempname()
350ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
351ab194816SBram Moolenaar  if tmpdir =~ '\.'
352ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
353ab194816SBram Moolenaar  endif
354ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
355ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
356ab194816SBram Moolenaar
357ab194816SBram Moolenaar  " attempt to change to the indicated directory
358ab194816SBram Moolenaar  try
3598c8de839SBram Moolenaar   exe "cd ".fnameescape(tmpdir)
360ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
361c81e5e79SBram Moolenaar   redraw!
362a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
363bba577a2SBram Moolenaar   let &report= repkeep
364ab194816SBram Moolenaar"   call Dret("tar#Write")
365ab194816SBram Moolenaar   return
366ab194816SBram Moolenaar  endtry
367ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
368ab194816SBram Moolenaar
369a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
370a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
371a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
372ab194816SBram Moolenaar  endif
373a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
374a5792f58SBram Moolenaar  cd _ZIPVIM_
375ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
376ab194816SBram Moolenaar
3778c8de839SBram Moolenaar  let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
3788c8de839SBram Moolenaar  let fname   = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
379a5792f58SBram Moolenaar
380a5792f58SBram Moolenaar  " handle compressed archives
381*5c73622aSBram Moolenaar  if tarfile =~# '\.bz2'
382*5c73622aSBram Moolenaar   call system("bzip2 -d -- ".shellescape(tarfile,0))
383*5c73622aSBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
384*5c73622aSBram Moolenaar   let compress= "bzip2 -- ".shellescape(tarfile,0)
385*5c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
386*5c73622aSBram Moolenaar  elseif tarfile =~# '\.gz'
387*5c73622aSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
388a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
389*5c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
390*5c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
391*5c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma'
392*5c73622aSBram Moolenaar   call system("lzma -d -- ".shellescape(tarfile,0))
393*5c73622aSBram Moolenaar   let tarfile = substitute(tarfile,'\.lzma','','e')
394*5c73622aSBram Moolenaar   let compress= "lzma -- ".shellescape(tarfile,0)
395ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
396a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
397*5c73622aSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
398a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
399*5c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
400a5792f58SBram Moolenaar   let tgz     = 1
401ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
402a5792f58SBram Moolenaar  endif
4038c8de839SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
404a5792f58SBram Moolenaar
405a5792f58SBram Moolenaar  if v:shell_error != 0
406c81e5e79SBram Moolenaar   redraw!
407a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
408a5792f58SBram Moolenaar  else
409a5792f58SBram Moolenaar
410a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
411a5792f58SBram Moolenaar
4121cbe5f73SBram Moolenaar   if fname =~ '/'
413a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
4141cbe5f73SBram Moolenaar    if executable("cygpath")
415*5c73622aSBram Moolenaar     let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
4161cbe5f73SBram Moolenaar    endif
4171cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
4181cbe5f73SBram Moolenaar   endif
419a5792f58SBram Moolenaar   if tarfile !~ '/'
420a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
421a5792f58SBram Moolenaar   endif
422ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
423ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
424ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
425ed39e1d5SBram Moolenaar   endif
426a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
427a5792f58SBram Moolenaar
428ed39e1d5SBram Moolenaar   if exists("g:tar_secure")
429ed39e1d5SBram Moolenaar    let tar_secure= " -- "
430ed39e1d5SBram Moolenaar   else
431ed39e1d5SBram Moolenaar    let tar_secure= " "
432ed39e1d5SBram Moolenaar   endif
4338c8de839SBram Moolenaar   exe "w! ".fnameescape(fname)
434ab194816SBram Moolenaar   if executable("cygpath")
435*5c73622aSBram Moolenaar    let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
436ab194816SBram Moolenaar   endif
437ab194816SBram Moolenaar
438a5792f58SBram Moolenaar   " delete old file from tarfile
439*5c73622aSBram Moolenaar"   call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
440*5c73622aSBram Moolenaar   call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
441ab194816SBram Moolenaar   if v:shell_error != 0
442c81e5e79SBram Moolenaar    redraw!
4438c8de839SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
444ab194816SBram Moolenaar   else
445a5792f58SBram Moolenaar
446a5792f58SBram Moolenaar    " update tarfile with new file
447*5c73622aSBram Moolenaar"    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
448*5c73622aSBram Moolenaar    call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
449a5792f58SBram Moolenaar    if v:shell_error != 0
450c81e5e79SBram Moolenaar     redraw!
4518c8de839SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
452a5792f58SBram Moolenaar    elseif exists("compress")
453a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
454a5792f58SBram Moolenaar     call system(compress)
455a5792f58SBram Moolenaar     if exists("tgz")
456a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
457a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
458a5792f58SBram Moolenaar     endif
459a5792f58SBram Moolenaar    endif
460a5792f58SBram Moolenaar   endif
461a5792f58SBram Moolenaar
462a5792f58SBram Moolenaar   " support writing tarfiles across a network
463a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
464a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
465a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
466a5792f58SBram Moolenaar    1split|enew
467*5c73622aSBram Moolenaar    let binkeep= &l:binary
468a5792f58SBram Moolenaar    let eikeep = &ei
469a5792f58SBram Moolenaar    set binary ei=all
470c236c16dSBram Moolenaar    exe "e! ".fnameescape(tarfile)
471a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
472a5792f58SBram Moolenaar    let &ei       = eikeep
473*5c73622aSBram Moolenaar    let &l:binary = binkeep
474a5792f58SBram Moolenaar    q!
475a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
476a5792f58SBram Moolenaar   endif
477ab194816SBram Moolenaar  endif
478ab194816SBram Moolenaar
479ab194816SBram Moolenaar  " cleanup and restore current directory
480ab194816SBram Moolenaar  cd ..
481a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
482c236c16dSBram Moolenaar  exe "cd ".fnameescape(curdir)
483ab194816SBram Moolenaar  setlocal nomod
484ab194816SBram Moolenaar
485bba577a2SBram Moolenaar  let &report= repkeep
486ab194816SBram Moolenaar"  call Dret("tar#Write")
487ab194816SBram Moolenaarendfun
488ab194816SBram Moolenaar
489ab194816SBram Moolenaar" ---------------------------------------------------------------------
490*5c73622aSBram Moolenaar" s:Rmdir: {{{2
491ab194816SBram Moolenaarfun! s:Rmdir(fname)
492ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
493ab194816SBram Moolenaar  if has("unix")
494*5c73622aSBram Moolenaar   call system("/bin/rm -rf -- ".shellescape(a:fname,0))
495ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
496ab194816SBram Moolenaar   if &shell =~? "sh$"
497*5c73622aSBram Moolenaar    call system("/bin/rm -rf -- ".shellescape(a:fname,0))
498ab194816SBram Moolenaar   else
499*5c73622aSBram Moolenaar    call system("del /S ".shellescape(a:fname,0))
500ab194816SBram Moolenaar   endif
501ab194816SBram Moolenaar  endif
502ab194816SBram Moolenaar"  call Dret("Rmdir")
503ab194816SBram Moolenaarendfun
504ab194816SBram Moolenaar
5058c8de839SBram Moolenaar" ---------------------------------------------------------------------
506*5c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
507*5c73622aSBram Moolenaarfun! tar#Vimuntar(...)
508*5c73622aSBram Moolenaar"  call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
509*5c73622aSBram Moolenaar  let tarball = expand("%")
510*5c73622aSBram Moolenaar"  call Decho("tarball<".tarball.">")
511*5c73622aSBram Moolenaar  let tarbase = substitute(tarball,'\..*$','','')
512*5c73622aSBram Moolenaar"  call Decho("tarbase<".tarbase.">")
513*5c73622aSBram Moolenaar  let tarhome = expand("%:p")
514*5c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
515*5c73622aSBram Moolenaar   let tarhome= substitute(tarhome,'\\','/','g')
516*5c73622aSBram Moolenaar  endif
517*5c73622aSBram Moolenaar  let tarhome= substitute(tarhome,'/[^/]*$','','')
518*5c73622aSBram Moolenaar"  call Decho("tarhome<".tarhome.">")
519*5c73622aSBram Moolenaar  let tartail = expand("%:t")
520*5c73622aSBram Moolenaar"  call Decho("tartail<".tartail.">")
521*5c73622aSBram Moolenaar  let curdir  = getcwd()
522*5c73622aSBram Moolenaar"  call Decho("curdir <".curdir.">")
523*5c73622aSBram Moolenaar  " set up vimhome
524*5c73622aSBram Moolenaar  if a:0 > 0 && a:1 != ""
525*5c73622aSBram Moolenaar   let vimhome= a:1
526c236c16dSBram Moolenaar  else
527*5c73622aSBram Moolenaar   let vimhome= vimball#VimballHome()
528*5c73622aSBram Moolenaar  endif
529*5c73622aSBram Moolenaar"  call Decho("vimhome<".vimhome.">")
530*5c73622aSBram Moolenaar
531*5c73622aSBram Moolenaar"  call Decho("curdir<".curdir."> vimhome<".vimhome.">")
532*5c73622aSBram Moolenaar  if simplify(curdir) != simplify(vimhome)
533*5c73622aSBram Moolenaar   " copy (possibly compressed) tarball to .vim/vimfiles
534*5c73622aSBram Moolenaar"   call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
535*5c73622aSBram Moolenaar   call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
536*5c73622aSBram Moolenaar"   call Decho("exe cd ".fnameescape(vimhome))
537*5c73622aSBram Moolenaar   exe "cd ".fnameescape(vimhome)
538*5c73622aSBram Moolenaar  endif
539*5c73622aSBram Moolenaar"  call Decho("getcwd<".getcwd().">")
540*5c73622aSBram Moolenaar
541*5c73622aSBram Moolenaar  " if necessary, decompress the tarball; then, extract it
542*5c73622aSBram Moolenaar  if tartail =~ '\.tgz'
543*5c73622aSBram Moolenaar   if executable("gunzip")
544*5c73622aSBram Moolenaar    silent exe "!gunzip ".shellescape(tartail)
545*5c73622aSBram Moolenaar   elseif executable("gzip")
546*5c73622aSBram Moolenaar    silent exe "!gzip -d ".shellescape(tartail)
547*5c73622aSBram Moolenaar   else
548*5c73622aSBram Moolenaar    echoerr "unable to decompress<".tartail."> on this sytem"
549*5c73622aSBram Moolenaar    if simplify(curdir) != simplify(tarhome)
550*5c73622aSBram Moolenaar     " remove decompressed tarball, restore directory
551*5c73622aSBram Moolenaar"     call Decho("delete(".tartail.".tar)")
552*5c73622aSBram Moolenaar     call delete(tartail.".tar")
553*5c73622aSBram Moolenaar"     call Decho("exe cd ".fnameescape(curdir))
554*5c73622aSBram Moolenaar     exe "cd ".fnameescape(curdir)
555*5c73622aSBram Moolenaar    endif
556*5c73622aSBram Moolenaar"    call Dret("tar#Vimuntar")
557*5c73622aSBram Moolenaar    return
558c236c16dSBram Moolenaar   endif
5598c8de839SBram Moolenaar  else
560*5c73622aSBram Moolenaar   call vimball#Decompress(tartail,0)
5618c8de839SBram Moolenaar  endif
562*5c73622aSBram Moolenaar  let extractcmd= netrw#WinPath(g:tar_extractcmd)
563*5c73622aSBram Moolenaar"  call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
564*5c73622aSBram Moolenaar  call system(extractcmd." ".shellescape(tarbase.".tar"))
565*5c73622aSBram Moolenaar
566*5c73622aSBram Moolenaar  " set up help
567*5c73622aSBram Moolenaar  if filereadable("doc/".tarbase.".txt")
568*5c73622aSBram Moolenaar"   call Decho("exe helptags ".getcwd()."/doc")
569*5c73622aSBram Moolenaar   exe "helptags ".getcwd()."/doc"
570*5c73622aSBram Moolenaar  endif
571*5c73622aSBram Moolenaar
572*5c73622aSBram Moolenaar  if simplify(tarhome) != simplify(vimhome)
573*5c73622aSBram Moolenaar   " remove decompressed tarball, restore directory
574*5c73622aSBram Moolenaar   call delete(vimhome."/".tarbase.".tar")
575*5c73622aSBram Moolenaar   exe "cd ".fnameescape(curdir)
576*5c73622aSBram Moolenaar  endif
577*5c73622aSBram Moolenaar
578*5c73622aSBram Moolenaar"  call Dret("tar#Vimuntar")
5798c8de839SBram Moolenaarendfun
5808c8de839SBram Moolenaar
581*5c73622aSBram Moolenaar" =====================================================================
582a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
583a5792f58SBram Moolenaarlet &cpo= s:keepcpo
584a5792f58SBram Moolenaarunlet s:keepcpo
585a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
586