xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision 1cbe5f73)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*1cbe5f73SBram Moolenaar" Date:			Dec 24, 2005
4*1cbe5f73SBram Moolenaar" Version:		7
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*1cbe5f73SBram Moolenaarlet g:loaded_tar= "v7"
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.">)")
49bba577a2SBram Moolenaar  let repkeep= &report
50bba577a2SBram 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()
56bba577a2SBram 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
66bba577a2SBram 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
96*1cbe5f73SBram Moolenaar  silent %g@/$@d
97a5792f58SBram Moolenaar
98a5792f58SBram Moolenaar  setlocal noma nomod ro
99a5792f58SBram Moolenaar  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
100a5792f58SBram Moolenaar
101bba577a2SBram 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("%").">")
109bba577a2SBram Moolenaar  let repkeep= &report
110bba577a2SBram 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 =~ '^"'
116bba577a2SBram 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
132bba577a2SBram 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.")")
140bba577a2SBram Moolenaar  let repkeep= &report
141bba577a2SBram 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."'"
149*1cbe5f73SBram Moolenaar  elseif tarfile =~# '\.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
163bba577a2SBram 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()}.">")
171bba577a2SBram Moolenaar  let repkeep= &report
172bba577a2SBram 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()
178bba577a2SBram 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()
185bba577a2SBram 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()
205bba577a2SBram 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
245*1cbe5f73SBram Moolenaar   if fname =~ '/'
246a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
247*1cbe5f73SBram Moolenaar    if executable("cygpath")
248*1cbe5f73SBram Moolenaar     let dirpath = substitute(system("cygpath ".dirpath),'\n','','e')
249*1cbe5f73SBram Moolenaar    endif
250*1cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
251*1cbe5f73SBram Moolenaar   endif
252a5792f58SBram Moolenaar   if tarfile !~ '/'
253a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
254a5792f58SBram Moolenaar   endif
255a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
256a5792f58SBram Moolenaar
257a5792f58SBram Moolenaar   exe "w! ".fname
258ab194816SBram Moolenaar   if executable("cygpath")
259ab194816SBram Moolenaar    let tarfile = substitute(system("cygpath ".tarfile),'\n','','e')
260ab194816SBram Moolenaar   endif
261ab194816SBram Moolenaar
262a5792f58SBram Moolenaar   " delete old file from tarfile
263a5792f58SBram Moolenaar"   call Decho("tar --delete -f '".tarfile."' '".fname."'")
264a5792f58SBram Moolenaar   call system("tar --delete -f '".tarfile."' '".fname."'")
265ab194816SBram Moolenaar   if v:shell_error != 0
266a5792f58SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
267a5792f58SBram Moolenaar    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
268ab194816SBram Moolenaar   else
269a5792f58SBram Moolenaar
270a5792f58SBram Moolenaar    " update tarfile with new file
271a5792f58SBram Moolenaar"    call Decho("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
272a5792f58SBram Moolenaar    call system("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
273a5792f58SBram Moolenaar    if v:shell_error != 0
274a5792f58SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
275a5792f58SBram Moolenaar     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
276a5792f58SBram Moolenaar    elseif exists("compress")
277a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
278a5792f58SBram Moolenaar     call system(compress)
279a5792f58SBram Moolenaar     if exists("tgz")
280a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
281a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
282a5792f58SBram Moolenaar     endif
283a5792f58SBram Moolenaar    endif
284a5792f58SBram Moolenaar   endif
285a5792f58SBram Moolenaar
286a5792f58SBram Moolenaar   " support writing tarfiles across a network
287a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
288a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
289a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
290a5792f58SBram Moolenaar    1split|enew
291a5792f58SBram Moolenaar    let binkeep= &binary
292a5792f58SBram Moolenaar    let eikeep = &ei
293a5792f58SBram Moolenaar    set binary ei=all
294a5792f58SBram Moolenaar    exe "e! ".tarfile
295a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
296a5792f58SBram Moolenaar    let &ei     = eikeep
297a5792f58SBram Moolenaar    let &binary = binkeep
298a5792f58SBram Moolenaar    q!
299a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
300a5792f58SBram Moolenaar   endif
301ab194816SBram Moolenaar  endif
302ab194816SBram Moolenaar
303ab194816SBram Moolenaar  " cleanup and restore current directory
304ab194816SBram Moolenaar  cd ..
305a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
306ab194816SBram Moolenaar  exe "cd ".escape(curdir,' \')
307ab194816SBram Moolenaar  setlocal nomod
308ab194816SBram Moolenaar
309bba577a2SBram Moolenaar  let &report= repkeep
310ab194816SBram Moolenaar"  call Dret("tar#Write")
311ab194816SBram Moolenaarendfun
312ab194816SBram Moolenaar
313ab194816SBram Moolenaar" ---------------------------------------------------------------------
314a5792f58SBram Moolenaar" Rmdir: {{{2
315ab194816SBram Moolenaarfun! s:Rmdir(fname)
316ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
317ab194816SBram Moolenaar  if has("unix")
318ab194816SBram Moolenaar   call system("/bin/rm -rf ".a:fname)
319ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
320ab194816SBram Moolenaar   if &shell =~? "sh$"
321ab194816SBram Moolenaar    call system("/bin/rm -rf ".a:fname)
322ab194816SBram Moolenaar   else
323ab194816SBram Moolenaar    call system("del /S ".a:fname)
324ab194816SBram Moolenaar   endif
325ab194816SBram Moolenaar  endif
326ab194816SBram Moolenaar"  call Dret("Rmdir")
327ab194816SBram Moolenaarendfun
328ab194816SBram Moolenaar
329a5792f58SBram Moolenaar" ------------------------------------------------------------------------
330a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
331a5792f58SBram Moolenaarlet &cpo= s:keepcpo
332a5792f58SBram Moolenaarunlet s:keepcpo
333a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
334