blob: af6fbca2e1b313a89bae159944a6b3753dab64b3 [file] [log] [blame]
Bram Moolenaara5792f52005-11-23 21:25:05 +00001" tar.vim: Handles browsing tarfiles
2" AUTOLOAD PORTION
Bram Moolenaared39e1d2008-08-09 17:55:22 +00003" Date: Aug 08, 2008
4" Version: 23 + modifications by Bram
Bram Moolenaarc81e5e72007-05-05 18:24:42 +00005" Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
Bram Moolenaara5792f52005-11-23 21:25:05 +00006" License: Vim License (see vim's :help license)
Bram Moolenaar87e25fd2005-07-27 21:13:01 +00007"
Bram Moolenaara5792f52005-11-23 21:25:05 +00008" Contains many ideas from Michael Toren's <tar.vim>
Bram Moolenaar87e25fd2005-07-27 21:13:01 +00009"
Bram Moolenaar8c8de832008-06-24 22:58:06 +000010" Copyright: Copyright (C) 2005-2008 Charles E. Campbell, Jr. {{{1
Bram Moolenaara5792f52005-11-23 21:25:05 +000011" Permission is hereby granted to use and distribute this code,
12" with or without modifications, provided that this copyright
13" notice is copied with it. Like anything else that's free,
Bram Moolenaar8c8de832008-06-24 22:58:06 +000014" tar.vim and tarPlugin.vim are provided *as is* and comes
15" with no warranty of any kind, either expressed or implied.
16" By using this plugin, you agree that in no event will the
17" copyright holder be liable for any damages resulting from
18" the use of this software.
Bram Moolenaar87e25fd2005-07-27 21:13:01 +000019
Bram Moolenaarab194812005-09-14 21:40:12 +000020" ---------------------------------------------------------------------
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000021" Load Once: {{{1
Bram Moolenaara5792f52005-11-23 21:25:05 +000022let s:keepcpo= &cpo
23set cpo&vim
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000024if &cp || exists("g:loaded_tar") || v:version < 700
Bram Moolenaara5792f52005-11-23 21:25:05 +000025 finish
26endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +000027let g:loaded_tar= "v23b"
Bram Moolenaar910f66f2006-04-05 20:41:53 +000028"call Decho("loading autoload/tar.vim")
Bram Moolenaar8c8de832008-06-24 22:58:06 +000029if v:version < 701 || (v:version == 701 && !has("patch299"))
30 echoerr "(autoload/tar.vim) need vim v7.1 with patchlevel 299"
31endif
Bram Moolenaar87e25fd2005-07-27 21:13:01 +000032
Bram Moolenaara5792f52005-11-23 21:25:05 +000033" ---------------------------------------------------------------------
34" Default Settings: {{{1
35if !exists("g:tar_browseoptions")
36 let g:tar_browseoptions= "Ptf"
37endif
38if !exists("g:tar_readoptions")
39 let g:tar_readoptions= "OPxf"
40endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +000041if !exists("g:tar_cmd")
42 let g:tar_cmd= "tar"
43endif
Bram Moolenaara5792f52005-11-23 21:25:05 +000044if !exists("g:tar_writeoptions")
45 let g:tar_writeoptions= "uf"
46endif
Bram Moolenaar8c8de832008-06-24 22:58:06 +000047
48if !exists("g:netrw_cygwin")
49 if has("win32") || has("win95") || has("win64") || has("win16")
50 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
51 let g:netrw_cygwin= 1
52 else
53 let g:netrw_cygwin= 0
54 endif
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000055 else
Bram Moolenaar8c8de832008-06-24 22:58:06 +000056 let g:netrw_cygwin= 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000057 endif
58endif
Bram Moolenaar87e25fd2005-07-27 21:13:01 +000059
Bram Moolenaar8c8de832008-06-24 22:58:06 +000060" set up shell quoting character
61if !exists("g:tar_shq")
62 if exists("&shq") && &shq != ""
63 let g:tar_shq= &shq
64 elseif has("win32") || has("win95") || has("win64") || has("win16")
65 if exists("g:netrw_cygwin") && g:netrw_cygwin
66 let g:tar_shq= "'"
67 else
68 let g:tar_shq= '"'
69 endif
70 else
71 let g:tar_shq= "'"
72 endif
73" call Decho("g:tar_shq<".g:tar_shq.">")
74endif
75
Bram Moolenaara5792f52005-11-23 21:25:05 +000076" ----------------
77" Functions: {{{1
78" ----------------
Bram Moolenaar87e25fd2005-07-27 21:13:01 +000079
Bram Moolenaara5792f52005-11-23 21:25:05 +000080" ---------------------------------------------------------------------
81" tar#Browse: {{{2
82fun! tar#Browse(tarfile)
83" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
Bram Moolenaarbba577a2005-11-28 23:05:55 +000084 let repkeep= &report
85 set report=10
Bram Moolenaar87e25fd2005-07-27 21:13:01 +000086
Bram Moolenaara5792f52005-11-23 21:25:05 +000087 " sanity checks
Bram Moolenaar910f66f2006-04-05 20:41:53 +000088 if !executable(g:tar_cmd)
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000089 redraw!
Bram Moolenaar910f66f2006-04-05 20:41:53 +000090 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000091" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarbba577a2005-11-28 23:05:55 +000092 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +000093" call Dret("tar#Browse")
94 return
95 endif
96 if !filereadable(a:tarfile)
Bram Moolenaar910f66f2006-04-05 20:41:53 +000097" call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
Bram Moolenaara5792f52005-11-23 21:25:05 +000098 if a:tarfile !~# '^\a\+://'
99 " if its an url, don't complain, let url-handlers such as vim do its thing
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000100 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000101 echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000102" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000103 endif
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000104 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000105" call Dret("tar#Browse : file<".a:tarfile."> not readable")
106 return
107 endif
108 if &ma != 1
109 set ma
110 endif
111 let w:tarfile= a:tarfile
Bram Moolenaar87e25fd2005-07-27 21:13:01 +0000112
Bram Moolenaara5792f52005-11-23 21:25:05 +0000113 setlocal noswapfile
114 setlocal buftype=nofile
115 setlocal bufhidden=hide
116 setlocal nobuflisted
117 setlocal nowrap
118 set ft=tar
Bram Moolenaar87e25fd2005-07-27 21:13:01 +0000119
Bram Moolenaara5792f52005-11-23 21:25:05 +0000120 " give header
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000121" call Decho("printing header")
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000122 let lastline= line("$")
123 call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
124 call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
125 call setline(lastline+3,'" Select a file with cursor and press ENTER')
126 $put =''
Bram Moolenaara5792f52005-11-23 21:25:05 +0000127 0d
128 $
Bram Moolenaar87e25fd2005-07-27 21:13:01 +0000129
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000130 let tarfile= a:tarfile
131 if has("win32") && executable("cygpath")
132 " assuming cygwin
Bram Moolenaarc236c162008-07-13 17:41:49 +0000133 let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
Bram Moolenaara5792f52005-11-23 21:25:05 +0000134 endif
Bram Moolenaard68071d2006-05-02 22:08:30 +0000135 let curlast= line("$")
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000136 if tarfile =~# '\.\(gz\|tgz\)$'
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000137" call Decho("1: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000138 exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000139 elseif tarfile =~# '\.lrp'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000140" call Decho("2: exe silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
141 exe "silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000142 elseif tarfile =~# '\.bz2$'
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000143" call Decho("3: exe silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000144 exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000145 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000146 if tarfile =~ '^\s*-'
147 " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that.
148 let tarfile = substitute(tarfile, '-', './-', '')
149 endif
150" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1))
Bram Moolenaarc236c162008-07-13 17:41:49 +0000151 exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1)
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000152 endif
153 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000154 redraw!
Bram Moolenaard68071d2006-05-02 22:08:30 +0000155 echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000156" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard68071d2006-05-02 22:08:30 +0000157" call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000158 return
159 endif
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000160 if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
161 redraw!
Bram Moolenaard68071d2006-05-02 22:08:30 +0000162 echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000163" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard68071d2006-05-02 22:08:30 +0000164 silent %d
165 let eikeep= &ei
166 set ei=BufReadCmd,FileReadCmd
Bram Moolenaarc236c162008-07-13 17:41:49 +0000167 exe "r ".fnameescape(a:tarfile)
Bram Moolenaard68071d2006-05-02 22:08:30 +0000168 let &ei= eikeep
169 1d
170" call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000171 return
172 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000173
174 setlocal noma nomod ro
175 noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
176
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000177 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000178" call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
Bram Moolenaarab194812005-09-14 21:40:12 +0000179endfun
Bram Moolenaar87e25fd2005-07-27 21:13:01 +0000180
Bram Moolenaarab194812005-09-14 21:40:12 +0000181" ---------------------------------------------------------------------
Bram Moolenaara5792f52005-11-23 21:25:05 +0000182" TarBrowseSelect: {{{2
183fun! s:TarBrowseSelect()
184" call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000185 let repkeep= &report
186 set report=10
Bram Moolenaara5792f52005-11-23 21:25:05 +0000187 let fname= getline(".")
188" call Decho("fname<".fname.">")
189
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000190 if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
191 redraw!
192 echohl WarningMsg | echo '***error*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"; See :help tar-options'
193" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
194 return
195 endif
196
Bram Moolenaara5792f52005-11-23 21:25:05 +0000197 " sanity check
198 if fname =~ '^"'
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000199 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000200" call Dret("TarBrowseSelect")
201 return
202 endif
203
204 " about to make a new window, need to use w:tarfile
205 let tarfile= w:tarfile
206 let curfile= expand("%")
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000207 if has("win32") && executable("cygpath")
208 " assuming cygwin
Bram Moolenaarc236c162008-07-13 17:41:49 +0000209 let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000210 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000211
212 new
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000213 if !exists("g:tar_nomax") || g:tar_nomax == 0
214 wincmd _
215 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000216 let s:tblfile_{winnr()}= curfile
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000217 call tar#Read("tarfile:".tarfile.'::'.fname,1)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000218 filetype detect
219
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000220 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000221" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
222endfun
223
224" ---------------------------------------------------------------------
225" tar#Read: {{{2
226fun! tar#Read(fname,mode)
227" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000228 let repkeep= &report
229 set report=10
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000230 let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
231 let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000232 if has("win32") && executable("cygpath")
233 " assuming cygwin
Bram Moolenaarc236c162008-07-13 17:41:49 +0000234 let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e')
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000235 endif
236" call Decho("tarfile<".tarfile.">")
237" call Decho("fname<".fname.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000238
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000239 if fname =~ '\.gz$' && executable("zcat")
240 let decmp= "|zcat"
241 let doro = 1
242 elseif fname =~ '\.bz2$' && executable("bzcat")
243 let decmp= "|bzcat"
244 let doro = 1
Bram Moolenaara5792f52005-11-23 21:25:05 +0000245 else
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000246 let decmp=""
247 let doro = 0
248 if fname =~ '\.gz$\|\.bz2$\|\.Z$\|\.zip$'
249 setlocal bin
250 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000251 endif
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000252
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000253 if exists("g:tar_secure")
254 let tar_secure= " -- "
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000255 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000256 let tar_secure= " "
257 endif
258 if tarfile =~# '\.\(gz\|tgz\)$'
259" 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 exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp
261 elseif tarfile =~# '\.lrp$'
262" 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 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 elseif tarfile =~# '\.bz2$'
265" 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 exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp
267 else
268 if tarfile =~ '^\s*-'
269 " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that.
270 let tarfile = substitute(tarfile, '-', './-', '')
271 endif
272" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions." "s:Escape(tarfile,1).tar_secure..s:Escape(fname,1).decmp)
273 exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".s:Escape(tarfile,1).tar_secure.s:Escape(fname,1).decmp
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000274 endif
275
276 if doro
277 " because the reverse process of compressing changed files back into the tarball is not currently supported
278 setlocal ro
279 endif
280
Bram Moolenaara5792f52005-11-23 21:25:05 +0000281 let w:tarfile= a:fname
Bram Moolenaarc236c162008-07-13 17:41:49 +0000282 exe "file tarfile::".fnameescape(fname)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000283
284 " cleanup
285 0d
286 set nomod
287
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000288 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000289" call Dret("tar#Read : w:tarfile<".w:tarfile.">")
290endfun
291
292" ---------------------------------------------------------------------
293" tar#Write: {{{2
294fun! tar#Write(fname)
295" call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000296 let repkeep= &report
297 set report=10
Bram Moolenaara5792f52005-11-23 21:25:05 +0000298
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000299 if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
300 redraw!
301 echohl WarningMsg | echo '***error*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"; See :help tar-options'
302" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
303 return
304 endif
305
Bram Moolenaarab194812005-09-14 21:40:12 +0000306 " sanity checks
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000307 if !executable(g:tar_cmd)
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000308 redraw!
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000309 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000310" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000311 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000312" call Dret("tar#Write")
313 return
314 endif
315 if !exists("*mkdir")
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000316 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000317 echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000318" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000319 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000320" call Dret("tar#Write")
321 return
322 endif
323
324 let curdir= getcwd()
325 let tmpdir= tempname()
326" call Decho("orig tempname<".tmpdir.">")
327 if tmpdir =~ '\.'
328 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
329 endif
330" call Decho("tmpdir<".tmpdir.">")
331 call mkdir(tmpdir,"p")
332
333 " attempt to change to the indicated directory
334 try
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000335 exe "cd ".fnameescape(tmpdir)
Bram Moolenaarab194812005-09-14 21:40:12 +0000336 catch /^Vim\%((\a\+)\)\=:E344/
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000337 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000338 echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000339" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000340 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000341" call Dret("tar#Write")
342 return
343 endtry
344" call Decho("current directory now: ".getcwd())
345
Bram Moolenaara5792f52005-11-23 21:25:05 +0000346 " place temporary files under .../_ZIPVIM_/
347 if isdirectory("_ZIPVIM_")
348 call s:Rmdir("_ZIPVIM_")
Bram Moolenaarab194812005-09-14 21:40:12 +0000349 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000350 call mkdir("_ZIPVIM_")
351 cd _ZIPVIM_
Bram Moolenaarab194812005-09-14 21:40:12 +0000352" call Decho("current directory now: ".getcwd())
353
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000354 let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
355 let fname = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
Bram Moolenaara5792f52005-11-23 21:25:05 +0000356
357 " handle compressed archives
358 if tarfile =~# '\.gz'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000359 call system("gzip -d -- ".s:Escape(tarfile,0))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000360 let tarfile = substitute(tarfile,'\.gz','','e')
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000361 let compress= "gzip -- ".s:Escape(tarfile,0)
362" call Decho("compress<".compress.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000363 elseif tarfile =~# '\.tgz'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000364 call system("gzip -d -- ".s:Escape(tarfile,0))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000365 let tarfile = substitute(tarfile,'\.tgz','.tar','e')
Bram Moolenaarc236c162008-07-13 17:41:49 +0000366 let compress= "gzip -- ".s:Escape(tarfile,0)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000367 let tgz = 1
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000368" call Decho("compress<".compress.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000369 elseif tarfile =~# '\.bz2'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000370 call system("bzip2 -d -- ".s:Escape(tarfile,0))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000371 let tarfile = substitute(tarfile,'\.bz2','','e')
Bram Moolenaarc236c162008-07-13 17:41:49 +0000372 let compress= "bzip2 -- ".s:Escape(tarfile,0)
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000373" call Decho("compress<".compress.">")
Bram Moolenaarab194812005-09-14 21:40:12 +0000374 endif
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000375" call Decho("tarfile<".tarfile.">")
Bram Moolenaarab194812005-09-14 21:40:12 +0000376
Bram Moolenaarab194812005-09-14 21:40:12 +0000377 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000378 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000379 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000380" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarab194812005-09-14 21:40:12 +0000381 else
Bram Moolenaara5792f52005-11-23 21:25:05 +0000382
383" call Decho("tarfile<".tarfile."> fname<".fname.">")
384
Bram Moolenaar1cbe5f72005-12-29 22:51:09 +0000385 if fname =~ '/'
386 let dirpath = substitute(fname,'/[^/]\+$','','e')
387 if executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000388 let dirpath = substitute(system("cygpath ".s:Escape(dirpath, 0)),'\n','','e')
Bram Moolenaar1cbe5f72005-12-29 22:51:09 +0000389 endif
390 call mkdir(dirpath,"p")
391 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000392 if tarfile !~ '/'
393 let tarfile= curdir.'/'.tarfile
394 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000395 if tarfile =~ '^\s*-'
396 " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that.
397 let tarfile = substitute(tarfile, '-', './-', '')
398 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000399" call Decho("tarfile<".tarfile."> fname<".fname.">")
400
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000401 if exists("g:tar_secure")
402 let tar_secure= " -- "
403 else
404 let tar_secure= " "
405 endif
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000406 exe "w! ".fnameescape(fname)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000407 if executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000408 let tarfile = substitute(system("cygpath ".s:Escape(tarfile,0)),'\n','','e')
Bram Moolenaara5792f52005-11-23 21:25:05 +0000409 endif
410
411 " delete old file from tarfile
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000412" call Decho("system(".g:tar_cmd." --delete -f ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0).")")
413 call system(g:tar_cmd." --delete -f ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000414 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000415 redraw!
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000416 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000417" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000418 else
419
420 " update tarfile with new file
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000421" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0))
422 call system(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000423 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000424 redraw!
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000425 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000426" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000427 elseif exists("compress")
428" call Decho("call system(".compress.")")
429 call system(compress)
430 if exists("tgz")
431" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
432 call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
433 endif
434 endif
435 endif
436
437 " support writing tarfiles across a network
438 if s:tblfile_{winnr()} =~ '^\a\+://'
439" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
440 let tblfile= s:tblfile_{winnr()}
441 1split|enew
442 let binkeep= &binary
443 let eikeep = &ei
444 set binary ei=all
Bram Moolenaarc236c162008-07-13 17:41:49 +0000445 exe "e! ".fnameescape(tarfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000446 call netrw#NetWrite(tblfile)
447 let &ei = eikeep
448 let &binary = binkeep
449 q!
450 unlet s:tblfile_{winnr()}
451 endif
Bram Moolenaarab194812005-09-14 21:40:12 +0000452 endif
453
454 " cleanup and restore current directory
455 cd ..
Bram Moolenaara5792f52005-11-23 21:25:05 +0000456 call s:Rmdir("_ZIPVIM_")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000457 exe "cd ".fnameescape(curdir)
Bram Moolenaarab194812005-09-14 21:40:12 +0000458 setlocal nomod
459
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000460 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000461" call Dret("tar#Write")
462endfun
463
464" ---------------------------------------------------------------------
Bram Moolenaara5792f52005-11-23 21:25:05 +0000465" Rmdir: {{{2
Bram Moolenaarab194812005-09-14 21:40:12 +0000466fun! s:Rmdir(fname)
467" call Dfunc("Rmdir(fname<".a:fname.">)")
468 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000469 call system("/bin/rm -rf -- ".s:Escape(a:fname,0))
Bram Moolenaarab194812005-09-14 21:40:12 +0000470 elseif has("win32") || has("win95") || has("win64") || has("win16")
471 if &shell =~? "sh$"
Bram Moolenaarc236c162008-07-13 17:41:49 +0000472 call system("/bin/rm -rf -- ".s:Escape(a:fname,0))
Bram Moolenaarab194812005-09-14 21:40:12 +0000473 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000474 call system("del /S ".s:Escape(a:fname,0))
Bram Moolenaarab194812005-09-14 21:40:12 +0000475 endif
476 endif
477" call Dret("Rmdir")
478endfun
479
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000480" ---------------------------------------------------------------------
481" s:Escape: {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +0000482fun s:Escape(name,isfilt)
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000483 " shellescape() was added by patch 7.0.111
484 if exists("*shellescape")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000485 if a:isfilt
486 let qnameq= shellescape(a:name,1)
487 else
488 let qnameq= shellescape(a:name)
489 endif
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000490 else
491 let qnameq= g:tar_shq . a:name . g:tar_shq
492 endif
493 return qnameq
494endfun
495
496" ---------------------------------------------------------------------
Bram Moolenaara5792f52005-11-23 21:25:05 +0000497" Modelines And Restoration: {{{1
498let &cpo= s:keepcpo
499unlet s:keepcpo
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000500" vim:ts=8 fdm=marker