blob: 35ef7fd253a172871593ca2720344b04a2433f84 [file] [log] [blame]
Bram Moolenaara5792f52005-11-23 21:25:05 +00001" tar.vim: Handles browsing tarfiles
2" AUTOLOAD PORTION
Bram Moolenaar8c8de832008-06-24 22:58:06 +00003" Date: Jun 12, 2008
4" Version: 16
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 Moolenaar8c8de832008-06-24 22:58:06 +000027let g:loaded_tar= "v16"
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 Moolenaar8c8de832008-06-24 22:58:06 +0000133 let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile)),'\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 Moolenaar8c8de832008-06-24 22:58:06 +0000137" call Decho("1: exe silent r! gzip -d -c ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
138 exe "silent r! gzip -d -c -- ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
139 elseif tarfile =~# '\.lrp'
140" call Decho("2: exe silent r! cat -- ".s:Escape(tarfile)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
141 exe "silent r! cat -- ".s:Escape(tarfile)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000142 elseif tarfile =~# '\.bz2$'
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000143" call Decho("3: exe silent r! bzip2 -d -c ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
144 exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000145 else
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000146" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile))
147 exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile)
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000148 endif
149 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000150 redraw!
Bram Moolenaard68071d2006-05-02 22:08:30 +0000151 echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000152" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard68071d2006-05-02 22:08:30 +0000153" call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000154 return
155 endif
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000156 if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
157 redraw!
Bram Moolenaard68071d2006-05-02 22:08:30 +0000158 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 +0000159" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard68071d2006-05-02 22:08:30 +0000160 silent %d
161 let eikeep= &ei
162 set ei=BufReadCmd,FileReadCmd
163 exe "r ".a:tarfile
164 let &ei= eikeep
165 1d
166" call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000167 return
168 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000169
170 setlocal noma nomod ro
171 noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
172
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000173 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000174" call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
Bram Moolenaarab194812005-09-14 21:40:12 +0000175endfun
Bram Moolenaar87e25fd2005-07-27 21:13:01 +0000176
Bram Moolenaarab194812005-09-14 21:40:12 +0000177" ---------------------------------------------------------------------
Bram Moolenaara5792f52005-11-23 21:25:05 +0000178" TarBrowseSelect: {{{2
179fun! s:TarBrowseSelect()
180" call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000181 let repkeep= &report
182 set report=10
Bram Moolenaara5792f52005-11-23 21:25:05 +0000183 let fname= getline(".")
184" call Decho("fname<".fname.">")
185
186 " sanity check
187 if fname =~ '^"'
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000188 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000189" call Dret("TarBrowseSelect")
190 return
191 endif
192
193 " about to make a new window, need to use w:tarfile
194 let tarfile= w:tarfile
195 let curfile= expand("%")
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000196 if has("win32") && executable("cygpath")
197 " assuming cygwin
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000198 let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile)),'\n$','','e')
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000199 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000200
201 new
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000202 if !exists("g:tar_nomax") || g:tar_nomax == 0
203 wincmd _
204 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000205 let s:tblfile_{winnr()}= curfile
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000206 call tar#Read("tarfile:".tarfile.'::'.fname,1)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000207 filetype detect
208
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000209 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000210" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
211endfun
212
213" ---------------------------------------------------------------------
214" tar#Read: {{{2
215fun! tar#Read(fname,mode)
216" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000217 let repkeep= &report
218 set report=10
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000219 let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
220 let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000221 if has("win32") && executable("cygpath")
222 " assuming cygwin
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000223 let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile)),'\n$','','e')
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000224 endif
225" call Decho("tarfile<".tarfile.">")
226" call Decho("fname<".fname.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000227
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000228 if fname =~ '\.gz$' && executable("zcat")
229 let decmp= "|zcat"
230 let doro = 1
231 elseif fname =~ '\.bz2$' && executable("bzcat")
232 let decmp= "|bzcat"
233 let doro = 1
Bram Moolenaara5792f52005-11-23 21:25:05 +0000234 else
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000235 let decmp=""
236 let doro = 0
237 if fname =~ '\.gz$\|\.bz2$\|\.Z$\|\.zip$'
238 setlocal bin
239 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000240 endif
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000241
242 if tarfile =~# '\.\(gz\|tgz\)$'
243" call Decho("5: exe silent r! gzip -d -c -- ".s:Escape(tarfile)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.s:Escape(fname))
244 exe "silent r! gzip -d -c -- ".s:Escape(tarfile)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp
245 elseif tarfile =~# '\.lrp$'
246" call Decho("6: exe silent r! cat ".s:Escape(tarfile)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp)
247 exe "silent r! cat -- ".s:Escape(tarfile)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp
248 elseif tarfile =~# '\.bz2$'
249" call Decho("7: exe silent r! bzip2 -d -c ".s:Escape(tarfile)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp)
250 exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp
251 else
252" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions." -- ".s:Escape(tarfile)." ".s:Escape(fname))
253 exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".s:Escape(tarfile)." -- ".s:Escape(fname).decmp
254 endif
255
256 if doro
257 " because the reverse process of compressing changed files back into the tarball is not currently supported
258 setlocal ro
259 endif
260
Bram Moolenaara5792f52005-11-23 21:25:05 +0000261 let w:tarfile= a:fname
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000262 exe "file tarfile::".fname
Bram Moolenaara5792f52005-11-23 21:25:05 +0000263
264 " cleanup
265 0d
266 set nomod
267
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000268 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000269" call Dret("tar#Read : w:tarfile<".w:tarfile.">")
270endfun
271
272" ---------------------------------------------------------------------
273" tar#Write: {{{2
274fun! tar#Write(fname)
275" call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000276 let repkeep= &report
277 set report=10
Bram Moolenaara5792f52005-11-23 21:25:05 +0000278
Bram Moolenaarab194812005-09-14 21:40:12 +0000279 " sanity checks
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000280 if !executable(g:tar_cmd)
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000281 redraw!
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000282 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000283" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000284 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000285" call Dret("tar#Write")
286 return
287 endif
288 if !exists("*mkdir")
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000289 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000290 echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000291" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000292 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000293" call Dret("tar#Write")
294 return
295 endif
296
297 let curdir= getcwd()
298 let tmpdir= tempname()
299" call Decho("orig tempname<".tmpdir.">")
300 if tmpdir =~ '\.'
301 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
302 endif
303" call Decho("tmpdir<".tmpdir.">")
304 call mkdir(tmpdir,"p")
305
306 " attempt to change to the indicated directory
307 try
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000308 exe "cd ".fnameescape(tmpdir)
Bram Moolenaarab194812005-09-14 21:40:12 +0000309 catch /^Vim\%((\a\+)\)\=:E344/
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000310 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000311 echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000312" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000313 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000314" call Dret("tar#Write")
315 return
316 endtry
317" call Decho("current directory now: ".getcwd())
318
Bram Moolenaara5792f52005-11-23 21:25:05 +0000319 " place temporary files under .../_ZIPVIM_/
320 if isdirectory("_ZIPVIM_")
321 call s:Rmdir("_ZIPVIM_")
Bram Moolenaarab194812005-09-14 21:40:12 +0000322 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000323 call mkdir("_ZIPVIM_")
324 cd _ZIPVIM_
Bram Moolenaarab194812005-09-14 21:40:12 +0000325" call Decho("current directory now: ".getcwd())
326
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000327 let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
328 let fname = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
Bram Moolenaara5792f52005-11-23 21:25:05 +0000329
330 " handle compressed archives
331 if tarfile =~# '\.gz'
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000332 call system("gzip -d -- ".tarfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000333 let tarfile = substitute(tarfile,'\.gz','','e')
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000334 let compress= "gzip ".s:Escape(tarfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000335 elseif tarfile =~# '\.tgz'
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000336 call system("gzip -d -- ".s:Escape(tarfile))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000337 let tarfile = substitute(tarfile,'\.tgz','.tar','e')
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000338 let compress= "gzip -- ".s:Escape(tarfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000339 let tgz = 1
340 elseif tarfile =~# '\.bz2'
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000341 call system("bzip2 -d -- ".s:Escape(tarfile))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000342 let tarfile = substitute(tarfile,'\.bz2','','e')
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000343 let compress= "bzip2 -- ".s:Escape(tarfile)
Bram Moolenaarab194812005-09-14 21:40:12 +0000344 endif
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000345" call Decho("tarfile<".tarfile.">")
346" call Decho("compress<".compress.">")
Bram Moolenaarab194812005-09-14 21:40:12 +0000347
Bram Moolenaarab194812005-09-14 21:40:12 +0000348 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000349 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000350 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000351" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarab194812005-09-14 21:40:12 +0000352 else
Bram Moolenaara5792f52005-11-23 21:25:05 +0000353
354" call Decho("tarfile<".tarfile."> fname<".fname.">")
355
Bram Moolenaar1cbe5f72005-12-29 22:51:09 +0000356 if fname =~ '/'
357 let dirpath = substitute(fname,'/[^/]\+$','','e')
358 if executable("cygpath")
359 let dirpath = substitute(system("cygpath ".dirpath),'\n','','e')
360 endif
361 call mkdir(dirpath,"p")
362 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000363 if tarfile !~ '/'
364 let tarfile= curdir.'/'.tarfile
365 endif
366" call Decho("tarfile<".tarfile."> fname<".fname.">")
367
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000368 exe "w! ".fnameescape(fname)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000369 if executable("cygpath")
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000370 let tarfile = substitute(system("cygpath ".s:Escape(tarfile)),'\n','','e')
Bram Moolenaara5792f52005-11-23 21:25:05 +0000371 endif
372
373 " delete old file from tarfile
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000374" call Decho("system(tar --delete -f ".s:Escape(tarfile)." -- ".s:Escape(fname).")")
375 call system("tar --delete -f ".s:Escape(tarfile)." -- ".s:Escape(fname))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000376 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000377 redraw!
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000378 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000379" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000380 else
381
382 " update tarfile with new file
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000383" call Decho("tar -".g:tar_writeoptions." ".s:Escape(tarfile)." -- ".s:Escape(fname))
384 call system("tar -".g:tar_writeoptions." ".s:Escape(tarfile)." -- ".s:Escape(fname))
Bram Moolenaara5792f52005-11-23 21:25:05 +0000385 if v:shell_error != 0
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000386 redraw!
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000387 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000388" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000389 elseif exists("compress")
390" call Decho("call system(".compress.")")
391 call system(compress)
392 if exists("tgz")
393" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
394 call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
395 endif
396 endif
397 endif
398
399 " support writing tarfiles across a network
400 if s:tblfile_{winnr()} =~ '^\a\+://'
401" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
402 let tblfile= s:tblfile_{winnr()}
403 1split|enew
404 let binkeep= &binary
405 let eikeep = &ei
406 set binary ei=all
407 exe "e! ".tarfile
408 call netrw#NetWrite(tblfile)
409 let &ei = eikeep
410 let &binary = binkeep
411 q!
412 unlet s:tblfile_{winnr()}
413 endif
Bram Moolenaarab194812005-09-14 21:40:12 +0000414 endif
415
416 " cleanup and restore current directory
417 cd ..
Bram Moolenaara5792f52005-11-23 21:25:05 +0000418 call s:Rmdir("_ZIPVIM_")
Bram Moolenaarab194812005-09-14 21:40:12 +0000419 exe "cd ".escape(curdir,' \')
420 setlocal nomod
421
Bram Moolenaarbba577a2005-11-28 23:05:55 +0000422 let &report= repkeep
Bram Moolenaarab194812005-09-14 21:40:12 +0000423" call Dret("tar#Write")
424endfun
425
426" ---------------------------------------------------------------------
Bram Moolenaara5792f52005-11-23 21:25:05 +0000427" Rmdir: {{{2
Bram Moolenaarab194812005-09-14 21:40:12 +0000428fun! s:Rmdir(fname)
429" call Dfunc("Rmdir(fname<".a:fname.">)")
430 if has("unix")
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000431 call system("/bin/rm -rf -- ".s:Escape(a:fname))
Bram Moolenaarab194812005-09-14 21:40:12 +0000432 elseif has("win32") || has("win95") || has("win64") || has("win16")
433 if &shell =~? "sh$"
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000434 call system("/bin/rm -rf -- ".s:Escape(a:fname))
Bram Moolenaarab194812005-09-14 21:40:12 +0000435 else
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000436 call system("del /S ".s:Escape(a:fname))
Bram Moolenaarab194812005-09-14 21:40:12 +0000437 endif
438 endif
439" call Dret("Rmdir")
440endfun
441
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000442" ---------------------------------------------------------------------
443" s:Escape: {{{2
444fun s:Escape(name)
445 " shellescape() was added by patch 7.0.111
446 if exists("*shellescape")
447 let qnameq= shellescape(a:name)
448 else
449 let qnameq= g:tar_shq . a:name . g:tar_shq
450 endif
451 return qnameq
452endfun
453
454" ---------------------------------------------------------------------
Bram Moolenaara5792f52005-11-23 21:25:05 +0000455" Modelines And Restoration: {{{1
456let &cpo= s:keepcpo
457unlet s:keepcpo
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000458" vim:ts=8 fdm=marker