xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision ed39e1d5)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*ed39e1d5SBram Moolenaar" Date:			Aug 08, 2008
4*ed39e1d5SBram Moolenaar" Version:		23 + modifications by Bram
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"
108c8de839SBram Moolenaar" Copyright:    Copyright (C) 2005-2008 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.
1987e25fdfSBram Moolenaar
20ab194816SBram Moolenaar" ---------------------------------------------------------------------
21c81e5e79SBram Moolenaar" Load Once: {{{1
22a5792f58SBram Moolenaarlet s:keepcpo= &cpo
23a5792f58SBram Moolenaarset cpo&vim
24c81e5e79SBram Moolenaarif &cp || exists("g:loaded_tar") || v:version < 700
25a5792f58SBram Moolenaar finish
26a5792f58SBram Moolenaarendif
27*ed39e1d5SBram Moolenaarlet g:loaded_tar= "v23b"
28910f66f9SBram Moolenaar"call Decho("loading autoload/tar.vim")
298c8de839SBram Moolenaarif v:version < 701 || (v:version == 701 && !has("patch299"))
308c8de839SBram Moolenaar echoerr "(autoload/tar.vim) need vim v7.1 with patchlevel 299"
318c8de839SBram Moolenaarendif
3287e25fdfSBram Moolenaar
33a5792f58SBram Moolenaar" ---------------------------------------------------------------------
34a5792f58SBram Moolenaar"  Default Settings: {{{1
35a5792f58SBram Moolenaarif !exists("g:tar_browseoptions")
36a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf"
37a5792f58SBram Moolenaarendif
38a5792f58SBram Moolenaarif !exists("g:tar_readoptions")
39a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf"
40a5792f58SBram Moolenaarendif
41910f66f9SBram Moolenaarif !exists("g:tar_cmd")
42910f66f9SBram Moolenaar let g:tar_cmd= "tar"
43910f66f9SBram Moolenaarendif
44a5792f58SBram Moolenaarif !exists("g:tar_writeoptions")
45a5792f58SBram Moolenaar let g:tar_writeoptions= "uf"
46a5792f58SBram Moolenaarendif
478c8de839SBram Moolenaar
488c8de839SBram Moolenaarif !exists("g:netrw_cygwin")
498c8de839SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
508c8de839SBram Moolenaar  if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
518c8de839SBram Moolenaar   let g:netrw_cygwin= 1
528c8de839SBram Moolenaar  else
538c8de839SBram Moolenaar   let g:netrw_cygwin= 0
548c8de839SBram Moolenaar  endif
558c8de839SBram Moolenaar else
568c8de839SBram Moolenaar  let g:netrw_cygwin= 0
578c8de839SBram Moolenaar endif
588c8de839SBram Moolenaarendif
598c8de839SBram Moolenaar
608c8de839SBram Moolenaar" set up shell quoting character
61c81e5e79SBram Moolenaarif !exists("g:tar_shq")
628c8de839SBram Moolenaar if exists("&shq") && &shq != ""
638c8de839SBram Moolenaar  let g:tar_shq= &shq
648c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16")
658c8de839SBram Moolenaar  if exists("g:netrw_cygwin") && g:netrw_cygwin
66c81e5e79SBram Moolenaar   let g:tar_shq= "'"
67c81e5e79SBram Moolenaar  else
68c81e5e79SBram Moolenaar   let g:tar_shq= '"'
69c81e5e79SBram Moolenaar  endif
708c8de839SBram Moolenaar else
718c8de839SBram Moolenaar  let g:tar_shq= "'"
728c8de839SBram Moolenaar endif
738c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">")
74c81e5e79SBram Moolenaarendif
75a5792f58SBram Moolenaar
76a5792f58SBram Moolenaar" ----------------
77a5792f58SBram Moolenaar"  Functions: {{{1
78a5792f58SBram Moolenaar" ----------------
79a5792f58SBram Moolenaar
80a5792f58SBram Moolenaar" ---------------------------------------------------------------------
81a5792f58SBram Moolenaar" tar#Browse: {{{2
82a5792f58SBram Moolenaarfun! tar#Browse(tarfile)
83a5792f58SBram Moolenaar"  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
84bba577a2SBram Moolenaar  let repkeep= &report
85bba577a2SBram Moolenaar  set report=10
86a5792f58SBram Moolenaar
87a5792f58SBram Moolenaar  " sanity checks
88910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
89c81e5e79SBram Moolenaar   redraw!
90910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
91c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
92bba577a2SBram Moolenaar   let &report= repkeep
93a5792f58SBram Moolenaar"   call Dret("tar#Browse")
9487e25fdfSBram Moolenaar   return
9587e25fdfSBram Moolenaar  endif
96a5792f58SBram Moolenaar  if !filereadable(a:tarfile)
97910f66f9SBram Moolenaar"   call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
98a5792f58SBram Moolenaar   if a:tarfile !~# '^\a\+://'
99a5792f58SBram Moolenaar    " if its an url, don't complain, let url-handlers such as vim do its thing
100c81e5e79SBram Moolenaar    redraw!
101a5792f58SBram Moolenaar    echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
102c81e5e79SBram Moolenaar"    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
10387e25fdfSBram Moolenaar   endif
104bba577a2SBram Moolenaar   let &report= repkeep
105a5792f58SBram Moolenaar"   call Dret("tar#Browse : file<".a:tarfile."> not readable")
10687e25fdfSBram Moolenaar   return
10787e25fdfSBram Moolenaar  endif
108a5792f58SBram Moolenaar  if &ma != 1
109a5792f58SBram Moolenaar   set ma
11087e25fdfSBram Moolenaar  endif
111a5792f58SBram Moolenaar  let w:tarfile= a:tarfile
112a5792f58SBram Moolenaar
113a5792f58SBram Moolenaar  setlocal noswapfile
114a5792f58SBram Moolenaar  setlocal buftype=nofile
115a5792f58SBram Moolenaar  setlocal bufhidden=hide
116a5792f58SBram Moolenaar  setlocal nobuflisted
117a5792f58SBram Moolenaar  setlocal nowrap
118a5792f58SBram Moolenaar  set ft=tar
119a5792f58SBram Moolenaar
120a5792f58SBram Moolenaar  " give header
121910f66f9SBram Moolenaar"  call Decho("printing header")
1228c8de839SBram Moolenaar  let lastline= line("$")
1238c8de839SBram Moolenaar  call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
1248c8de839SBram Moolenaar  call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
1258c8de839SBram Moolenaar  call setline(lastline+3,'" Select a file with cursor and press ENTER')
1268c8de839SBram Moolenaar  $put =''
127a5792f58SBram Moolenaar  0d
128a5792f58SBram Moolenaar  $
129a5792f58SBram Moolenaar
130910f66f9SBram Moolenaar  let tarfile= a:tarfile
131910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
132910f66f9SBram Moolenaar   " assuming cygwin
133c236c16dSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
134a5792f58SBram Moolenaar  endif
135d68071d8SBram Moolenaar  let curlast= line("$")
136910f66f9SBram Moolenaar  if tarfile =~# '\.\(gz\|tgz\)$'
137*ed39e1d5SBram Moolenaar"   call Decho("1: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
138c236c16dSBram Moolenaar   exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1398c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp'
140c236c16dSBram Moolenaar"   call Decho("2: exe silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
141c236c16dSBram Moolenaar   exe "silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
142910f66f9SBram Moolenaar  elseif tarfile =~# '\.bz2$'
143*ed39e1d5SBram Moolenaar"   call Decho("3: exe silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
144c236c16dSBram Moolenaar   exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
145910f66f9SBram Moolenaar  else
146*ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
147*ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
148*ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
149*ed39e1d5SBram Moolenaar   endif
150*ed39e1d5SBram Moolenaar"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1))
151c236c16dSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1)
152910f66f9SBram Moolenaar  endif
153910f66f9SBram Moolenaar  if v:shell_error != 0
154c81e5e79SBram Moolenaar   redraw!
155d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
156c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
157d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
158d68071d8SBram Moolenaar   return
159d68071d8SBram Moolenaar  endif
160c81e5e79SBram Moolenaar  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
161c81e5e79SBram Moolenaar   redraw!
162d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
163c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
164d68071d8SBram Moolenaar   silent %d
165d68071d8SBram Moolenaar   let eikeep= &ei
166d68071d8SBram Moolenaar   set ei=BufReadCmd,FileReadCmd
167c236c16dSBram Moolenaar   exe "r ".fnameescape(a:tarfile)
168d68071d8SBram Moolenaar   let &ei= eikeep
169d68071d8SBram Moolenaar   1d
170d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
171910f66f9SBram Moolenaar   return
172910f66f9SBram Moolenaar  endif
173a5792f58SBram Moolenaar
174a5792f58SBram Moolenaar  setlocal noma nomod ro
175a5792f58SBram Moolenaar  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
176a5792f58SBram Moolenaar
177bba577a2SBram Moolenaar  let &report= repkeep
178a5792f58SBram Moolenaar"  call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
179ab194816SBram Moolenaarendfun
18087e25fdfSBram Moolenaar
181ab194816SBram Moolenaar" ---------------------------------------------------------------------
182a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
183a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
184a5792f58SBram Moolenaar"  call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
185bba577a2SBram Moolenaar  let repkeep= &report
186bba577a2SBram Moolenaar  set report=10
187a5792f58SBram Moolenaar  let fname= getline(".")
188a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
189a5792f58SBram Moolenaar
190*ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
191*ed39e1d5SBram Moolenaar   redraw!
192*ed39e1d5SBram Moolenaar   echohl WarningMsg | echo '***error*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"; See :help tar-options'
193*ed39e1d5SBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
194*ed39e1d5SBram Moolenaar   return
195*ed39e1d5SBram Moolenaar  endif
196*ed39e1d5SBram Moolenaar
197a5792f58SBram Moolenaar  " sanity check
198a5792f58SBram Moolenaar  if fname =~ '^"'
199bba577a2SBram Moolenaar   let &report= repkeep
200a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
201a5792f58SBram Moolenaar   return
202a5792f58SBram Moolenaar  endif
203a5792f58SBram Moolenaar
204a5792f58SBram Moolenaar  " about to make a new window, need to use w:tarfile
205a5792f58SBram Moolenaar  let tarfile= w:tarfile
206a5792f58SBram Moolenaar  let curfile= expand("%")
207910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
208910f66f9SBram Moolenaar   " assuming cygwin
209c236c16dSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
210910f66f9SBram Moolenaar  endif
211a5792f58SBram Moolenaar
212a5792f58SBram Moolenaar  new
2138c8de839SBram Moolenaar  if !exists("g:tar_nomax") || g:tar_nomax == 0
214a5792f58SBram Moolenaar   wincmd _
2158c8de839SBram Moolenaar  endif
216a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
2178c8de839SBram Moolenaar  call tar#Read("tarfile:".tarfile.'::'.fname,1)
218a5792f58SBram Moolenaar  filetype detect
219a5792f58SBram Moolenaar
220bba577a2SBram Moolenaar  let &report= repkeep
221a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
222a5792f58SBram Moolenaarendfun
223a5792f58SBram Moolenaar
224a5792f58SBram Moolenaar" ---------------------------------------------------------------------
225a5792f58SBram Moolenaar" tar#Read: {{{2
226a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
227a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
228bba577a2SBram Moolenaar  let repkeep= &report
229bba577a2SBram Moolenaar  set report=10
2308c8de839SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
2318c8de839SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
232910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
233910f66f9SBram Moolenaar   " assuming cygwin
234c236c16dSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
235910f66f9SBram Moolenaar  endif
236910f66f9SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
237910f66f9SBram Moolenaar"  call Decho("fname<".fname.">")
238a5792f58SBram Moolenaar
2398c8de839SBram Moolenaar  if      fname =~ '\.gz$'  && executable("zcat")
2408c8de839SBram Moolenaar   let decmp= "|zcat"
2418c8de839SBram Moolenaar   let doro = 1
2428c8de839SBram Moolenaar  elseif  fname =~ '\.bz2$' && executable("bzcat")
2438c8de839SBram Moolenaar   let decmp= "|bzcat"
2448c8de839SBram Moolenaar   let doro = 1
245a5792f58SBram Moolenaar  else
2468c8de839SBram Moolenaar   let decmp=""
2478c8de839SBram Moolenaar   let doro = 0
2488c8de839SBram Moolenaar   if fname =~ '\.gz$\|\.bz2$\|\.Z$\|\.zip$'
2498c8de839SBram Moolenaar    setlocal bin
250a5792f58SBram Moolenaar   endif
2518c8de839SBram Moolenaar  endif
2528c8de839SBram Moolenaar
253*ed39e1d5SBram Moolenaar  if exists("g:tar_secure")
254*ed39e1d5SBram Moolenaar   let tar_secure= " -- "
2558c8de839SBram Moolenaar  else
256*ed39e1d5SBram Moolenaar   let tar_secure= " "
257*ed39e1d5SBram Moolenaar  endif
258*ed39e1d5SBram Moolenaar  if tarfile =~# '\.\(gz\|tgz\)$'
259*ed39e1d5SBram Moolenaar"   call Decho("5: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.s:Escape(fname,1))
260*ed39e1d5SBram Moolenaar   exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp
261*ed39e1d5SBram Moolenaar  elseif tarfile =~# '\.lrp$'
262*ed39e1d5SBram Moolenaar"   call Decho("6: exe silent r! cat ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp)
263*ed39e1d5SBram Moolenaar   exe "silent r! cat -- ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp
264*ed39e1d5SBram Moolenaar  elseif tarfile =~# '\.bz2$'
265*ed39e1d5SBram Moolenaar"   call Decho("7: exe silent r! bzip2 -d -c ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp)
266*ed39e1d5SBram Moolenaar   exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp
267*ed39e1d5SBram Moolenaar  else
268*ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
269*ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
270*ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
271*ed39e1d5SBram Moolenaar   endif
272*ed39e1d5SBram Moolenaar"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions." "s:Escape(tarfile,1).tar_secure..s:Escape(fname,1).decmp)
273*ed39e1d5SBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".s:Escape(tarfile,1).tar_secure.s:Escape(fname,1).decmp
2748c8de839SBram Moolenaar  endif
2758c8de839SBram Moolenaar
2768c8de839SBram Moolenaar  if doro
2778c8de839SBram Moolenaar   " because the reverse process of compressing changed files back into the tarball is not currently supported
2788c8de839SBram Moolenaar   setlocal ro
2798c8de839SBram Moolenaar  endif
2808c8de839SBram Moolenaar
281a5792f58SBram Moolenaar  let w:tarfile= a:fname
282c236c16dSBram Moolenaar  exe "file tarfile::".fnameescape(fname)
283a5792f58SBram Moolenaar
284a5792f58SBram Moolenaar  " cleanup
285a5792f58SBram Moolenaar  0d
286a5792f58SBram Moolenaar  set nomod
287a5792f58SBram Moolenaar
288bba577a2SBram Moolenaar  let &report= repkeep
289a5792f58SBram Moolenaar"  call Dret("tar#Read : w:tarfile<".w:tarfile.">")
290a5792f58SBram Moolenaarendfun
291a5792f58SBram Moolenaar
292a5792f58SBram Moolenaar" ---------------------------------------------------------------------
293a5792f58SBram Moolenaar" tar#Write: {{{2
294a5792f58SBram Moolenaarfun! tar#Write(fname)
295a5792f58SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
296bba577a2SBram Moolenaar  let repkeep= &report
297bba577a2SBram Moolenaar  set report=10
298a5792f58SBram Moolenaar
299*ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
300*ed39e1d5SBram Moolenaar   redraw!
301*ed39e1d5SBram Moolenaar   echohl WarningMsg | echo '***error*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"; See :help tar-options'
302*ed39e1d5SBram Moolenaar"   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
303*ed39e1d5SBram Moolenaar   return
304*ed39e1d5SBram Moolenaar  endif
305*ed39e1d5SBram Moolenaar
306ab194816SBram Moolenaar  " sanity checks
307910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
308c81e5e79SBram Moolenaar   redraw!
309910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
310c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
311bba577a2SBram Moolenaar   let &report= repkeep
312ab194816SBram Moolenaar"   call Dret("tar#Write")
313ab194816SBram Moolenaar   return
314ab194816SBram Moolenaar  endif
315ab194816SBram Moolenaar  if !exists("*mkdir")
316c81e5e79SBram Moolenaar   redraw!
317a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
318c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
319bba577a2SBram Moolenaar   let &report= repkeep
320ab194816SBram Moolenaar"   call Dret("tar#Write")
321ab194816SBram Moolenaar   return
322ab194816SBram Moolenaar  endif
323ab194816SBram Moolenaar
324ab194816SBram Moolenaar  let curdir= getcwd()
325ab194816SBram Moolenaar  let tmpdir= tempname()
326ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
327ab194816SBram Moolenaar  if tmpdir =~ '\.'
328ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
329ab194816SBram Moolenaar  endif
330ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
331ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
332ab194816SBram Moolenaar
333ab194816SBram Moolenaar  " attempt to change to the indicated directory
334ab194816SBram Moolenaar  try
3358c8de839SBram Moolenaar   exe "cd ".fnameescape(tmpdir)
336ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
337c81e5e79SBram Moolenaar   redraw!
338a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
339c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
340bba577a2SBram Moolenaar   let &report= repkeep
341ab194816SBram Moolenaar"   call Dret("tar#Write")
342ab194816SBram Moolenaar   return
343ab194816SBram Moolenaar  endtry
344ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
345ab194816SBram Moolenaar
346a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
347a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
348a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
349ab194816SBram Moolenaar  endif
350a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
351a5792f58SBram Moolenaar  cd _ZIPVIM_
352ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
353ab194816SBram Moolenaar
3548c8de839SBram Moolenaar  let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
3558c8de839SBram Moolenaar  let fname   = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
356a5792f58SBram Moolenaar
357a5792f58SBram Moolenaar  " handle compressed archives
358a5792f58SBram Moolenaar  if tarfile =~# '\.gz'
359c236c16dSBram Moolenaar   call system("gzip -d -- ".s:Escape(tarfile,0))
360a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
361*ed39e1d5SBram Moolenaar   let compress= "gzip -- ".s:Escape(tarfile,0)
362*ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
363a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
364c236c16dSBram Moolenaar   call system("gzip -d -- ".s:Escape(tarfile,0))
365a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
366c236c16dSBram Moolenaar   let compress= "gzip -- ".s:Escape(tarfile,0)
367a5792f58SBram Moolenaar   let tgz     = 1
368*ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
369a5792f58SBram Moolenaar  elseif tarfile =~# '\.bz2'
370c236c16dSBram Moolenaar   call system("bzip2 -d -- ".s:Escape(tarfile,0))
371a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
372c236c16dSBram Moolenaar   let compress= "bzip2 -- ".s:Escape(tarfile,0)
373*ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
374a5792f58SBram Moolenaar  endif
3758c8de839SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
376a5792f58SBram Moolenaar
377a5792f58SBram Moolenaar  if v:shell_error != 0
378c81e5e79SBram Moolenaar   redraw!
379a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
380c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
381a5792f58SBram Moolenaar  else
382a5792f58SBram Moolenaar
383a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
384a5792f58SBram Moolenaar
3851cbe5f73SBram Moolenaar   if fname =~ '/'
386a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
3871cbe5f73SBram Moolenaar    if executable("cygpath")
388c236c16dSBram Moolenaar     let dirpath = substitute(system("cygpath ".s:Escape(dirpath, 0)),'\n','','e')
3891cbe5f73SBram Moolenaar    endif
3901cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
3911cbe5f73SBram Moolenaar   endif
392a5792f58SBram Moolenaar   if tarfile !~ '/'
393a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
394a5792f58SBram Moolenaar   endif
395*ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
396*ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
397*ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
398*ed39e1d5SBram Moolenaar   endif
399a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
400a5792f58SBram Moolenaar
401*ed39e1d5SBram Moolenaar   if exists("g:tar_secure")
402*ed39e1d5SBram Moolenaar    let tar_secure= " -- "
403*ed39e1d5SBram Moolenaar   else
404*ed39e1d5SBram Moolenaar    let tar_secure= " "
405*ed39e1d5SBram Moolenaar   endif
4068c8de839SBram Moolenaar   exe "w! ".fnameescape(fname)
407ab194816SBram Moolenaar   if executable("cygpath")
408c236c16dSBram Moolenaar    let tarfile = substitute(system("cygpath ".s:Escape(tarfile,0)),'\n','','e')
409ab194816SBram Moolenaar   endif
410ab194816SBram Moolenaar
411a5792f58SBram Moolenaar   " delete old file from tarfile
412*ed39e1d5SBram Moolenaar"   call Decho("system(".g:tar_cmd." --delete -f ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0).")")
413*ed39e1d5SBram Moolenaar   call system(g:tar_cmd." --delete -f ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0))
414ab194816SBram Moolenaar   if v:shell_error != 0
415c81e5e79SBram Moolenaar    redraw!
4168c8de839SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
417c81e5e79SBram Moolenaar"    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
418ab194816SBram Moolenaar   else
419a5792f58SBram Moolenaar
420a5792f58SBram Moolenaar    " update tarfile with new file
421*ed39e1d5SBram Moolenaar"    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0))
422*ed39e1d5SBram Moolenaar    call system(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0))
423a5792f58SBram Moolenaar    if v:shell_error != 0
424c81e5e79SBram Moolenaar     redraw!
4258c8de839SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
426c81e5e79SBram Moolenaar"     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
427a5792f58SBram Moolenaar    elseif exists("compress")
428a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
429a5792f58SBram Moolenaar     call system(compress)
430a5792f58SBram Moolenaar     if exists("tgz")
431a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
432a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
433a5792f58SBram Moolenaar     endif
434a5792f58SBram Moolenaar    endif
435a5792f58SBram Moolenaar   endif
436a5792f58SBram Moolenaar
437a5792f58SBram Moolenaar   " support writing tarfiles across a network
438a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
439a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
440a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
441a5792f58SBram Moolenaar    1split|enew
442a5792f58SBram Moolenaar    let binkeep= &binary
443a5792f58SBram Moolenaar    let eikeep = &ei
444a5792f58SBram Moolenaar    set binary ei=all
445c236c16dSBram Moolenaar    exe "e! ".fnameescape(tarfile)
446a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
447a5792f58SBram Moolenaar    let &ei     = eikeep
448a5792f58SBram Moolenaar    let &binary = binkeep
449a5792f58SBram Moolenaar    q!
450a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
451a5792f58SBram Moolenaar   endif
452ab194816SBram Moolenaar  endif
453ab194816SBram Moolenaar
454ab194816SBram Moolenaar  " cleanup and restore current directory
455ab194816SBram Moolenaar  cd ..
456a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
457c236c16dSBram Moolenaar  exe "cd ".fnameescape(curdir)
458ab194816SBram Moolenaar  setlocal nomod
459ab194816SBram Moolenaar
460bba577a2SBram Moolenaar  let &report= repkeep
461ab194816SBram Moolenaar"  call Dret("tar#Write")
462ab194816SBram Moolenaarendfun
463ab194816SBram Moolenaar
464ab194816SBram Moolenaar" ---------------------------------------------------------------------
465a5792f58SBram Moolenaar" Rmdir: {{{2
466ab194816SBram Moolenaarfun! s:Rmdir(fname)
467ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
468ab194816SBram Moolenaar  if has("unix")
469c236c16dSBram Moolenaar   call system("/bin/rm -rf -- ".s:Escape(a:fname,0))
470ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
471ab194816SBram Moolenaar   if &shell =~? "sh$"
472c236c16dSBram Moolenaar    call system("/bin/rm -rf -- ".s:Escape(a:fname,0))
473ab194816SBram Moolenaar   else
474c236c16dSBram Moolenaar    call system("del /S ".s:Escape(a:fname,0))
475ab194816SBram Moolenaar   endif
476ab194816SBram Moolenaar  endif
477ab194816SBram Moolenaar"  call Dret("Rmdir")
478ab194816SBram Moolenaarendfun
479ab194816SBram Moolenaar
4808c8de839SBram Moolenaar" ---------------------------------------------------------------------
4818c8de839SBram Moolenaar" s:Escape: {{{2
482c236c16dSBram Moolenaarfun s:Escape(name,isfilt)
4838c8de839SBram Moolenaar  " shellescape() was added by patch 7.0.111
4848c8de839SBram Moolenaar  if exists("*shellescape")
485c236c16dSBram Moolenaar   if a:isfilt
486c236c16dSBram Moolenaar    let qnameq= shellescape(a:name,1)
487c236c16dSBram Moolenaar   else
4888c8de839SBram Moolenaar    let qnameq= shellescape(a:name)
489c236c16dSBram Moolenaar   endif
4908c8de839SBram Moolenaar  else
4918c8de839SBram Moolenaar   let qnameq= g:tar_shq . a:name . g:tar_shq
4928c8de839SBram Moolenaar  endif
4938c8de839SBram Moolenaar  return qnameq
4948c8de839SBram Moolenaarendfun
4958c8de839SBram Moolenaar
4968c8de839SBram Moolenaar" ---------------------------------------------------------------------
497a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
498a5792f58SBram Moolenaarlet &cpo= s:keepcpo
499a5792f58SBram Moolenaarunlet s:keepcpo
500a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
501