xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision bba577a2)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*bba577a2SBram Moolenaar" Date:			Nov 28, 2005
4*bba577a2SBram Moolenaar" Version:		5
5a5792f58SBram Moolenaar" Maintainer:	Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
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"
10a5792f58SBram Moolenaar" Copyright:    Copyright (C) 2005 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,
14a5792f58SBram Moolenaar"               tarPlugin.vim is provided *as is* and comes with no warranty
15a5792f58SBram Moolenaar"               of any kind, either expressed or implied. By using this
16a5792f58SBram Moolenaar"               plugin, you agree that in no event will the copyright
17a5792f58SBram Moolenaar"               holder be liable for any damages resulting from the use
18a5792f58SBram Moolenaar"               of this software.
1987e25fdfSBram Moolenaar
20ab194816SBram Moolenaar" ---------------------------------------------------------------------
21a5792f58SBram Moolenaar" Initialization: {{{1
22a5792f58SBram Moolenaarlet s:keepcpo= &cpo
23a5792f58SBram Moolenaarset cpo&vim
24a5792f58SBram Moolenaarif exists("g:loaded_tar")
25a5792f58SBram Moolenaar finish
26a5792f58SBram Moolenaarendif
27*bba577a2SBram Moolenaarlet g:loaded_tar= "v5"
2887e25fdfSBram Moolenaar
29a5792f58SBram Moolenaar" ---------------------------------------------------------------------
30a5792f58SBram Moolenaar"  Default Settings: {{{1
31a5792f58SBram Moolenaarif !exists("g:tar_browseoptions")
32a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf"
33a5792f58SBram Moolenaarendif
34a5792f58SBram Moolenaarif !exists("g:tar_readoptions")
35a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf"
36a5792f58SBram Moolenaarendif
37a5792f58SBram Moolenaarif !exists("g:tar_writeoptions")
38a5792f58SBram Moolenaar let g:tar_writeoptions= "uf"
39a5792f58SBram Moolenaarendif
40a5792f58SBram Moolenaar
41a5792f58SBram Moolenaar" ----------------
42a5792f58SBram Moolenaar"  Functions: {{{1
43a5792f58SBram Moolenaar" ----------------
44a5792f58SBram Moolenaar
45a5792f58SBram Moolenaar" ---------------------------------------------------------------------
46a5792f58SBram Moolenaar" tar#Browse: {{{2
47a5792f58SBram Moolenaarfun! tar#Browse(tarfile)
48a5792f58SBram Moolenaar"  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
49*bba577a2SBram Moolenaar  let repkeep= &report
50*bba577a2SBram Moolenaar  set report=10
51a5792f58SBram Moolenaar
52a5792f58SBram Moolenaar  " sanity checks
53a5792f58SBram Moolenaar  if !executable("tar")
54a5792f58SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "tar" not available on your system'
55a5792f58SBram Moolenaar   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
56*bba577a2SBram Moolenaar   let &report= repkeep
57a5792f58SBram Moolenaar"   call Dret("tar#Browse")
5887e25fdfSBram Moolenaar   return
5987e25fdfSBram Moolenaar  endif
60a5792f58SBram Moolenaar  if !filereadable(a:tarfile)
61a5792f58SBram Moolenaar   if a:tarfile !~# '^\a\+://'
62a5792f58SBram Moolenaar    " if its an url, don't complain, let url-handlers such as vim do its thing
63a5792f58SBram Moolenaar    echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
64a5792f58SBram Moolenaar    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
6587e25fdfSBram Moolenaar   endif
66*bba577a2SBram Moolenaar   let &report= repkeep
67a5792f58SBram Moolenaar"   call Dret("tar#Browse : file<".a:tarfile."> not readable")
6887e25fdfSBram Moolenaar   return
6987e25fdfSBram Moolenaar  endif
70a5792f58SBram Moolenaar  if &ma != 1
71a5792f58SBram Moolenaar   set ma
7287e25fdfSBram Moolenaar  endif
73a5792f58SBram Moolenaar  let w:tarfile= a:tarfile
74a5792f58SBram Moolenaar
75a5792f58SBram Moolenaar  setlocal noswapfile
76a5792f58SBram Moolenaar  setlocal buftype=nofile
77a5792f58SBram Moolenaar  setlocal bufhidden=hide
78a5792f58SBram Moolenaar  setlocal nobuflisted
79a5792f58SBram Moolenaar  setlocal nowrap
80a5792f58SBram Moolenaar  set ft=tar
81a5792f58SBram Moolenaar
82a5792f58SBram Moolenaar  " give header
83a5792f58SBram Moolenaar  exe "$put ='".'\"'." tar.vim version ".g:loaded_tar."'"
84a5792f58SBram Moolenaar  exe "$put ='".'\"'." Browsing tarfile ".a:tarfile."'"
85a5792f58SBram Moolenaar  exe "$put ='".'\"'." Select a file with cursor and press ENTER"."'"
86a5792f58SBram Moolenaar  0d
87a5792f58SBram Moolenaar  $
88a5792f58SBram Moolenaar
89a5792f58SBram Moolenaar  if a:tarfile =~# '\.\(gz\|tgz\)$'
90a5792f58SBram Moolenaar   exe "silent r! gzip -d -c '".a:tarfile."'| tar -".g:tar_browseoptions." - "
91a5792f58SBram Moolenaar  elseif a:tarfile =~# '\.bz2$'
92a5792f58SBram Moolenaar   exe "silent r! bzip2 -d -c '".a:tarfile."'| tar -".g:tar_browseoptions." - "
93a5792f58SBram Moolenaar  else
94a5792f58SBram Moolenaar   exe "silent r! tar -".g:tar_browseoptions." '".a:tarfile."'"
95a5792f58SBram Moolenaar  endif
96a5792f58SBram Moolenaar  %g@/$@d
97a5792f58SBram Moolenaar
98a5792f58SBram Moolenaar  setlocal noma nomod ro
99a5792f58SBram Moolenaar  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
100a5792f58SBram Moolenaar
101*bba577a2SBram Moolenaar  let &report= repkeep
102a5792f58SBram Moolenaar"  call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
103ab194816SBram Moolenaarendfun
10487e25fdfSBram Moolenaar
105ab194816SBram Moolenaar" ---------------------------------------------------------------------
106a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
107a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
108a5792f58SBram Moolenaar"  call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
109*bba577a2SBram Moolenaar  let repkeep= &report
110*bba577a2SBram Moolenaar  set report=10
111a5792f58SBram Moolenaar  let fname= getline(".")
112a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
113a5792f58SBram Moolenaar
114a5792f58SBram Moolenaar  " sanity check
115a5792f58SBram Moolenaar  if fname =~ '^"'
116*bba577a2SBram Moolenaar   let &report= repkeep
117a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
118a5792f58SBram Moolenaar   return
119a5792f58SBram Moolenaar  endif
120a5792f58SBram Moolenaar
121a5792f58SBram Moolenaar  " about to make a new window, need to use w:tarfile
122a5792f58SBram Moolenaar  let tarfile= w:tarfile
123a5792f58SBram Moolenaar  let curfile= expand("%")
124a5792f58SBram Moolenaar
125a5792f58SBram Moolenaar  new
126a5792f58SBram Moolenaar  wincmd _
127a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
128a5792f58SBram Moolenaar"  call Decho("exe e tarfile:".tarfile.':'.fname)
129a5792f58SBram Moolenaar  exe "e tarfile:".tarfile.':'.fname
130a5792f58SBram Moolenaar  filetype detect
131a5792f58SBram Moolenaar
132*bba577a2SBram Moolenaar  let &report= repkeep
133a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
134a5792f58SBram Moolenaarendfun
135a5792f58SBram Moolenaar
136a5792f58SBram Moolenaar" ---------------------------------------------------------------------
137a5792f58SBram Moolenaar" tar#Read: {{{2
138a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
139a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
140*bba577a2SBram Moolenaar  let repkeep= &report
141*bba577a2SBram Moolenaar  set report=10
142a5792f58SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\):.*$','\1','')
143a5792f58SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}:\(.*\)$','\1','')
144a5792f58SBram Moolenaar"  call Decho("tarfile<".tarfile."> fname<".fname.">")
145a5792f58SBram Moolenaar
146a5792f58SBram Moolenaar  if tarfile =~# '\.\(gz\|tgz\)$'
147a5792f58SBram Moolenaar"   call Decho("exe silent r! gzip -d -c '".tarfile."'| tar -OPxf - '".fname."'")
148a5792f58SBram Moolenaar   exe "silent r! gzip -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'"
149a5792f58SBram Moolenaar  elseif a:fname =~# '\.bz2$'
150a5792f58SBram Moolenaar"   call Decho("exe silent r! bzip2 -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'")
151a5792f58SBram Moolenaar   exe "silent r! bzip2 -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'"
152a5792f58SBram Moolenaar  else
153a5792f58SBram Moolenaar"   call Decho("exe silent r! tar -".g:tar_readoptions." '".tarfile."' '".fname."'")
154a5792f58SBram Moolenaar   exe "silent r! tar -".g:tar_readoptions." '".tarfile."' '".fname."'"
155a5792f58SBram Moolenaar  endif
156a5792f58SBram Moolenaar  let w:tarfile= a:fname
157a5792f58SBram Moolenaar  exe "file tarfile:".fname
158a5792f58SBram Moolenaar
159a5792f58SBram Moolenaar  " cleanup
160a5792f58SBram Moolenaar  0d
161a5792f58SBram Moolenaar  set nomod
162a5792f58SBram Moolenaar
163*bba577a2SBram Moolenaar  let &report= repkeep
164a5792f58SBram Moolenaar"  call Dret("tar#Read : w:tarfile<".w:tarfile.">")
165a5792f58SBram Moolenaarendfun
166a5792f58SBram Moolenaar
167a5792f58SBram Moolenaar" ---------------------------------------------------------------------
168a5792f58SBram Moolenaar" tar#Write: {{{2
169a5792f58SBram Moolenaarfun! tar#Write(fname)
170a5792f58SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
171*bba577a2SBram Moolenaar  let repkeep= &report
172*bba577a2SBram Moolenaar  set report=10
173a5792f58SBram Moolenaar
174ab194816SBram Moolenaar  " sanity checks
175ab194816SBram Moolenaar  if !executable("tar")
176a5792f58SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "tar" not available on your system'
177a5792f58SBram Moolenaar   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
178*bba577a2SBram Moolenaar   let &report= repkeep
179ab194816SBram Moolenaar"   call Dret("tar#Write")
180ab194816SBram Moolenaar   return
181ab194816SBram Moolenaar  endif
182ab194816SBram Moolenaar  if !exists("*mkdir")
183a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
184a5792f58SBram Moolenaar   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
185*bba577a2SBram Moolenaar   let &report= repkeep
186ab194816SBram Moolenaar"   call Dret("tar#Write")
187ab194816SBram Moolenaar   return
188ab194816SBram Moolenaar  endif
189ab194816SBram Moolenaar
190ab194816SBram Moolenaar  let curdir= getcwd()
191ab194816SBram Moolenaar  let tmpdir= tempname()
192ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
193ab194816SBram Moolenaar  if tmpdir =~ '\.'
194ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
195ab194816SBram Moolenaar  endif
196ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
197ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
198ab194816SBram Moolenaar
199ab194816SBram Moolenaar  " attempt to change to the indicated directory
200ab194816SBram Moolenaar  try
201ab194816SBram Moolenaar   exe "cd ".escape(tmpdir,' \')
202ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
203a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
204a5792f58SBram Moolenaar   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
205*bba577a2SBram Moolenaar   let &report= repkeep
206ab194816SBram Moolenaar"   call Dret("tar#Write")
207ab194816SBram Moolenaar   return
208ab194816SBram Moolenaar  endtry
209ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
210ab194816SBram Moolenaar
211a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
212a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
213a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
214ab194816SBram Moolenaar  endif
215a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
216a5792f58SBram Moolenaar  cd _ZIPVIM_
217ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
218ab194816SBram Moolenaar
219a5792f58SBram Moolenaar  let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\):.*$','\1','')
220a5792f58SBram Moolenaar  let fname   = substitute(w:tarfile,'tarfile:.\{-}:\(.*\)$','\1','')
221a5792f58SBram Moolenaar
222a5792f58SBram Moolenaar  " handle compressed archives
223a5792f58SBram Moolenaar  if tarfile =~# '\.gz'
224a5792f58SBram Moolenaar   call system("gzip -d ".tarfile)
225a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
226a5792f58SBram Moolenaar   let compress= "gzip '".tarfile."'"
227a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
228a5792f58SBram Moolenaar   call system("gzip -d ".tarfile)
229a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
230a5792f58SBram Moolenaar   let compress= "gzip '".tarfile."'"
231a5792f58SBram Moolenaar   let tgz     = 1
232a5792f58SBram Moolenaar  elseif tarfile =~# '\.bz2'
233a5792f58SBram Moolenaar   call system("bzip2 -d ".tarfile)
234a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
235a5792f58SBram Moolenaar   let compress= "bzip2 '".tarfile."'"
236a5792f58SBram Moolenaar  endif
237a5792f58SBram Moolenaar
238a5792f58SBram Moolenaar  if v:shell_error != 0
239a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
240a5792f58SBram Moolenaar   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
241a5792f58SBram Moolenaar  else
242a5792f58SBram Moolenaar
243a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
244a5792f58SBram Moolenaar
245a5792f58SBram Moolenaar   let dirpath = substitute(fname,'/[^/]\+$','','e')
246a5792f58SBram Moolenaar   if tarfile !~ '/'
247a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
248a5792f58SBram Moolenaar   endif
249a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
250a5792f58SBram Moolenaar
251ab194816SBram Moolenaar   call mkdir(dirpath,"p")
252a5792f58SBram Moolenaar   exe "w! ".fname
253ab194816SBram Moolenaar   if executable("cygpath")
254a5792f58SBram Moolenaar    let dirpath = substitute(system("cygpath ".dirpath),'\n','','e')
255ab194816SBram Moolenaar    let tarfile = substitute(system("cygpath ".tarfile),'\n','','e')
256ab194816SBram Moolenaar   endif
257ab194816SBram Moolenaar
258a5792f58SBram Moolenaar   " delete old file from tarfile
259a5792f58SBram Moolenaar"   call Decho("tar --delete -f '".tarfile."' '".fname."'")
260a5792f58SBram Moolenaar   call system("tar --delete -f '".tarfile."' '".fname."'")
261ab194816SBram Moolenaar   if v:shell_error != 0
262a5792f58SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
263a5792f58SBram Moolenaar    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
264ab194816SBram Moolenaar   else
265a5792f58SBram Moolenaar
266a5792f58SBram Moolenaar    " update tarfile with new file
267a5792f58SBram Moolenaar"    call Decho("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
268a5792f58SBram Moolenaar    call system("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
269a5792f58SBram Moolenaar    if v:shell_error != 0
270a5792f58SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
271a5792f58SBram Moolenaar     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
272a5792f58SBram Moolenaar    elseif exists("compress")
273a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
274a5792f58SBram Moolenaar     call system(compress)
275a5792f58SBram Moolenaar     if exists("tgz")
276a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
277a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
278a5792f58SBram Moolenaar     endif
279a5792f58SBram Moolenaar    endif
280a5792f58SBram Moolenaar   endif
281a5792f58SBram Moolenaar
282a5792f58SBram Moolenaar   " support writing tarfiles across a network
283a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
284a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
285a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
286a5792f58SBram Moolenaar    1split|enew
287a5792f58SBram Moolenaar    let binkeep= &binary
288a5792f58SBram Moolenaar    let eikeep = &ei
289a5792f58SBram Moolenaar    set binary ei=all
290a5792f58SBram Moolenaar    exe "e! ".tarfile
291a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
292a5792f58SBram Moolenaar    let &ei     = eikeep
293a5792f58SBram Moolenaar    let &binary = binkeep
294a5792f58SBram Moolenaar    q!
295a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
296a5792f58SBram Moolenaar   endif
297ab194816SBram Moolenaar  endif
298ab194816SBram Moolenaar
299ab194816SBram Moolenaar  " cleanup and restore current directory
300ab194816SBram Moolenaar  cd ..
301a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
302ab194816SBram Moolenaar  exe "cd ".escape(curdir,' \')
303ab194816SBram Moolenaar  setlocal nomod
304ab194816SBram Moolenaar
305*bba577a2SBram Moolenaar  let &report= repkeep
306ab194816SBram Moolenaar"  call Dret("tar#Write")
307ab194816SBram Moolenaarendfun
308ab194816SBram Moolenaar
309ab194816SBram Moolenaar" ---------------------------------------------------------------------
310a5792f58SBram Moolenaar" Rmdir: {{{2
311ab194816SBram Moolenaarfun! s:Rmdir(fname)
312ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
313ab194816SBram Moolenaar  if has("unix")
314ab194816SBram Moolenaar   call system("/bin/rm -rf ".a:fname)
315ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
316ab194816SBram Moolenaar   if &shell =~? "sh$"
317ab194816SBram Moolenaar    call system("/bin/rm -rf ".a:fname)
318ab194816SBram Moolenaar   else
319ab194816SBram Moolenaar    call system("del /S ".a:fname)
320ab194816SBram Moolenaar   endif
321ab194816SBram Moolenaar  endif
322ab194816SBram Moolenaar"  call Dret("Rmdir")
323ab194816SBram Moolenaarendfun
324ab194816SBram Moolenaar
325a5792f58SBram Moolenaar" ------------------------------------------------------------------------
326a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
327a5792f58SBram Moolenaarlet &cpo= s:keepcpo
328a5792f58SBram Moolenaarunlet s:keepcpo
329a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
330