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