xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision ff034194)
1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles
2a5792f58SBram Moolenaar"            AUTOLOAD PORTION
3*ff034194SBram Moolenaar" Date:			Apr 17, 2013
4*ff034194SBram Moolenaar" Version:		29
5*ff034194SBram Moolenaar" Maintainer:	Charles E Campbell <[email protected]>
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"
10*ff034194SBram Moolenaar" Copyright:    Copyright (C) 2005-2011 Charles E. Campbell {{{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,
148c8de839SBram Moolenaar"               tar.vim and tarPlugin.vim are provided *as is* and comes
158c8de839SBram Moolenaar"               with no warranty of any kind, either expressed or implied.
168c8de839SBram Moolenaar"               By using this plugin, you agree that in no event will the
178c8de839SBram Moolenaar"               copyright holder be liable for any damages resulting from
188c8de839SBram Moolenaar"               the use of this software.
195c73622aSBram Moolenaar"     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
20ab194816SBram Moolenaar" ---------------------------------------------------------------------
21c81e5e79SBram Moolenaar" Load Once: {{{1
225c73622aSBram Moolenaarif &cp || exists("g:loaded_tar")
23a5792f58SBram Moolenaar finish
24a5792f58SBram Moolenaarendif
25*ff034194SBram Moolenaarlet g:loaded_tar= "v29"
265c73622aSBram Moolenaarif v:version < 702
275c73622aSBram Moolenaar echohl WarningMsg
285c73622aSBram Moolenaar echo "***warning*** this version of tar needs vim 7.2"
295c73622aSBram Moolenaar echohl Normal
305c73622aSBram Moolenaar finish
318c8de839SBram Moolenaarendif
325c73622aSBram Moolenaarlet s:keepcpo= &cpo
335c73622aSBram Moolenaarset cpo&vim
34*ff034194SBram Moolenaar"DechoTabOn
355c73622aSBram Moolenaar"call Decho("loading autoload/tar.vim")
3687e25fdfSBram Moolenaar
37a5792f58SBram Moolenaar" ---------------------------------------------------------------------
38a5792f58SBram Moolenaar"  Default Settings: {{{1
39a5792f58SBram Moolenaarif !exists("g:tar_browseoptions")
40a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf"
41a5792f58SBram Moolenaarendif
42a5792f58SBram Moolenaarif !exists("g:tar_readoptions")
43a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf"
44a5792f58SBram Moolenaarendif
45910f66f9SBram Moolenaarif !exists("g:tar_cmd")
46910f66f9SBram Moolenaar let g:tar_cmd= "tar"
47910f66f9SBram Moolenaarendif
48a5792f58SBram Moolenaarif !exists("g:tar_writeoptions")
49a5792f58SBram Moolenaar let g:tar_writeoptions= "uf"
50a5792f58SBram Moolenaarendif
51251e1912SBram Moolenaarif !exists("g:netrw_cygwin")
52251e1912SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
53251e1912SBram Moolenaar  if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
54251e1912SBram Moolenaar   let g:netrw_cygwin= 1
55251e1912SBram Moolenaar  else
56251e1912SBram Moolenaar   let g:netrw_cygwin= 0
57251e1912SBram Moolenaar  endif
58251e1912SBram Moolenaar else
59251e1912SBram Moolenaar  let g:netrw_cygwin= 0
60251e1912SBram Moolenaar endif
61251e1912SBram Moolenaarendif
625c73622aSBram Moolenaarif !exists("g:tar_copycmd")
635c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd")
645c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
655c73622aSBram Moolenaar   if g:netrw_cygwin
665c73622aSBram Moolenaar    let g:netrw_localcopycmd= "cp"
675c73622aSBram Moolenaar   else
685c73622aSBram Moolenaar    let g:netrw_localcopycmd= "copy"
695c73622aSBram Moolenaar   endif
705c73622aSBram Moolenaar  elseif has("unix") || has("macunix")
715c73622aSBram Moolenaar   let g:netrw_localcopycmd= "cp"
725c73622aSBram Moolenaar  else
735c73622aSBram Moolenaar   let g:netrw_localcopycmd= ""
745c73622aSBram Moolenaar  endif
755c73622aSBram Moolenaar endif
765c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd
775c73622aSBram Moolenaarendif
785c73622aSBram Moolenaarif !exists("g:tar_extractcmd")
795c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf"
805c73622aSBram Moolenaarendif
818c8de839SBram Moolenaar
828c8de839SBram Moolenaar" set up shell quoting character
83c81e5e79SBram Moolenaarif !exists("g:tar_shq")
84*ff034194SBram Moolenaar if exists("+shq") && exists("&shq") && &shq != ""
858c8de839SBram Moolenaar  let g:tar_shq= &shq
868c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16")
878c8de839SBram Moolenaar  if exists("g:netrw_cygwin") && g:netrw_cygwin
88c81e5e79SBram Moolenaar   let g:tar_shq= "'"
89c81e5e79SBram Moolenaar  else
90c81e5e79SBram Moolenaar   let g:tar_shq= '"'
91c81e5e79SBram Moolenaar  endif
928c8de839SBram Moolenaar else
938c8de839SBram Moolenaar  let g:tar_shq= "'"
948c8de839SBram Moolenaar endif
958c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">")
96c81e5e79SBram Moolenaarendif
97a5792f58SBram Moolenaar
98a5792f58SBram Moolenaar" ----------------
99a5792f58SBram Moolenaar"  Functions: {{{1
100a5792f58SBram Moolenaar" ----------------
101a5792f58SBram Moolenaar
102a5792f58SBram Moolenaar" ---------------------------------------------------------------------
103a5792f58SBram Moolenaar" tar#Browse: {{{2
104a5792f58SBram Moolenaarfun! tar#Browse(tarfile)
105a5792f58SBram Moolenaar"  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
106bba577a2SBram Moolenaar  let repkeep= &report
107bba577a2SBram Moolenaar  set report=10
108a5792f58SBram Moolenaar
109a5792f58SBram Moolenaar  " sanity checks
110910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
111c81e5e79SBram Moolenaar   redraw!
112910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
113bba577a2SBram Moolenaar   let &report= repkeep
114a5792f58SBram Moolenaar"   call Dret("tar#Browse")
11587e25fdfSBram Moolenaar   return
11687e25fdfSBram Moolenaar  endif
117a5792f58SBram Moolenaar  if !filereadable(a:tarfile)
118910f66f9SBram Moolenaar"   call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
119a5792f58SBram Moolenaar   if a:tarfile !~# '^\a\+://'
120a5792f58SBram Moolenaar    " if its an url, don't complain, let url-handlers such as vim do its thing
121c81e5e79SBram Moolenaar    redraw!
122a5792f58SBram Moolenaar    echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
12387e25fdfSBram Moolenaar   endif
124bba577a2SBram Moolenaar   let &report= repkeep
125a5792f58SBram Moolenaar"   call Dret("tar#Browse : file<".a:tarfile."> not readable")
12687e25fdfSBram Moolenaar   return
12787e25fdfSBram Moolenaar  endif
128a5792f58SBram Moolenaar  if &ma != 1
129a5792f58SBram Moolenaar   set ma
13087e25fdfSBram Moolenaar  endif
1317fc0c065SBram Moolenaar  let b:tarfile= a:tarfile
132a5792f58SBram Moolenaar
133a5792f58SBram Moolenaar  setlocal noswapfile
134a5792f58SBram Moolenaar  setlocal buftype=nofile
135a5792f58SBram Moolenaar  setlocal bufhidden=hide
136a5792f58SBram Moolenaar  setlocal nobuflisted
137a5792f58SBram Moolenaar  setlocal nowrap
138a5792f58SBram Moolenaar  set ft=tar
139a5792f58SBram Moolenaar
140a5792f58SBram Moolenaar  " give header
141910f66f9SBram Moolenaar"  call Decho("printing header")
1428c8de839SBram Moolenaar  let lastline= line("$")
1438c8de839SBram Moolenaar  call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
1448c8de839SBram Moolenaar  call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
1458c8de839SBram Moolenaar  call setline(lastline+3,'" Select a file with cursor and press ENTER')
146251e1912SBram Moolenaar  keepj $put =''
1476be7f873SBram Moolenaar  keepj sil! 0d
148251e1912SBram Moolenaar  keepj $
149a5792f58SBram Moolenaar
150910f66f9SBram Moolenaar  let tarfile= a:tarfile
151*ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
152910f66f9SBram Moolenaar   " assuming cygwin
1535c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
154a5792f58SBram Moolenaar  endif
155d68071d8SBram Moolenaar  let curlast= line("$")
156910f66f9SBram Moolenaar  if tarfile =~# '\.\(gz\|tgz\)$'
1575c73622aSBram Moolenaar"   call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
158251e1912SBram Moolenaar   exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1598c8de839SBram Moolenaar  elseif tarfile =~# '\.lrp'
1605c73622aSBram Moolenaar"   call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
161251e1912SBram Moolenaar   exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
1626be7f873SBram Moolenaar  elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$'
1635c73622aSBram Moolenaar"   call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
164251e1912SBram Moolenaar   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
1656be7f873SBram Moolenaar  elseif tarfile =~# '\.\(lzma\|tlz\)$'
1665c73622aSBram Moolenaar"   call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
167251e1912SBram Moolenaar   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
168477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
169477db060SBram Moolenaar"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
170251e1912SBram Moolenaar   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
171910f66f9SBram Moolenaar  else
172ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
1735c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
174ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
175ed39e1d5SBram Moolenaar   endif
1765c73622aSBram Moolenaar"   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
177251e1912SBram Moolenaar   exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
178910f66f9SBram Moolenaar  endif
179910f66f9SBram Moolenaar  if v:shell_error != 0
180c81e5e79SBram Moolenaar   redraw!
181d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
182d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
183d68071d8SBram Moolenaar   return
184d68071d8SBram Moolenaar  endif
185c81e5e79SBram Moolenaar  if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
186c81e5e79SBram Moolenaar   redraw!
187d68071d8SBram Moolenaar   echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
188251e1912SBram Moolenaar   keepj sil! %d
189d68071d8SBram Moolenaar   let eikeep= &ei
190d68071d8SBram Moolenaar   set ei=BufReadCmd,FileReadCmd
191c236c16dSBram Moolenaar   exe "r ".fnameescape(a:tarfile)
192d68071d8SBram Moolenaar   let &ei= eikeep
193251e1912SBram Moolenaar   keepj sil! 1d
194d68071d8SBram Moolenaar"   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
195910f66f9SBram Moolenaar   return
196910f66f9SBram Moolenaar  endif
197a5792f58SBram Moolenaar
198a5792f58SBram Moolenaar  setlocal noma nomod ro
199a5792f58SBram Moolenaar  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
200a5792f58SBram Moolenaar
201bba577a2SBram Moolenaar  let &report= repkeep
2027fc0c065SBram Moolenaar"  call Dret("tar#Browse : b:tarfile<".b:tarfile.">")
203ab194816SBram Moolenaarendfun
20487e25fdfSBram Moolenaar
205ab194816SBram Moolenaar" ---------------------------------------------------------------------
206a5792f58SBram Moolenaar" TarBrowseSelect: {{{2
207a5792f58SBram Moolenaarfun! s:TarBrowseSelect()
2087fc0c065SBram Moolenaar"  call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">")
209bba577a2SBram Moolenaar  let repkeep= &report
210bba577a2SBram Moolenaar  set report=10
211a5792f58SBram Moolenaar  let fname= getline(".")
212a5792f58SBram Moolenaar"  call Decho("fname<".fname.">")
213a5792f58SBram Moolenaar
214ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
215ed39e1d5SBram Moolenaar   redraw!
2165c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
217ed39e1d5SBram Moolenaar"   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
218ed39e1d5SBram Moolenaar   return
219ed39e1d5SBram Moolenaar  endif
220ed39e1d5SBram Moolenaar
221a5792f58SBram Moolenaar  " sanity check
222a5792f58SBram Moolenaar  if fname =~ '^"'
223bba577a2SBram Moolenaar   let &report= repkeep
224a5792f58SBram Moolenaar"   call Dret("TarBrowseSelect")
225a5792f58SBram Moolenaar   return
226a5792f58SBram Moolenaar  endif
227a5792f58SBram Moolenaar
2287fc0c065SBram Moolenaar  " about to make a new window, need to use b:tarfile
2297fc0c065SBram Moolenaar  let tarfile= b:tarfile
230a5792f58SBram Moolenaar  let curfile= expand("%")
231*ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
232910f66f9SBram Moolenaar   " assuming cygwin
2335c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
234910f66f9SBram Moolenaar  endif
235a5792f58SBram Moolenaar
236a5792f58SBram Moolenaar  new
2378c8de839SBram Moolenaar  if !exists("g:tar_nomax") || g:tar_nomax == 0
238a5792f58SBram Moolenaar   wincmd _
2398c8de839SBram Moolenaar  endif
240a5792f58SBram Moolenaar  let s:tblfile_{winnr()}= curfile
2418c8de839SBram Moolenaar  call tar#Read("tarfile:".tarfile.'::'.fname,1)
242a5792f58SBram Moolenaar  filetype detect
243*ff034194SBram Moolenaar  set nomod
244*ff034194SBram Moolenaar  exe 'com! -buffer -nargs=? -complete=file TarDiff	:call tar#Diff(<q-args>,"'.fnameescape(fname).'")'
245a5792f58SBram Moolenaar
246bba577a2SBram Moolenaar  let &report= repkeep
247a5792f58SBram Moolenaar"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
248a5792f58SBram Moolenaarendfun
249a5792f58SBram Moolenaar
250a5792f58SBram Moolenaar" ---------------------------------------------------------------------
251a5792f58SBram Moolenaar" tar#Read: {{{2
252a5792f58SBram Moolenaarfun! tar#Read(fname,mode)
253a5792f58SBram Moolenaar"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
254bba577a2SBram Moolenaar  let repkeep= &report
255bba577a2SBram Moolenaar  set report=10
2568c8de839SBram Moolenaar  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
2578c8de839SBram Moolenaar  let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
258*ff034194SBram Moolenaar  if has("win32unix") && executable("cygpath")
259910f66f9SBram Moolenaar   " assuming cygwin
2605c73622aSBram Moolenaar   let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
261910f66f9SBram Moolenaar  endif
262910f66f9SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
263910f66f9SBram Moolenaar"  call Decho("fname<".fname.">")
264a5792f58SBram Moolenaar
2655c73622aSBram Moolenaar  if  fname =~ '\.bz2$' && executable("bzcat")
2665c73622aSBram Moolenaar   let decmp= "|bzcat"
2675c73622aSBram Moolenaar   let doro = 1
2685c73622aSBram Moolenaar  elseif      fname =~ '\.gz$'  && executable("zcat")
2698c8de839SBram Moolenaar   let decmp= "|zcat"
2708c8de839SBram Moolenaar   let doro = 1
2715c73622aSBram Moolenaar  elseif  fname =~ '\.lzma$' && executable("lzcat")
2725c73622aSBram Moolenaar   let decmp= "|lzcat"
2738c8de839SBram Moolenaar   let doro = 1
274477db060SBram Moolenaar  elseif  fname =~ '\.xz$' && executable("xzcat")
275477db060SBram Moolenaar   let decmp= "|xzcat"
276477db060SBram Moolenaar   let doro = 1
277a5792f58SBram Moolenaar  else
2788c8de839SBram Moolenaar   let decmp=""
2798c8de839SBram Moolenaar   let doro = 0
280477db060SBram Moolenaar   if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$'
2818c8de839SBram Moolenaar    setlocal bin
282a5792f58SBram Moolenaar   endif
2838c8de839SBram Moolenaar  endif
2848c8de839SBram Moolenaar
285ed39e1d5SBram Moolenaar  if exists("g:tar_secure")
286ed39e1d5SBram Moolenaar   let tar_secure= " -- "
2878c8de839SBram Moolenaar  else
288ed39e1d5SBram Moolenaar   let tar_secure= " "
289ed39e1d5SBram Moolenaar  endif
2905c73622aSBram Moolenaar  if tarfile =~# '\.bz2$'
2915c73622aSBram Moolenaar"   call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
292251e1912SBram Moolenaar   exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
2935c73622aSBram Moolenaar  elseif tarfile =~# '\.\(gz\|tgz\)$'
2945c73622aSBram Moolenaar"   call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1))
295251e1912SBram Moolenaar   exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
296ed39e1d5SBram Moolenaar  elseif tarfile =~# '\.lrp$'
2975c73622aSBram Moolenaar"   call Decho("6: exe silent r! cat ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
298251e1912SBram Moolenaar   exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
2995c73622aSBram Moolenaar  elseif tarfile =~# '\.lzma$'
3005c73622aSBram Moolenaar"   call Decho("7: exe silent r! lzma -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
301251e1912SBram Moolenaar   exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
302477db060SBram Moolenaar  elseif tarfile =~# '\.\(xz\|txz\)$'
303477db060SBram Moolenaar"   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
304251e1912SBram Moolenaar   exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
305ed39e1d5SBram Moolenaar  else
306ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
3075c73622aSBram Moolenaar    " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
308ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
309ed39e1d5SBram Moolenaar   endif
3105c73622aSBram Moolenaar"   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
3115c73622aSBram Moolenaar   exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
3128c8de839SBram Moolenaar  endif
3138c8de839SBram Moolenaar
3148c8de839SBram Moolenaar  if doro
3158c8de839SBram Moolenaar   " because the reverse process of compressing changed files back into the tarball is not currently supported
3168c8de839SBram Moolenaar   setlocal ro
3178c8de839SBram Moolenaar  endif
3188c8de839SBram Moolenaar
3197fc0c065SBram Moolenaar  let b:tarfile= a:fname
320c236c16dSBram Moolenaar  exe "file tarfile::".fnameescape(fname)
321a5792f58SBram Moolenaar
322a5792f58SBram Moolenaar  " cleanup
323251e1912SBram Moolenaar  keepj sil! 0d
324a5792f58SBram Moolenaar  set nomod
325a5792f58SBram Moolenaar
326bba577a2SBram Moolenaar  let &report= repkeep
3277fc0c065SBram Moolenaar"  call Dret("tar#Read : b:tarfile<".b:tarfile.">")
328a5792f58SBram Moolenaarendfun
329a5792f58SBram Moolenaar
330a5792f58SBram Moolenaar" ---------------------------------------------------------------------
331a5792f58SBram Moolenaar" tar#Write: {{{2
332a5792f58SBram Moolenaarfun! tar#Write(fname)
3337fc0c065SBram Moolenaar"  call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
334bba577a2SBram Moolenaar  let repkeep= &report
335bba577a2SBram Moolenaar  set report=10
336a5792f58SBram Moolenaar
337ed39e1d5SBram Moolenaar  if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
338ed39e1d5SBram Moolenaar   redraw!
3395c73622aSBram Moolenaar   echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
340ed39e1d5SBram Moolenaar"   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
341ed39e1d5SBram Moolenaar   return
342ed39e1d5SBram Moolenaar  endif
343ed39e1d5SBram Moolenaar
344ab194816SBram Moolenaar  " sanity checks
345910f66f9SBram Moolenaar  if !executable(g:tar_cmd)
346c81e5e79SBram Moolenaar   redraw!
347910f66f9SBram Moolenaar   echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
348bba577a2SBram Moolenaar   let &report= repkeep
349ab194816SBram Moolenaar"   call Dret("tar#Write")
350ab194816SBram Moolenaar   return
351ab194816SBram Moolenaar  endif
352ab194816SBram Moolenaar  if !exists("*mkdir")
353c81e5e79SBram Moolenaar   redraw!
354a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
355bba577a2SBram Moolenaar   let &report= repkeep
356ab194816SBram Moolenaar"   call Dret("tar#Write")
357ab194816SBram Moolenaar   return
358ab194816SBram Moolenaar  endif
359ab194816SBram Moolenaar
360ab194816SBram Moolenaar  let curdir= getcwd()
361ab194816SBram Moolenaar  let tmpdir= tempname()
362ab194816SBram Moolenaar"  call Decho("orig tempname<".tmpdir.">")
363ab194816SBram Moolenaar  if tmpdir =~ '\.'
364ab194816SBram Moolenaar   let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
365ab194816SBram Moolenaar  endif
366ab194816SBram Moolenaar"  call Decho("tmpdir<".tmpdir.">")
367ab194816SBram Moolenaar  call mkdir(tmpdir,"p")
368ab194816SBram Moolenaar
369ab194816SBram Moolenaar  " attempt to change to the indicated directory
370ab194816SBram Moolenaar  try
3718c8de839SBram Moolenaar   exe "cd ".fnameescape(tmpdir)
372ab194816SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E344/
373c81e5e79SBram Moolenaar   redraw!
374a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
375bba577a2SBram Moolenaar   let &report= repkeep
376ab194816SBram Moolenaar"   call Dret("tar#Write")
377ab194816SBram Moolenaar   return
378ab194816SBram Moolenaar  endtry
379ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
380ab194816SBram Moolenaar
381a5792f58SBram Moolenaar  " place temporary files under .../_ZIPVIM_/
382a5792f58SBram Moolenaar  if isdirectory("_ZIPVIM_")
383a5792f58SBram Moolenaar   call s:Rmdir("_ZIPVIM_")
384ab194816SBram Moolenaar  endif
385a5792f58SBram Moolenaar  call mkdir("_ZIPVIM_")
386a5792f58SBram Moolenaar  cd _ZIPVIM_
387ab194816SBram Moolenaar"  call Decho("current directory now: ".getcwd())
388ab194816SBram Moolenaar
3897fc0c065SBram Moolenaar  let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
3907fc0c065SBram Moolenaar  let fname   = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
391a5792f58SBram Moolenaar
392a5792f58SBram Moolenaar  " handle compressed archives
3935c73622aSBram Moolenaar  if tarfile =~# '\.bz2'
3945c73622aSBram Moolenaar   call system("bzip2 -d -- ".shellescape(tarfile,0))
3955c73622aSBram Moolenaar   let tarfile = substitute(tarfile,'\.bz2','','e')
3965c73622aSBram Moolenaar   let compress= "bzip2 -- ".shellescape(tarfile,0)
3975c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
3985c73622aSBram Moolenaar  elseif tarfile =~# '\.gz'
3995c73622aSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
400a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.gz','','e')
4015c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
4025c73622aSBram Moolenaar"   call Decho("compress<".compress.">")
403a5792f58SBram Moolenaar  elseif tarfile =~# '\.tgz'
4045c73622aSBram Moolenaar   call system("gzip -d -- ".shellescape(tarfile,0))
405a5792f58SBram Moolenaar   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
4065c73622aSBram Moolenaar   let compress= "gzip -- ".shellescape(tarfile,0)
407a5792f58SBram Moolenaar   let tgz     = 1
408ed39e1d5SBram Moolenaar"   call Decho("compress<".compress.">")
409477db060SBram Moolenaar  elseif tarfile =~# '\.xz'
410477db060SBram Moolenaar   call system("xz -d -- ".shellescape(tarfile,0))
411477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.xz','','e')
412477db060SBram Moolenaar   let compress= "xz -- ".shellescape(tarfile,0)
413477db060SBram Moolenaar"   call Decho("compress<".compress.">")
414477db060SBram Moolenaar  elseif tarfile =~# '\.lzma'
415477db060SBram Moolenaar   call system("lzma -d -- ".shellescape(tarfile,0))
416477db060SBram Moolenaar   let tarfile = substitute(tarfile,'\.lzma','','e')
417477db060SBram Moolenaar   let compress= "lzma -- ".shellescape(tarfile,0)
418477db060SBram Moolenaar"   call Decho("compress<".compress.">")
419a5792f58SBram Moolenaar  endif
4208c8de839SBram Moolenaar"  call Decho("tarfile<".tarfile.">")
421a5792f58SBram Moolenaar
422a5792f58SBram Moolenaar  if v:shell_error != 0
423c81e5e79SBram Moolenaar   redraw!
424a5792f58SBram Moolenaar   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
425a5792f58SBram Moolenaar  else
426a5792f58SBram Moolenaar
427a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
428a5792f58SBram Moolenaar
4291cbe5f73SBram Moolenaar   if fname =~ '/'
430a5792f58SBram Moolenaar    let dirpath = substitute(fname,'/[^/]\+$','','e')
431*ff034194SBram Moolenaar    if has("win32unix") && executable("cygpath")
4325c73622aSBram Moolenaar     let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
4331cbe5f73SBram Moolenaar    endif
4341cbe5f73SBram Moolenaar    call mkdir(dirpath,"p")
4351cbe5f73SBram Moolenaar   endif
436a5792f58SBram Moolenaar   if tarfile !~ '/'
437a5792f58SBram Moolenaar    let tarfile= curdir.'/'.tarfile
438a5792f58SBram Moolenaar   endif
439ed39e1d5SBram Moolenaar   if tarfile =~ '^\s*-'
440ed39e1d5SBram Moolenaar    " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
441ed39e1d5SBram Moolenaar    let tarfile = substitute(tarfile, '-', './-', '')
442ed39e1d5SBram Moolenaar   endif
443a5792f58SBram Moolenaar"   call Decho("tarfile<".tarfile."> fname<".fname.">")
444a5792f58SBram Moolenaar
445ed39e1d5SBram Moolenaar   if exists("g:tar_secure")
446ed39e1d5SBram Moolenaar    let tar_secure= " -- "
447ed39e1d5SBram Moolenaar   else
448ed39e1d5SBram Moolenaar    let tar_secure= " "
449ed39e1d5SBram Moolenaar   endif
4508c8de839SBram Moolenaar   exe "w! ".fnameescape(fname)
451*ff034194SBram Moolenaar   if has("win32unix") && executable("cygpath")
4525c73622aSBram Moolenaar    let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
453ab194816SBram Moolenaar   endif
454ab194816SBram Moolenaar
455a5792f58SBram Moolenaar   " delete old file from tarfile
4565c73622aSBram Moolenaar"   call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
4575c73622aSBram Moolenaar   call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
458ab194816SBram Moolenaar   if v:shell_error != 0
459c81e5e79SBram Moolenaar    redraw!
4608c8de839SBram Moolenaar    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
461ab194816SBram Moolenaar   else
462a5792f58SBram Moolenaar
463a5792f58SBram Moolenaar    " update tarfile with new file
4645c73622aSBram Moolenaar"    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
4655c73622aSBram Moolenaar    call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
466a5792f58SBram Moolenaar    if v:shell_error != 0
467c81e5e79SBram Moolenaar     redraw!
4688c8de839SBram Moolenaar     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
469a5792f58SBram Moolenaar    elseif exists("compress")
470a5792f58SBram Moolenaar"     call Decho("call system(".compress.")")
471a5792f58SBram Moolenaar     call system(compress)
472a5792f58SBram Moolenaar     if exists("tgz")
473a5792f58SBram Moolenaar"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
474a5792f58SBram Moolenaar      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
475a5792f58SBram Moolenaar     endif
476a5792f58SBram Moolenaar    endif
477a5792f58SBram Moolenaar   endif
478a5792f58SBram Moolenaar
479a5792f58SBram Moolenaar   " support writing tarfiles across a network
480a5792f58SBram Moolenaar   if s:tblfile_{winnr()} =~ '^\a\+://'
481a5792f58SBram Moolenaar"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
482a5792f58SBram Moolenaar    let tblfile= s:tblfile_{winnr()}
483a5792f58SBram Moolenaar    1split|enew
4845c73622aSBram Moolenaar    let binkeep= &l:binary
485a5792f58SBram Moolenaar    let eikeep = &ei
486a5792f58SBram Moolenaar    set binary ei=all
487c236c16dSBram Moolenaar    exe "e! ".fnameescape(tarfile)
488a5792f58SBram Moolenaar    call netrw#NetWrite(tblfile)
489a5792f58SBram Moolenaar    let &ei       = eikeep
4905c73622aSBram Moolenaar    let &l:binary = binkeep
491a5792f58SBram Moolenaar    q!
492a5792f58SBram Moolenaar    unlet s:tblfile_{winnr()}
493a5792f58SBram Moolenaar   endif
494ab194816SBram Moolenaar  endif
495ab194816SBram Moolenaar
496ab194816SBram Moolenaar  " cleanup and restore current directory
497ab194816SBram Moolenaar  cd ..
498a5792f58SBram Moolenaar  call s:Rmdir("_ZIPVIM_")
499c236c16dSBram Moolenaar  exe "cd ".fnameescape(curdir)
500ab194816SBram Moolenaar  setlocal nomod
501ab194816SBram Moolenaar
502bba577a2SBram Moolenaar  let &report= repkeep
503ab194816SBram Moolenaar"  call Dret("tar#Write")
504ab194816SBram Moolenaarendfun
505ab194816SBram Moolenaar
506ab194816SBram Moolenaar" ---------------------------------------------------------------------
507*ff034194SBram Moolenaar" tar#Diff: {{{2
508*ff034194SBram Moolenaarfun! tar#Diff(userfname,fname)
509*ff034194SBram Moolenaar"  call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")")
510*ff034194SBram Moolenaar  let fname= a:fname
511*ff034194SBram Moolenaar  if a:userfname != ""
512*ff034194SBram Moolenaar   let fname= a:userfname
513*ff034194SBram Moolenaar  endif
514*ff034194SBram Moolenaar  if filereadable(fname)
515*ff034194SBram Moolenaar   " sets current file (from tarball) for diff'ing
516*ff034194SBram Moolenaar   " splits window vertically
517*ff034194SBram Moolenaar   " opens original file, sets it for diff'ing
518*ff034194SBram Moolenaar   " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes)
519*ff034194SBram Moolenaar   diffthis
520*ff034194SBram Moolenaar   wincmd v
521*ff034194SBram Moolenaar   exe "e ".fnameescape(fname)
522*ff034194SBram Moolenaar   diffthis
523*ff034194SBram Moolenaar  else
524*ff034194SBram Moolenaar   redraw!
525*ff034194SBram Moolenaar   echo "***warning*** unable to read file<".fname.">"
526*ff034194SBram Moolenaar  endif
527*ff034194SBram Moolenaar"  call Dret("tar#Diff")
528*ff034194SBram Moolenaarendfun
529*ff034194SBram Moolenaar
530*ff034194SBram Moolenaar" ---------------------------------------------------------------------
5315c73622aSBram Moolenaar" s:Rmdir: {{{2
532ab194816SBram Moolenaarfun! s:Rmdir(fname)
533ab194816SBram Moolenaar"  call Dfunc("Rmdir(fname<".a:fname.">)")
534ab194816SBram Moolenaar  if has("unix")
5355c73622aSBram Moolenaar   call system("/bin/rm -rf -- ".shellescape(a:fname,0))
536ab194816SBram Moolenaar  elseif has("win32") || has("win95") || has("win64") || has("win16")
537ab194816SBram Moolenaar   if &shell =~? "sh$"
5385c73622aSBram Moolenaar    call system("/bin/rm -rf -- ".shellescape(a:fname,0))
539ab194816SBram Moolenaar   else
5405c73622aSBram Moolenaar    call system("del /S ".shellescape(a:fname,0))
541ab194816SBram Moolenaar   endif
542ab194816SBram Moolenaar  endif
543ab194816SBram Moolenaar"  call Dret("Rmdir")
544ab194816SBram Moolenaarendfun
545ab194816SBram Moolenaar
5468c8de839SBram Moolenaar" ---------------------------------------------------------------------
5475c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
5485c73622aSBram Moolenaarfun! tar#Vimuntar(...)
5495c73622aSBram Moolenaar"  call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
5505c73622aSBram Moolenaar  let tarball = expand("%")
5515c73622aSBram Moolenaar"  call Decho("tarball<".tarball.">")
5525c73622aSBram Moolenaar  let tarbase = substitute(tarball,'\..*$','','')
5535c73622aSBram Moolenaar"  call Decho("tarbase<".tarbase.">")
5545c73622aSBram Moolenaar  let tarhome = expand("%:p")
5555c73622aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
5565c73622aSBram Moolenaar   let tarhome= substitute(tarhome,'\\','/','g')
5575c73622aSBram Moolenaar  endif
5585c73622aSBram Moolenaar  let tarhome= substitute(tarhome,'/[^/]*$','','')
5595c73622aSBram Moolenaar"  call Decho("tarhome<".tarhome.">")
5605c73622aSBram Moolenaar  let tartail = expand("%:t")
5615c73622aSBram Moolenaar"  call Decho("tartail<".tartail.">")
5625c73622aSBram Moolenaar  let curdir  = getcwd()
5635c73622aSBram Moolenaar"  call Decho("curdir <".curdir.">")
5645c73622aSBram Moolenaar  " set up vimhome
5655c73622aSBram Moolenaar  if a:0 > 0 && a:1 != ""
5665c73622aSBram Moolenaar   let vimhome= a:1
567c236c16dSBram Moolenaar  else
5685c73622aSBram Moolenaar   let vimhome= vimball#VimballHome()
5695c73622aSBram Moolenaar  endif
5705c73622aSBram Moolenaar"  call Decho("vimhome<".vimhome.">")
5715c73622aSBram Moolenaar
5725c73622aSBram Moolenaar"  call Decho("curdir<".curdir."> vimhome<".vimhome.">")
5735c73622aSBram Moolenaar  if simplify(curdir) != simplify(vimhome)
5745c73622aSBram Moolenaar   " copy (possibly compressed) tarball to .vim/vimfiles
5755c73622aSBram Moolenaar"   call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
5765c73622aSBram Moolenaar   call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
5775c73622aSBram Moolenaar"   call Decho("exe cd ".fnameescape(vimhome))
5785c73622aSBram Moolenaar   exe "cd ".fnameescape(vimhome)
5795c73622aSBram Moolenaar  endif
5805c73622aSBram Moolenaar"  call Decho("getcwd<".getcwd().">")
5815c73622aSBram Moolenaar
5825c73622aSBram Moolenaar  " if necessary, decompress the tarball; then, extract it
5835c73622aSBram Moolenaar  if tartail =~ '\.tgz'
5845c73622aSBram Moolenaar   if executable("gunzip")
5855c73622aSBram Moolenaar    silent exe "!gunzip ".shellescape(tartail)
5865c73622aSBram Moolenaar   elseif executable("gzip")
5875c73622aSBram Moolenaar    silent exe "!gzip -d ".shellescape(tartail)
5885c73622aSBram Moolenaar   else
5895c73622aSBram Moolenaar    echoerr "unable to decompress<".tartail."> on this sytem"
5905c73622aSBram Moolenaar    if simplify(curdir) != simplify(tarhome)
5915c73622aSBram Moolenaar     " remove decompressed tarball, restore directory
5925c73622aSBram Moolenaar"     call Decho("delete(".tartail.".tar)")
5935c73622aSBram Moolenaar     call delete(tartail.".tar")
5945c73622aSBram Moolenaar"     call Decho("exe cd ".fnameescape(curdir))
5955c73622aSBram Moolenaar     exe "cd ".fnameescape(curdir)
5965c73622aSBram Moolenaar    endif
5975c73622aSBram Moolenaar"    call Dret("tar#Vimuntar")
5985c73622aSBram Moolenaar    return
599c236c16dSBram Moolenaar   endif
6008c8de839SBram Moolenaar  else
6015c73622aSBram Moolenaar   call vimball#Decompress(tartail,0)
6028c8de839SBram Moolenaar  endif
6035c73622aSBram Moolenaar  let extractcmd= netrw#WinPath(g:tar_extractcmd)
6045c73622aSBram Moolenaar"  call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
6055c73622aSBram Moolenaar  call system(extractcmd." ".shellescape(tarbase.".tar"))
6065c73622aSBram Moolenaar
6075c73622aSBram Moolenaar  " set up help
6085c73622aSBram Moolenaar  if filereadable("doc/".tarbase.".txt")
6095c73622aSBram Moolenaar"   call Decho("exe helptags ".getcwd()."/doc")
6105c73622aSBram Moolenaar   exe "helptags ".getcwd()."/doc"
6115c73622aSBram Moolenaar  endif
6125c73622aSBram Moolenaar
6135c73622aSBram Moolenaar  if simplify(tarhome) != simplify(vimhome)
6145c73622aSBram Moolenaar   " remove decompressed tarball, restore directory
6155c73622aSBram Moolenaar   call delete(vimhome."/".tarbase.".tar")
6165c73622aSBram Moolenaar   exe "cd ".fnameescape(curdir)
6175c73622aSBram Moolenaar  endif
6185c73622aSBram Moolenaar
6195c73622aSBram Moolenaar"  call Dret("tar#Vimuntar")
6208c8de839SBram Moolenaarendfun
6218c8de839SBram Moolenaar
6225c73622aSBram Moolenaar" =====================================================================
623a5792f58SBram Moolenaar" Modelines And Restoration: {{{1
624a5792f58SBram Moolenaarlet &cpo= s:keepcpo
625a5792f58SBram Moolenaarunlet s:keepcpo
626a5792f58SBram Moolenaar" vim:ts=8 fdm=marker
627