19964e468SBram Moolenaar" ---------------------------------------------------------------------
29964e468SBram Moolenaar" getscript.vim
39964e468SBram Moolenaar"  Author:	Charles E. Campbell, Jr.
4*3577c6faSBram Moolenaar"  Date:	May 30, 2008
5*3577c6faSBram Moolenaar"  Version:	30
69964e468SBram Moolenaar"  Installing:	:help glvs-install
79964e468SBram Moolenaar"  Usage:	:help glvs
89964e468SBram Moolenaar"
99964e468SBram Moolenaar" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim
109e368dbaSBram Moolenaar"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
119964e468SBram Moolenaar" ---------------------------------------------------------------------
129964e468SBram Moolenaar" Initialization:	{{{1
139964e468SBram Moolenaar" if you're sourcing this file, surely you can't be
14*3577c6faSBram Moolenaar" expecting vim to be in its vi-compatible mode!
159964e468SBram Moolenaarif &cp
169964e468SBram Moolenaar echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)"
179964e468SBram Moolenaar finish
189964e468SBram Moolenaarendif
199964e468SBram Moolenaarlet s:keepcpo = &cpo
209964e468SBram Moolenaarset cpo&vim
2182038d73SBram Moolenaar"DechoTabOn
229964e468SBram Moolenaar
239964e468SBram Moolenaarif exists("g:loaded_getscript")
249964e468SBram Moolenaar finish
259964e468SBram Moolenaarendif
26*3577c6faSBram Moolenaarlet g:loaded_getscript= "v30"
279964e468SBram Moolenaar
28*3577c6faSBram Moolenaar" ---------------------------
299964e468SBram Moolenaar" Global Variables: {{{1
30*3577c6faSBram Moolenaar" ---------------------------
31*3577c6faSBram Moolenaar" Cygwin Detection ------- {{{2
32*3577c6faSBram Moolenaarif !exists("g:getscript_cygwin")
33*3577c6faSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
34*3577c6faSBram Moolenaar  if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
35*3577c6faSBram Moolenaar   let g:getscript_cygwin= 1
36*3577c6faSBram Moolenaar  else
37*3577c6faSBram Moolenaar   let g:getscript_cygwin= 0
38*3577c6faSBram Moolenaar  endif
39*3577c6faSBram Moolenaar else
40*3577c6faSBram Moolenaar  let g:getscript_cygwin= 0
41*3577c6faSBram Moolenaar endif
42*3577c6faSBram Moolenaarendif
43*3577c6faSBram Moolenaar" shell quoting character {{{2
44*3577c6faSBram Moolenaarif exists("g:netrw_shq") && !exists("g:getscript_shq")
45*3577c6faSBram Moolenaar let g:getscript_shq= g:netrw_shq
46*3577c6faSBram Moolenaarelseif !exists("g:getscript_shq")
47*3577c6faSBram Moolenaar if exists("&shq") && &shq != ""
48*3577c6faSBram Moolenaar  let g:getscript_shq= &shq
49*3577c6faSBram Moolenaar elseif exists("&sxq") && &sxq != ""
50*3577c6faSBram Moolenaar  let g:getscript_shq= &sxq
51*3577c6faSBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16")
52*3577c6faSBram Moolenaar  if g:getscript_cygwin
53*3577c6faSBram Moolenaar   let g:getscript_shq= "'"
54*3577c6faSBram Moolenaar  else
55*3577c6faSBram Moolenaar   let g:getscript_shq= '"'
56*3577c6faSBram Moolenaar  endif
57*3577c6faSBram Moolenaar else
58*3577c6faSBram Moolenaar  let g:getscript_shq= "'"
59*3577c6faSBram Moolenaar endif
60*3577c6faSBram Moolenaar" call Decho("g:getscript_shq<".g:getscript_shq.">")
61*3577c6faSBram Moolenaarendif
62*3577c6faSBram Moolenaar
63*3577c6faSBram Moolenaar" wget vs curl {{{2
649964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget")
659964e468SBram Moolenaar if executable("wget")
669964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "wget"
679964e468SBram Moolenaar elseif executable("curl")
689964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "curl"
699964e468SBram Moolenaar else
709964e468SBram Moolenaar  let g:GetLatestVimScripts_wget    = 'echo "GetLatestVimScripts needs wget or curl"'
719964e468SBram Moolenaar  let g:GetLatestVimScripts_options = ""
729964e468SBram Moolenaar endif
739964e468SBram Moolenaarendif
749964e468SBram Moolenaar
759964e468SBram Moolenaar" options that wget and curl require:
769964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options")
779964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget"
789964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-q -O"
799964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl"
809964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-s -O"
819964e468SBram Moolenaar else
829964e468SBram Moolenaar  let g:GetLatestVimScripts_options= ""
839964e468SBram Moolenaar endif
849964e468SBram Moolenaarendif
859964e468SBram Moolenaar
869964e468SBram Moolenaar" by default, allow autoinstall lines to work
879964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall")
889964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1
899964e468SBram Moolenaarendif
909964e468SBram Moolenaar
919964e468SBram Moolenaar"" For debugging:
929964e468SBram Moolenaar"let g:GetLatestVimScripts_wget    = "echo"
939964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options"
949964e468SBram Moolenaar
959964e468SBram Moolenaar" ---------------------------------------------------------------------
969964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1
979964e468SBram Moolenaarlet s:autoinstall= ""
989964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall
999964e468SBram Moolenaar
1009964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash"
1019964e468SBram Moolenaar  " windows (but not cygwin/bash)
1029964e468SBram Moolenaar  let s:dotvim= "vimfiles"
1039964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
1049964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "ren"
1059964e468SBram Moolenaar  endif
1069964e468SBram Moolenaar
1079964e468SBram Moolenaar else
1089964e468SBram Moolenaar  " unix
1099964e468SBram Moolenaar  let s:dotvim= ".vim"
1109964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
1119964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "mv"
1129964e468SBram Moolenaar  endif
1139964e468SBram Moolenaar endif
1149964e468SBram Moolenaar
1159964e468SBram Moolenaar if exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim)
1169964e468SBram Moolenaar  let s:autoinstall= $HOME."/".s:dotvim
1179964e468SBram Moolenaar endif
1189964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">")
1199964e468SBram Moolenaar"else "Decho
1209964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled")
1219964e468SBram Moolenaarendif
1229964e468SBram Moolenaar
1239964e468SBram Moolenaar" ---------------------------------------------------------------------
1249964e468SBram Moolenaar"  Public Interface: {{{1
1259964e468SBram Moolenaarcom!        -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts()
1269964e468SBram Moolenaarcom!        -nargs=0 GetScript           call getscript#GetLatestVimScripts()
1279964e468SBram Moolenaarsilent! com -nargs=0 GLVS                call getscript#GetLatestVimScripts()
1289964e468SBram Moolenaar
1299964e468SBram Moolenaar" ---------------------------------------------------------------------
1309964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1
1319964e468SBram Moolenaar"                      scripts based on the list in
1329964e468SBram Moolenaar"   (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat
1339964e468SBram Moolenaarfun! getscript#GetLatestVimScripts()
1349964e468SBram Moolenaar"  call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">")
1359964e468SBram Moolenaar
1369964e468SBram Moolenaar" insure that wget is executable
1379964e468SBram Moolenaar  if executable(g:GetLatestVimScripts_wget) != 1
1389964e468SBram Moolenaar   echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system"
1399964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : wget not executable/availble")
1409964e468SBram Moolenaar   return
1419964e468SBram Moolenaar  endif
1429964e468SBram Moolenaar
1439964e468SBram Moolenaar  " Find the .../GetLatest subdirectory under the runtimepath
1449964e468SBram Moolenaar  for datadir in split(&rtp,',') + ['']
1459964e468SBram Moolenaar   if isdirectory(datadir."/GetLatest")
1469964e468SBram Moolenaar"    call Decho("found directory<".datadir.">")
1479964e468SBram Moolenaar    let datadir= datadir . "/GetLatest"
1489964e468SBram Moolenaar    break
1499964e468SBram Moolenaar   endif
1509964e468SBram Moolenaar   if filereadable(datadir."GetLatestVimScripts.dat")
1519964e468SBram Moolenaar"    call Decho("found ".datadir."/GetLatestVimScripts.dat")
1529964e468SBram Moolenaar    break
1539964e468SBram Moolenaar   endif
1549964e468SBram Moolenaar  endfor
15582038d73SBram Moolenaar
1569964e468SBram Moolenaar  " Sanity checks: readability and writability
1579964e468SBram Moolenaar  if datadir == ""
1589964e468SBram Moolenaar   echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install'
1599964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory")
1609964e468SBram Moolenaar   return
1619964e468SBram Moolenaar  endif
1629964e468SBram Moolenaar
1639964e468SBram Moolenaar  if filewritable(datadir) != 2
1649964e468SBram Moolenaar   echoerr "(getLatestVimScripts) Your ".datadir." isn't writable"
1659964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable directory<".datadir.">")
1669964e468SBram Moolenaar   return
1679964e468SBram Moolenaar  endif
1689964e468SBram Moolenaar  let datafile= datadir."/GetLatestVimScripts.dat"
1699964e468SBram Moolenaar  if !filereadable(datafile)
1709964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't readable"
1719964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">")
1729964e468SBram Moolenaar   return
1739964e468SBram Moolenaar  endif
1749964e468SBram Moolenaar  if !filewritable(datafile)
1759964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't writable"
1769964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">")
1779964e468SBram Moolenaar   return
1789964e468SBram Moolenaar  endif
1799964e468SBram Moolenaar"  call Decho("datadir  <".datadir.">")
1809964e468SBram Moolenaar"  call Decho("datafile <".datafile.">")
1819964e468SBram Moolenaar
1829964e468SBram Moolenaar  " don't let any events interfere (like winmanager's, taglist's, etc)
1839964e468SBram Moolenaar  let eikeep= &ei
1849964e468SBram Moolenaar  set ei=all
1859964e468SBram Moolenaar
1869964e468SBram Moolenaar  " record current directory, change to datadir, open split window with
1879964e468SBram Moolenaar  " datafile
1889964e468SBram Moolenaar  let origdir= getcwd()
189*3577c6faSBram Moolenaar"  call Decho("exe cd ".fnameescape(substitute(datadir,'\','/','ge')))
190*3577c6faSBram Moolenaar  exe "cd ".fnameescape(substitute(datadir,'\','/','ge'))
1919964e468SBram Moolenaar  split
192*3577c6faSBram Moolenaar"  call Decho("exe e ".fnameescape(substitute(datafile,'\','/','ge')))
193*3577c6faSBram Moolenaar  exe "e ".fnameescape(substitute(datafile,'\','/','ge'))
1949964e468SBram Moolenaar  res 1000
1959964e468SBram Moolenaar  let s:downloads = 0
1969964e468SBram Moolenaar  let s:downerrors= 0
1979964e468SBram Moolenaar
1989964e468SBram Moolenaar  " Check on dependencies mentioned in plugins
1999964e468SBram Moolenaar"  call Decho(" ")
2009964e468SBram Moolenaar"  call Decho("searching plugins for GetLatestVimScripts dependencies")
2019964e468SBram Moolenaar  let lastline    = line("$")
20282038d73SBram Moolenaar"  call Decho("lastline#".lastline)
203*3577c6faSBram Moolenaar  let plugins     = split(globpath(&rtp,"plugin/*.vim"),'\n')
2049964e468SBram Moolenaar  let foundscript = 0
20582038d73SBram Moolenaar  let firstdir= ""
2069964e468SBram Moolenaar
20782038d73SBram Moolenaar  for plugin in plugins
208*3577c6faSBram Moolenaar"   call Decho("plugin<".plugin.">")
20982038d73SBram Moolenaar
21082038d73SBram Moolenaar   " don't process plugins in system directories
21182038d73SBram Moolenaar   if firstdir == ""
21282038d73SBram Moolenaar    let firstdir= substitute(plugin,'[/\\][^/\\]\+$','','')
213*3577c6faSBram Moolenaar"    call Decho("setting firstdir<".firstdir.">")
21482038d73SBram Moolenaar   else
21582038d73SBram Moolenaar    let curdir= substitute(plugin,'[/\\][^/\\]\+$','','')
21682038d73SBram Moolenaar"    call Decho("curdir<".curdir.">")
21782038d73SBram Moolenaar    if curdir != firstdir
218*3577c6faSBram Moolenaar"     call Decho("skipping subsequent plugins: curdir<".curdir."> != firstdir<".firstdir.">")
21982038d73SBram Moolenaar     break
22082038d73SBram Moolenaar    endif
22182038d73SBram Moolenaar   endif
22282038d73SBram Moolenaar
22382038d73SBram Moolenaar   " read plugin in
224*3577c6faSBram Moolenaar   " evidently a :r creates a new buffer (the "#" buffer) that is subsequently unused -- bwiping it
2259964e468SBram Moolenaar   $
22682038d73SBram Moolenaar"   call Decho(" ")
2279964e468SBram Moolenaar"   call Decho(".dependency checking<".plugin."> line$=".line("$"))
228*3577c6faSBram Moolenaar"   call Decho("exe silent r ".fnameescape(plugin))
229*3577c6faSBram Moolenaar   exe "silent r ".fnameescape(plugin)
230*3577c6faSBram Moolenaar   exe "silent bwipe ".bufnr("#")
23182038d73SBram Moolenaar
2329964e468SBram Moolenaar   while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0
2339964e468SBram Moolenaar    let newscript= substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e')
2349964e468SBram Moolenaar    let llp1     = lastline+1
23582038d73SBram Moolenaar"    call Decho("..newscript<".newscript.">")
2369964e468SBram Moolenaar
237*3577c6faSBram Moolenaar    " don't process ""GetLatestVimScripts lines -- those that have been doubly-commented out
2389964e468SBram Moolenaar    if newscript !~ '^"'
2399964e468SBram Moolenaar     " found a "GetLatestVimScripts: # #" line in the script; check if its already in the datafile
2409964e468SBram Moolenaar     let curline     = line(".")
2419964e468SBram Moolenaar     let noai_script = substitute(newscript,'\s*:AutoInstall:\s*','','e')
2429964e468SBram Moolenaar     exe llp1
2439964e468SBram Moolenaar     let srchline    = search('\<'.noai_script.'\>','bW')
24482038d73SBram Moolenaar"     call Decho("..noai_script<".noai_script."> srch=".srchline."curline#".line(".")." lastline#".lastline)
2459964e468SBram Moolenaar
2469964e468SBram Moolenaar     if srchline == 0
2479964e468SBram Moolenaar      " found a new script to permanently include in the datafile
2489964e468SBram Moolenaar      let keep_rega   = @a
2499964e468SBram Moolenaar      let @a          = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','')
2509964e468SBram Moolenaar      exe lastline."put a"
2519964e468SBram Moolenaar      echomsg "Appending <".@a."> to ".datafile." for ".newscript
2529964e468SBram Moolenaar"      call Decho("..APPEND (".noai_script.")<".@a."> to GetLatestVimScripts.dat")
2539964e468SBram Moolenaar      let @a          = keep_rega
2549964e468SBram Moolenaar      let lastline    = llp1
2559964e468SBram Moolenaar      let curline     = curline     + 1
2569964e468SBram Moolenaar      let foundscript = foundscript + 1
2579964e468SBram Moolenaar"     else	" Decho
2589964e468SBram Moolenaar"      call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")")
2599964e468SBram Moolenaar     endif
2609964e468SBram Moolenaar
2619964e468SBram Moolenaar     let curline = curline + 1
2629964e468SBram Moolenaar     exe curline
2639964e468SBram Moolenaar    endif
2649964e468SBram Moolenaar   endwhile
26582038d73SBram Moolenaar
2669964e468SBram Moolenaar   let llp1= lastline + 1
2679964e468SBram Moolenaar"   call Decho(".deleting lines: ".llp1.",$d")
2689964e468SBram Moolenaar   exe "silent! ".llp1.",$d"
26982038d73SBram Moolenaar  endfor
27082038d73SBram Moolenaar"  call Decho("--- end dependency checking loop ---  foundscript=".foundscript)
27182038d73SBram Moolenaar"  call Decho(" ")
272*3577c6faSBram Moolenaar"  call Dredir("BUFFER TEST (GetLatestVimScripts 1)","ls!")
2739964e468SBram Moolenaar
2749964e468SBram Moolenaar  if foundscript == 0
275*3577c6faSBram Moolenaar   setlocal nomod
2769964e468SBram Moolenaar  endif
2779964e468SBram Moolenaar
2789964e468SBram Moolenaar  " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat
27982038d73SBram Moolenaar"  call Decho("begin: checking out-of-date scripts using datafile<".datafile.">")
280*3577c6faSBram Moolenaar  setlocal lz
2819964e468SBram Moolenaar  1
28282038d73SBram Moolenaar"  /^-----/,$g/^\s*\d/call Decho(getline("."))
28382038d73SBram Moolenaar  1
28482038d73SBram Moolenaar  /^-----/,$g/^\s*\d/call s:GetOneScript()
28582038d73SBram Moolenaar"  call Decho("--- end out-of-date checking --- ")
2869964e468SBram Moolenaar
2879964e468SBram Moolenaar  " Final report (an echomsg)
2889964e468SBram Moolenaar  try
2899964e468SBram Moolenaar   silent! ?^-------?
2909964e468SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E114/
2919964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : nothing done!")
2929964e468SBram Moolenaar   return
2939964e468SBram Moolenaar  endtry
2949964e468SBram Moolenaar  exe "norm! kz\<CR>"
2959964e468SBram Moolenaar  redraw!
2969964e468SBram Moolenaar  let s:msg = ""
2979964e468SBram Moolenaar  if s:downloads == 1
2989964e468SBram Moolenaar  let s:msg = "Downloaded one updated script to <".datadir.">"
2999964e468SBram Moolenaar  elseif s:downloads == 2
3009964e468SBram Moolenaar   let s:msg= "Downloaded two updated scripts to <".datadir.">"
3019964e468SBram Moolenaar  elseif s:downloads > 1
3029964e468SBram Moolenaar   let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">"
3039964e468SBram Moolenaar  else
3049964e468SBram Moolenaar   let s:msg= "Everything was already current"
3059964e468SBram Moolenaar  endif
3069964e468SBram Moolenaar  if s:downerrors > 0
3079964e468SBram Moolenaar   let s:msg= s:msg." (".s:downerrors." downloading errors)"
3089964e468SBram Moolenaar  endif
3099964e468SBram Moolenaar  echomsg s:msg
3109964e468SBram Moolenaar  " save the file
3119964e468SBram Moolenaar  if &mod
3129964e468SBram Moolenaar   silent! w!
3139964e468SBram Moolenaar  endif
3149964e468SBram Moolenaar  q
3159964e468SBram Moolenaar
3169964e468SBram Moolenaar  " restore events and current directory
317*3577c6faSBram Moolenaar  exe "cd ".fnameescape(substitute(origdir,'\','/','ge'))
3189964e468SBram Moolenaar  let &ei= eikeep
319*3577c6faSBram Moolenaar  setlocal nolz
320*3577c6faSBram Moolenaar"  call Dredir("BUFFER TEST (GetLatestVimScripts 2)","ls!")
3219964e468SBram Moolenaar"  call Dret("GetLatestVimScripts : did ".s:downloads." downloads")
3229964e468SBram Moolenaarendfun
3239964e468SBram Moolenaar
324*3577c6faSBram Moolenaar" ---------------------------------------------------------------------
325*3577c6faSBram Moolenaar"  GetOneScript: (Get Latest Vim Script) this function operates {{{1
326*3577c6faSBram Moolenaar"    on the current line, interpreting two numbers and text as
327*3577c6faSBram Moolenaar"    ScriptID, SourceID, and Filename.
328*3577c6faSBram Moolenaar"    It downloads any scripts that have newer versions from vim.sf.net.
329*3577c6faSBram Moolenaarfun! s:GetOneScript(...)
330*3577c6faSBram Moolenaar"   call Dfunc("GetOneScript()")
331*3577c6faSBram Moolenaar
332*3577c6faSBram Moolenaar " set options to allow progress to be shown on screen
333*3577c6faSBram Moolenaar  let rega= @a
334*3577c6faSBram Moolenaar  let t_ti= &t_ti
335*3577c6faSBram Moolenaar  let t_te= &t_te
336*3577c6faSBram Moolenaar  let rs  = &rs
337*3577c6faSBram Moolenaar  set t_ti= t_te= nors
338*3577c6faSBram Moolenaar
339*3577c6faSBram Moolenaar " put current line on top-of-screen and interpret it into
340*3577c6faSBram Moolenaar " a      script identifer  : used to obtain webpage
341*3577c6faSBram Moolenaar "        source identifier : used to identify current version
342*3577c6faSBram Moolenaar " and an associated comment: used to report on what's being considered
343*3577c6faSBram Moolenaar  if a:0 >= 3
344*3577c6faSBram Moolenaar   let scriptid = a:1
345*3577c6faSBram Moolenaar   let srcid    = a:2
346*3577c6faSBram Moolenaar   let fname    = a:3
347*3577c6faSBram Moolenaar   let cmmnt    = ""
348*3577c6faSBram Moolenaar"   call Decho("scriptid<".scriptid.">")
349*3577c6faSBram Moolenaar"   call Decho("srcid   <".srcid.">")
350*3577c6faSBram Moolenaar"   call Decho("fname   <".fname.">")
351*3577c6faSBram Moolenaar  else
352*3577c6faSBram Moolenaar   let curline  = getline(".")
353*3577c6faSBram Moolenaar   if curline =~ '^\s*#'
354*3577c6faSBram Moolenaar    let @a= rega
355*3577c6faSBram Moolenaar"    call Dret("GetOneScript : skipping a pure comment line")
356*3577c6faSBram Moolenaar    return
357*3577c6faSBram Moolenaar   endif
358*3577c6faSBram Moolenaar   let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$'
359*3577c6faSBram Moolenaar   try
360*3577c6faSBram Moolenaar    let scriptid = substitute(curline,parsepat,'\1','e')
361*3577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
362*3577c6faSBram Moolenaar    let scriptid= 0
363*3577c6faSBram Moolenaar   endtry
364*3577c6faSBram Moolenaar   try
365*3577c6faSBram Moolenaar    let srcid    = substitute(curline,parsepat,'\2','e')
366*3577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
367*3577c6faSBram Moolenaar    let srcid= 0
368*3577c6faSBram Moolenaar   endtry
369*3577c6faSBram Moolenaar   try
370*3577c6faSBram Moolenaar    let fname= substitute(curline,parsepat,'\3','e')
371*3577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
372*3577c6faSBram Moolenaar    let fname= ""
373*3577c6faSBram Moolenaar   endtry
374*3577c6faSBram Moolenaar   try
375*3577c6faSBram Moolenaar    let cmmnt= substitute(curline,parsepat,'\4','e')
376*3577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
377*3577c6faSBram Moolenaar    let cmmnt= ""
378*3577c6faSBram Moolenaar   endtry
379*3577c6faSBram Moolenaar"   call Decho("curline <".curline.">")
380*3577c6faSBram Moolenaar"   call Decho("parsepat<".parsepat.">")
381*3577c6faSBram Moolenaar"   call Decho("scriptid<".scriptid.">")
382*3577c6faSBram Moolenaar"   call Decho("srcid   <".srcid.">")
383*3577c6faSBram Moolenaar"   call Decho("fname   <".fname.">")
384*3577c6faSBram Moolenaar  endif
385*3577c6faSBram Moolenaar
386*3577c6faSBram Moolenaar  if scriptid == 0 || srcid == 0
387*3577c6faSBram Moolenaar   " When looking for :AutoInstall: lines, skip scripts that have   0 0 scriptname
388*3577c6faSBram Moolenaar   let @a= rega
389*3577c6faSBram Moolenaar"   call Dret("GetOneScript : skipping a scriptid==srcid==0 line")
390*3577c6faSBram Moolenaar   return
391*3577c6faSBram Moolenaar  endif
392*3577c6faSBram Moolenaar
393*3577c6faSBram Moolenaar  let doautoinstall= 0
394*3577c6faSBram Moolenaar  if fname =~ ":AutoInstall:"
395*3577c6faSBram Moolenaar"   call Decho("case AutoInstall: fname<".fname.">")
396*3577c6faSBram Moolenaar   let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','')
397*3577c6faSBram Moolenaar"   call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall)
398*3577c6faSBram Moolenaar   if s:autoinstall != ""
399*3577c6faSBram Moolenaar    let doautoinstall = g:GetLatestVimScripts_allowautoinstall
400*3577c6faSBram Moolenaar   endif
401*3577c6faSBram Moolenaar  else
402*3577c6faSBram Moolenaar   let aicmmnt= fname
403*3577c6faSBram Moolenaar  endif
404*3577c6faSBram Moolenaar"  call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall)
405*3577c6faSBram Moolenaar
406*3577c6faSBram Moolenaar  exe "norm z\<CR>"
407*3577c6faSBram Moolenaar  redraw!
408*3577c6faSBram Moolenaar"  call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid)
409*3577c6faSBram Moolenaar  echo 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid
410*3577c6faSBram Moolenaar
411*3577c6faSBram Moolenaar  " grab a copy of the plugin's vim.sf.net webpage
412*3577c6faSBram Moolenaar  let scriptaddr = 'http://vim.sf.net/script.php?script_id='.scriptid
413*3577c6faSBram Moolenaar  let tmpfile    = tempname()
414*3577c6faSBram Moolenaar  let v:errmsg   = ""
415*3577c6faSBram Moolenaar
416*3577c6faSBram Moolenaar  " make up to three tries at downloading the description
417*3577c6faSBram Moolenaar  let itry= 1
418*3577c6faSBram Moolenaar  while itry <= 3
419*3577c6faSBram Moolenaar"   call Decho("try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr)
420*3577c6faSBram Moolenaar   if has("win32") || has("win16") || has("win95")
421*3577c6faSBram Moolenaar"    call Decho("new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile).' '.s:Escape(scriptaddr)."|bw!")
422*3577c6faSBram Moolenaar    new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile).' '.s:Escape(scriptaddr)|bw!
423*3577c6faSBram Moolenaar   else
424*3577c6faSBram Moolenaar"    call Decho("exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile)." ".s:Escape(scriptaddr))
425*3577c6faSBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile)." ".s:Escape(scriptaddr)
426*3577c6faSBram Moolenaar   endif
427*3577c6faSBram Moolenaar   if itry == 1
428*3577c6faSBram Moolenaar    exe "silent vsplit ".fnameescape(tmpfile)
429*3577c6faSBram Moolenaar   else
430*3577c6faSBram Moolenaar    silent! e %
431*3577c6faSBram Moolenaar   endif
432*3577c6faSBram Moolenaar   setlocal bh=wipe
433*3577c6faSBram Moolenaar
434*3577c6faSBram Moolenaar   " find the latest source-id in the plugin's webpage
435*3577c6faSBram Moolenaar   silent! 1
436*3577c6faSBram Moolenaar   let findpkg= search('Click on the package to download','W')
437*3577c6faSBram Moolenaar   if findpkg > 0
438*3577c6faSBram Moolenaar    break
439*3577c6faSBram Moolenaar   endif
440*3577c6faSBram Moolenaar   let itry= itry + 1
441*3577c6faSBram Moolenaar  endwhile
442*3577c6faSBram Moolenaar"  call Decho(" --- end downloading tries while loop --- itry=".itry)
443*3577c6faSBram Moolenaar
444*3577c6faSBram Moolenaar  " testing: did finding "Click on the package..." fail?
445*3577c6faSBram Moolenaar  if findpkg == 0 || itry >= 4
446*3577c6faSBram Moolenaar   silent q!
447*3577c6faSBram Moolenaar   call delete(tmpfile)
448*3577c6faSBram Moolenaar  " restore options
449*3577c6faSBram Moolenaar   let &t_ti        = t_ti
450*3577c6faSBram Moolenaar   let &t_te        = t_te
451*3577c6faSBram Moolenaar   let &rs          = rs
452*3577c6faSBram Moolenaar   let s:downerrors = s:downerrors + 1
453*3577c6faSBram Moolenaar"   call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">")
454*3577c6faSBram Moolenaar   echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">"
455*3577c6faSBram Moolenaar"   call Dret("GetOneScript : srch for /Click on the package/ failed")
456*3577c6faSBram Moolenaar   let @a= rega
457*3577c6faSBram Moolenaar   return
458*3577c6faSBram Moolenaar  endif
459*3577c6faSBram Moolenaar"  call Decho('found "Click on the package to download"')
460*3577c6faSBram Moolenaar
461*3577c6faSBram Moolenaar  let findsrcid= search('src_id=','W')
462*3577c6faSBram Moolenaar  if findsrcid == 0
463*3577c6faSBram Moolenaar   silent q!
464*3577c6faSBram Moolenaar   call delete(tmpfile)
465*3577c6faSBram Moolenaar  " restore options
466*3577c6faSBram Moolenaar   let &t_ti        = t_ti
467*3577c6faSBram Moolenaar   let &t_te        = t_te
468*3577c6faSBram Moolenaar   let &rs          = rs
469*3577c6faSBram Moolenaar   let s:downerrors = s:downerrors + 1
470*3577c6faSBram Moolenaar"   call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">")
471*3577c6faSBram Moolenaar   echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">"
472*3577c6faSBram Moolenaar   let @a= rega
473*3577c6faSBram Moolenaar"  call Dret("GetOneScript : srch for /src_id/ failed")
474*3577c6faSBram Moolenaar   return
475*3577c6faSBram Moolenaar  endif
476*3577c6faSBram Moolenaar"  call Decho('found "src_id=" in description page')
477*3577c6faSBram Moolenaar
478*3577c6faSBram Moolenaar  let srcidpat   = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$'
479*3577c6faSBram Moolenaar  let latestsrcid= substitute(getline("."),srcidpat,'\1','')
480*3577c6faSBram Moolenaar  let sname      = substitute(getline("."),srcidpat,'\2','') " script name actually downloaded
481*3577c6faSBram Moolenaar"  call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> sname<".sname.">")
482*3577c6faSBram Moolenaar  silent q!
483*3577c6faSBram Moolenaar  call delete(tmpfile)
484*3577c6faSBram Moolenaar
485*3577c6faSBram Moolenaar  " convert the strings-of-numbers into numbers
486*3577c6faSBram Moolenaar  let srcid       = srcid       + 0
487*3577c6faSBram Moolenaar  let latestsrcid = latestsrcid + 0
488*3577c6faSBram Moolenaar"  call Decho("srcid=".srcid." latestsrcid=".latestsrcid." sname<".sname.">")
489*3577c6faSBram Moolenaar
490*3577c6faSBram Moolenaar  " has the plugin's most-recent srcid increased, which indicates
491*3577c6faSBram Moolenaar  " that it has been updated
492*3577c6faSBram Moolenaar  if latestsrcid > srcid
493*3577c6faSBram Moolenaar"   call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."]: need to update <".sname.">")
494*3577c6faSBram Moolenaar
495*3577c6faSBram Moolenaar   let s:downloads= s:downloads + 1
496*3577c6faSBram Moolenaar   if sname == bufname("%")
497*3577c6faSBram Moolenaar    " GetLatestVimScript has to be careful about downloading itself
498*3577c6faSBram Moolenaar    let sname= "NEW_".sname
499*3577c6faSBram Moolenaar   endif
500*3577c6faSBram Moolenaar
501*3577c6faSBram Moolenaar   " the plugin has been updated since we last obtained it, so download a new copy
502*3577c6faSBram Moolenaar"   call Decho("...downloading new <".sname.">")
503*3577c6faSBram Moolenaar   echomsg "...downloading new <".sname.">"
504*3577c6faSBram Moolenaar   if has("win32") || has("win16") || has("win95")
505*3577c6faSBram Moolenaar"    call Decho("new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid)."|q")
506*3577c6faSBram Moolenaar    new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid)|q
507*3577c6faSBram Moolenaar   else
508*3577c6faSBram Moolenaar"    call Decho("exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id='))
509*3577c6faSBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id=')
510*3577c6faSBram Moolenaar   endif
511*3577c6faSBram Moolenaar
512*3577c6faSBram Moolenaar   " AutoInstall: only if doautoinstall has been requested by the plugin itself
513*3577c6faSBram Moolenaar   if doautoinstall
514*3577c6faSBram Moolenaar"    call Decho("attempting to do autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname))
515*3577c6faSBram Moolenaar    if filereadable(sname)
516*3577c6faSBram Moolenaar     call Decho("exe silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." ".s:Escape(s:autoinstall))
517*3577c6faSBram Moolenaar     exe "silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." ".s:Escape(s:autoinstall)
518*3577c6faSBram Moolenaar     let curdir    = escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #")
519*3577c6faSBram Moolenaar     let installdir= curdir."/Installed"
520*3577c6faSBram Moolenaar     if !isdirectory(installdir)
521*3577c6faSBram Moolenaar      call mkdir(installdir)
522*3577c6faSBram Moolenaar     endif
523*3577c6faSBram Moolenaar"    call Decho("exe cd ".fnameescape(s:autoinstall))
524*3577c6faSBram Moolenaar     exe "cd ".fnameescape(s:autoinstall)
525*3577c6faSBram Moolenaar
526*3577c6faSBram Moolenaar     " decompress
527*3577c6faSBram Moolenaar     if sname =~ '\.bz2$'
528*3577c6faSBram Moolenaar"      call Decho("decompress: attempt to bunzip2 ".sname)
529*3577c6faSBram Moolenaar      exe "silent !bunzip2 ".s:Escape(sname)
530*3577c6faSBram Moolenaar      let sname= substitute(sname,'\.bz2$','','')
531*3577c6faSBram Moolenaar"      call Decho("decompress: new sname<".sname."> after bunzip2")
532*3577c6faSBram Moolenaar     elseif sname =~ '\.gz$'
533*3577c6faSBram Moolenaar"      call Decho("decompress: attempt to gunzip ".sname)
534*3577c6faSBram Moolenaar      exe "silent !gunzip ".s:Escape(sname)
535*3577c6faSBram Moolenaar      let sname= substitute(sname,'\.gz$','','')
536*3577c6faSBram Moolenaar"      call Decho("decompress: new sname<".sname."> after gunzip")
537*3577c6faSBram Moolenaar     endif
538*3577c6faSBram Moolenaar
539*3577c6faSBram Moolenaar     " distribute archive(.zip, .tar, .vba) contents
540*3577c6faSBram Moolenaar     if sname =~ '\.zip$'
541*3577c6faSBram Moolenaar"      call Decho("dearchive: attempt to unzip ".sname)
542*3577c6faSBram Moolenaar      exe "silent !unzip -o ".s:Escape(sname)
543*3577c6faSBram Moolenaar     elseif sname =~ '\.tar$'
544*3577c6faSBram Moolenaar"      call Decho("dearchive: attempt to untar ".sname)
545*3577c6faSBram Moolenaar      exe "silent !tar -xvf ".s:Escape(sname)
546*3577c6faSBram Moolenaar     elseif sname =~ '\.vba$'
547*3577c6faSBram Moolenaar"      call Decho("dearchive: attempt to handle a vimball: ".sname)
548*3577c6faSBram Moolenaar      silent 1split
549*3577c6faSBram Moolenaar      exe "silent e ".fnameescape(sname)
550*3577c6faSBram Moolenaar      silent so %
551*3577c6faSBram Moolenaar      silent q
552*3577c6faSBram Moolenaar     endif
553*3577c6faSBram Moolenaar
554*3577c6faSBram Moolenaar     if sname =~ '.vim$'
555*3577c6faSBram Moolenaar"      call Decho("dearchive: attempt to simply move ".sname." to plugin")
556*3577c6faSBram Moolenaar      exe "silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." plugin"
557*3577c6faSBram Moolenaar     else
558*3577c6faSBram Moolenaar"      call Decho("dearchive: move <".sname."> to installdir<".installdir.">")
559*3577c6faSBram Moolenaar      exe "silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." ".installdir
560*3577c6faSBram Moolenaar     endif
561*3577c6faSBram Moolenaar
562*3577c6faSBram Moolenaar     " helptags step
563*3577c6faSBram Moolenaar     let docdir= substitute(&rtp,',.*','','e')."/doc"
564*3577c6faSBram Moolenaar"     call Decho("helptags: docdir<".docdir.">")
565*3577c6faSBram Moolenaar     exe "helptags ".fnameescape(docdir)
566*3577c6faSBram Moolenaar     exe "cd ".fnameescape(curdir)
567*3577c6faSBram Moolenaar    endif
568*3577c6faSBram Moolenaar    if fname !~ ':AutoInstall:'
569*3577c6faSBram Moolenaar     let modline=scriptid." ".latestsrcid." :AutoInstall: ".fname.cmmnt
570*3577c6faSBram Moolenaar    else
571*3577c6faSBram Moolenaar     let modline=scriptid." ".latestsrcid." ".fname.cmmnt
572*3577c6faSBram Moolenaar    endif
573*3577c6faSBram Moolenaar   else
574*3577c6faSBram Moolenaar    let modline=scriptid." ".latestsrcid." ".fname.cmmnt
575*3577c6faSBram Moolenaar   endif
576*3577c6faSBram Moolenaar
577*3577c6faSBram Moolenaar   " update the data in the <GetLatestVimScripts.dat> file
578*3577c6faSBram Moolenaar   call setline(line("."),modline)
579*3577c6faSBram Moolenaar"   call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">")
580*3577c6faSBram Moolenaar"  else " Decho
581*3577c6faSBram Moolenaar"   call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."], no need to update")
582*3577c6faSBram Moolenaar  endif
583*3577c6faSBram Moolenaar
584*3577c6faSBram Moolenaar " restore options
585*3577c6faSBram Moolenaar  let &t_ti = t_ti
586*3577c6faSBram Moolenaar  let &t_te = t_te
587*3577c6faSBram Moolenaar  let &rs   = rs
588*3577c6faSBram Moolenaar  let @a    = rega
589*3577c6faSBram Moolenaar"  call Dredir("BUFFER TEST (GetOneScript)","ls!")
590*3577c6faSBram Moolenaar
591*3577c6faSBram Moolenaar"  call Dret("GetOneScript")
592*3577c6faSBram Moolenaarendfun
593*3577c6faSBram Moolenaar
594*3577c6faSBram Moolenaar" ---------------------------------------------------------------------
595*3577c6faSBram Moolenaar" s:Escape: makes a string safe&suitable for the shell {{{2
596*3577c6faSBram Moolenaarfun! s:Escape(name)
597*3577c6faSBram Moolenaar"  call Dfunc("s:Escape(name<".a:name.">)")
598*3577c6faSBram Moolenaar  if exists("*shellescape")
599*3577c6faSBram Moolenaar   " shellescape() was added by patch 7.0.111
600*3577c6faSBram Moolenaar   let name= shellescape(a:name)
601*3577c6faSBram Moolenaar  else
602*3577c6faSBram Moolenaar   let name= g:getscript_shq . a:name . g:getscript_shq
603*3577c6faSBram Moolenaar  endif
604*3577c6faSBram Moolenaar"  call Dret("s:Escape ".name)
605*3577c6faSBram Moolenaar  return name
606*3577c6faSBram Moolenaarendfun
607*3577c6faSBram Moolenaar
608*3577c6faSBram Moolenaar" ---------------------------------------------------------------------
6099964e468SBram Moolenaar" Restore Options: {{{1
6109964e468SBram Moolenaarlet &cpo= s:keepcpo
611*3577c6faSBram Moolenaarunlet s:keepcpo
6129964e468SBram Moolenaar
613*3577c6faSBram Moolenaar" ---------------------------------------------------------------------
614*3577c6faSBram Moolenaar"  Modelines: {{{1
6159964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap
616