xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision c236c16d)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*c236c16dSBram Moolenaar" Date:			Jul 12, 2008
4*c236c16dSBram Moolenaar" Version:		19 + changes 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*c236c16dSBram Moolenaarlet g:loaded_tar= "v19+b"
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
133*c236c16dSBram 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*c236c16dSBram Moolenaar"   call Decho("1: exe silent r! gzip -d -c ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
138*c236c16dSBram Moolenaar   exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1398c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp'
140*c236c16dSBram Moolenaar"   call Decho("2: exe silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
141*c236c16dSBram Moolenaar   exe "silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
142910f66f9SBram Moolenaar  elseif tarfile =~# '\.bz2$'
143*c236c16dSBram Moolenaar"   call Decho("3: exe silent r! bzip2 -d -c ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
144*c236c16dSBram Moolenaar   exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
145910f66f9SBram Moolenaar  else
146*c236c16dSBram Moolenaar"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,0))
147*c236c16dSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1)
148910f66f9SBram Moolenaar  endif
149910f66f9SBram Moolenaar  if v:shell_error != 0
150c81e5e79SBram Moolenaar   redraw!
151d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
152c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
153d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
154d68071d8SBram Moolenaar   return
155d68071d8SBram Moolenaar  endif
156c81e5e79SBram Moolenaar  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
157c81e5e79SBram Moolenaar   redraw!
158d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
159c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
160d68071d8SBram Moolenaar   silent %d
161d68071d8SBram Moolenaar   let eikeep= &ei
162d68071d8SBram Moolenaar   set ei=BufReadCmd,FileReadCmd
163*c236c16dSBram Moolenaar   exe "r ".fnameescape(a:tarfile)
164d68071d8SBram Moolenaar   let &ei= eikeep
165d68071d8SBram Moolenaar   1d
166d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
167910f66f9SBram Moolenaar   return
168910f66f9SBram Moolenaar  endif
169a5792f58SBram Moolenaar
170a5792f58SBram Moolenaar  setlocal noma nomod ro
171a5792f58SBram Moolenaar  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
172a5792f58SBram Moolenaar
173bba577a2SBram Moolenaar  let &report= repkeep
174a5792f58SBram Moolenaar"  call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
175ab194816SBram Moolenaarendfun
17687e25fdfSBram Moolenaar
177ab194816SBram Moolenaar" ---------------------------------------------------------------------
178a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
179a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
180a5792f58SBram Moolenaar"  call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
181bba577a2SBram Moolenaar  let repkeep= &report
182bba577a2SBram Moolenaar  set report=10
183a5792f58SBram Moolenaar  let fname= getline(".")
184a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
185a5792f58SBram Moolenaar
186a5792f58SBram Moolenaar  " sanity check
187a5792f58SBram Moolenaar  if fname =~ '^"'
188bba577a2SBram Moolenaar   let &report= repkeep
189a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
190a5792f58SBram Moolenaar   return
191a5792f58SBram Moolenaar  endif
192a5792f58SBram Moolenaar
193a5792f58SBram Moolenaar  " about to make a new window, need to use w:tarfile
194a5792f58SBram Moolenaar  let tarfile= w:tarfile
195a5792f58SBram Moolenaar  let curfile= expand("%")
196910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
197910f66f9SBram Moolenaar   " assuming cygwin
198*c236c16dSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
199910f66f9SBram Moolenaar  endif
200a5792f58SBram Moolenaar
201a5792f58SBram Moolenaar  new
2028c8de839SBram Moolenaar  if !exists("g:tar_nomax") || g:tar_nomax == 0
203a5792f58SBram Moolenaar   wincmd _
2048c8de839SBram Moolenaar  endif
205a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
2068c8de839SBram Moolenaar  call tar#Read("tarfile:".tarfile.'::'.fname,1)
207a5792f58SBram Moolenaar  filetype detect
208a5792f58SBram Moolenaar
209bba577a2SBram Moolenaar  let &report= repkeep
210a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
211a5792f58SBram Moolenaarendfun
212a5792f58SBram Moolenaar
213a5792f58SBram Moolenaar" ---------------------------------------------------------------------
214a5792f58SBram Moolenaar" tar#Read: {{{2
215a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
216a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
217bba577a2SBram Moolenaar  let repkeep= &report
218bba577a2SBram Moolenaar  set report=10
2198c8de839SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
2208c8de839SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
221910f66f9SBram Moolenaar  if has("win32") && executable("cygpath")
222910f66f9SBram Moolenaar   " assuming cygwin
223*c236c16dSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
224910f66f9SBram Moolenaar  endif
225910f66f9SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
226910f66f9SBram Moolenaar"  call Decho("fname<".fname.">")
227a5792f58SBram Moolenaar
2288c8de839SBram Moolenaar  if      fname =~ '\.gz$'  && executable("zcat")
2298c8de839SBram Moolenaar   let decmp= "|zcat"
2308c8de839SBram Moolenaar   let doro = 1
2318c8de839SBram Moolenaar  elseif  fname =~ '\.bz2$' && executable("bzcat")
2328c8de839SBram Moolenaar   let decmp= "|bzcat"
2338c8de839SBram Moolenaar   let doro = 1
234a5792f58SBram Moolenaar  else
2358c8de839SBram Moolenaar   let decmp=""
2368c8de839SBram Moolenaar   let doro = 0
2378c8de839SBram Moolenaar   if fname =~ '\.gz$\|\.bz2$\|\.Z$\|\.zip$'
2388c8de839SBram Moolenaar    setlocal bin
239a5792f58SBram Moolenaar   endif
2408c8de839SBram Moolenaar  endif
2418c8de839SBram Moolenaar
2428c8de839SBram Moolenaar  if tarfile =~# '\.\(gz\|tgz\)$'
243*c236c16dSBram Moolenaar"   call Decho("5: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.s:Escape(fname,1))
244*c236c16dSBram Moolenaar   exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname,1).decmp
2458c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp$'
246*c236c16dSBram Moolenaar"   call Decho("6: exe silent r! cat ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname,1).decmp)
247*c236c16dSBram Moolenaar   exe "silent r! cat -- ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname,1).decmp
2488c8de839SBram Moolenaar  elseif tarfile =~# '\.bz2$'
249*c236c16dSBram Moolenaar"   call Decho("7: exe silent r! bzip2 -d -c ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname,1).decmp)
250*c236c16dSBram Moolenaar   exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname,1).decmp
2518c8de839SBram Moolenaar  else
252*c236c16dSBram Moolenaar"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions." -- ".s:Escape(tarfile,1)." ".s:Escape(fname,1))
253*c236c16dSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".s:Escape(tarfile,1)." -- ".s:Escape(fname,1).decmp
2548c8de839SBram Moolenaar  endif
2558c8de839SBram Moolenaar
2568c8de839SBram Moolenaar  if doro
2578c8de839SBram Moolenaar   " because the reverse process of compressing changed files back into the tarball is not currently supported
2588c8de839SBram Moolenaar   setlocal ro
2598c8de839SBram Moolenaar  endif
2608c8de839SBram Moolenaar
261a5792f58SBram Moolenaar  let w:tarfile= a:fname
262*c236c16dSBram Moolenaar  exe "file tarfile::".fnameescape(fname)
263a5792f58SBram Moolenaar
264a5792f58SBram Moolenaar  " cleanup
265a5792f58SBram Moolenaar  0d
266a5792f58SBram Moolenaar  set nomod
267a5792f58SBram Moolenaar
268bba577a2SBram Moolenaar  let &report= repkeep
269a5792f58SBram Moolenaar"  call Dret("tar#Read : w:tarfile<".w:tarfile.">")
270a5792f58SBram Moolenaarendfun
271a5792f58SBram Moolenaar
272a5792f58SBram Moolenaar" ---------------------------------------------------------------------
273a5792f58SBram Moolenaar" tar#Write: {{{2
274a5792f58SBram Moolenaarfun! tar#Write(fname)
275a5792f58SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
276bba577a2SBram Moolenaar  let repkeep= &report
277bba577a2SBram Moolenaar  set report=10
278a5792f58SBram Moolenaar
279ab194816SBram Moolenaar  " sanity checks
280910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
281c81e5e79SBram Moolenaar   redraw!
282910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
283c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
284bba577a2SBram Moolenaar   let &report= repkeep
285ab194816SBram Moolenaar"   call Dret("tar#Write")
286ab194816SBram Moolenaar   return
287ab194816SBram Moolenaar  endif
288ab194816SBram Moolenaar  if !exists("*mkdir")
289c81e5e79SBram Moolenaar   redraw!
290a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
291c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
292bba577a2SBram Moolenaar   let &report= repkeep
293ab194816SBram Moolenaar"   call Dret("tar#Write")
294ab194816SBram Moolenaar   return
295ab194816SBram Moolenaar  endif
296ab194816SBram Moolenaar
297ab194816SBram Moolenaar  let curdir= getcwd()
298ab194816SBram Moolenaar  let tmpdir= tempname()
299ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
300ab194816SBram Moolenaar  if tmpdir =~ '\.'
301ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
302ab194816SBram Moolenaar  endif
303ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
304ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
305ab194816SBram Moolenaar
306ab194816SBram Moolenaar  " attempt to change to the indicated directory
307ab194816SBram Moolenaar  try
3088c8de839SBram Moolenaar   exe "cd ".fnameescape(tmpdir)
309ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
310c81e5e79SBram Moolenaar   redraw!
311a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
312c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
313bba577a2SBram Moolenaar   let &report= repkeep
314ab194816SBram Moolenaar"   call Dret("tar#Write")
315ab194816SBram Moolenaar   return
316ab194816SBram Moolenaar  endtry
317ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
318ab194816SBram Moolenaar
319a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
320a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
321a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
322ab194816SBram Moolenaar  endif
323a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
324a5792f58SBram Moolenaar  cd _ZIPVIM_
325ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
326ab194816SBram Moolenaar
3278c8de839SBram Moolenaar  let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
3288c8de839SBram Moolenaar  let fname   = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
329a5792f58SBram Moolenaar
330a5792f58SBram Moolenaar  " handle compressed archives
331a5792f58SBram Moolenaar  if tarfile =~# '\.gz'
332*c236c16dSBram Moolenaar   call system("gzip -d -- ".s:Escape(tarfile,0))
333a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
334*c236c16dSBram Moolenaar   let compress= "gzip ".s:Escape(tarfile,0)
335a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
336*c236c16dSBram Moolenaar   call system("gzip -d -- ".s:Escape(tarfile,0))
337a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
338*c236c16dSBram Moolenaar   let compress= "gzip -- ".s:Escape(tarfile,0)
339a5792f58SBram Moolenaar   let tgz     = 1
340a5792f58SBram Moolenaar  elseif tarfile =~# '\.bz2'
341*c236c16dSBram Moolenaar   call system("bzip2 -d -- ".s:Escape(tarfile,0))
342a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
343*c236c16dSBram Moolenaar   let compress= "bzip2 -- ".s:Escape(tarfile,0)
344a5792f58SBram Moolenaar  endif
3458c8de839SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
3468c8de839SBram Moolenaar"  call Decho("compress<".compress.">")
347a5792f58SBram Moolenaar
348a5792f58SBram Moolenaar  if v:shell_error != 0
349c81e5e79SBram Moolenaar   redraw!
350a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
351c81e5e79SBram Moolenaar"   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
352a5792f58SBram Moolenaar  else
353a5792f58SBram Moolenaar
354a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
355a5792f58SBram Moolenaar
3561cbe5f73SBram Moolenaar   if fname =~ '/'
357a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
3581cbe5f73SBram Moolenaar    if executable("cygpath")
359*c236c16dSBram Moolenaar     let dirpath = substitute(system("cygpath ".s:Escape(dirpath, 0)),'\n','','e')
3601cbe5f73SBram Moolenaar    endif
3611cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
3621cbe5f73SBram Moolenaar   endif
363a5792f58SBram Moolenaar   if tarfile !~ '/'
364a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
365a5792f58SBram Moolenaar   endif
366a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
367a5792f58SBram Moolenaar
3688c8de839SBram Moolenaar   exe "w! ".fnameescape(fname)
369ab194816SBram Moolenaar   if executable("cygpath")
370*c236c16dSBram Moolenaar    let tarfile = substitute(system("cygpath ".s:Escape(tarfile,0)),'\n','','e')
371ab194816SBram Moolenaar   endif
372ab194816SBram Moolenaar
373a5792f58SBram Moolenaar   " delete old file from tarfile
374*c236c16dSBram Moolenaar"   call Decho("system(tar --delete -f ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0).")")
375*c236c16dSBram Moolenaar   call system("tar --delete -f ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0))
376ab194816SBram Moolenaar   if v:shell_error != 0
377c81e5e79SBram Moolenaar    redraw!
3788c8de839SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
379c81e5e79SBram Moolenaar"    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
380ab194816SBram Moolenaar   else
381a5792f58SBram Moolenaar
382a5792f58SBram Moolenaar    " update tarfile with new file
383*c236c16dSBram Moolenaar"    call Decho("tar -".g:tar_writeoptions." ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0))
384*c236c16dSBram Moolenaar    call system("tar -".g:tar_writeoptions." ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0))
385a5792f58SBram Moolenaar    if v:shell_error != 0
386c81e5e79SBram Moolenaar     redraw!
3878c8de839SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
388c81e5e79SBram Moolenaar"     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
389a5792f58SBram Moolenaar    elseif exists("compress")
390a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
391a5792f58SBram Moolenaar     call system(compress)
392a5792f58SBram Moolenaar     if exists("tgz")
393a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
394a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
395a5792f58SBram Moolenaar     endif
396a5792f58SBram Moolenaar    endif
397a5792f58SBram Moolenaar   endif
398a5792f58SBram Moolenaar
399a5792f58SBram Moolenaar   " support writing tarfiles across a network
400a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
401a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
402a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
403a5792f58SBram Moolenaar    1split|enew
404a5792f58SBram Moolenaar    let binkeep= &binary
405a5792f58SBram Moolenaar    let eikeep = &ei
406a5792f58SBram Moolenaar    set binary ei=all
407*c236c16dSBram Moolenaar    exe "e! ".fnameescape(tarfile)
408a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
409a5792f58SBram Moolenaar    let &ei     = eikeep
410a5792f58SBram Moolenaar    let &binary = binkeep
411a5792f58SBram Moolenaar    q!
412a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
413a5792f58SBram Moolenaar   endif
414ab194816SBram Moolenaar  endif
415ab194816SBram Moolenaar
416ab194816SBram Moolenaar  " cleanup and restore current directory
417ab194816SBram Moolenaar  cd ..
418a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
419*c236c16dSBram Moolenaar  exe "cd ".fnameescape(curdir)
420ab194816SBram Moolenaar  setlocal nomod
421ab194816SBram Moolenaar
422bba577a2SBram Moolenaar  let &report= repkeep
423ab194816SBram Moolenaar"  call Dret("tar#Write")
424ab194816SBram Moolenaarendfun
425ab194816SBram Moolenaar
426ab194816SBram Moolenaar" ---------------------------------------------------------------------
427a5792f58SBram Moolenaar" Rmdir: {{{2
428ab194816SBram Moolenaarfun! s:Rmdir(fname)
429ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
430ab194816SBram Moolenaar  if has("unix")
431*c236c16dSBram Moolenaar   call system("/bin/rm -rf -- ".s:Escape(a:fname,0))
432ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
433ab194816SBram Moolenaar   if &shell =~? "sh$"
434*c236c16dSBram Moolenaar    call system("/bin/rm -rf -- ".s:Escape(a:fname,0))
435ab194816SBram Moolenaar   else
436*c236c16dSBram Moolenaar    call system("del /S ".s:Escape(a:fname,0))
437ab194816SBram Moolenaar   endif
438ab194816SBram Moolenaar  endif
439ab194816SBram Moolenaar"  call Dret("Rmdir")
440ab194816SBram Moolenaarendfun
441ab194816SBram Moolenaar
4428c8de839SBram Moolenaar" ---------------------------------------------------------------------
4438c8de839SBram Moolenaar" s:Escape: {{{2
444*c236c16dSBram Moolenaarfun s:Escape(name,isfilt)
4458c8de839SBram Moolenaar  " shellescape() was added by patch 7.0.111
4468c8de839SBram Moolenaar  if exists("*shellescape")
447*c236c16dSBram Moolenaar   if a:isfilt
448*c236c16dSBram Moolenaar    let qnameq= shellescape(a:name,1)
449*c236c16dSBram Moolenaar   else
4508c8de839SBram Moolenaar    let qnameq= shellescape(a:name)
451*c236c16dSBram Moolenaar   endif
4528c8de839SBram Moolenaar  else
4538c8de839SBram Moolenaar   let qnameq= g:tar_shq . a:name . g:tar_shq
4548c8de839SBram Moolenaar  endif
4558c8de839SBram Moolenaar  return qnameq
4568c8de839SBram Moolenaarendfun
4578c8de839SBram Moolenaar
4588c8de839SBram Moolenaar" ---------------------------------------------------------------------
459a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
460a5792f58SBram Moolenaarlet &cpo= s:keepcpo
461a5792f58SBram Moolenaarunlet s:keepcpo
462a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
463