19964e468SBram Moolenaar" ---------------------------------------------------------------------
29964e468SBram Moolenaar" getscript.vim
39964e468SBram Moolenaar"  Author:	Charles E. Campbell, Jr.
4*82038d73SBram Moolenaar"  Date:	May 05, 2007
5*82038d73SBram Moolenaar"  Version:	25
69964e468SBram Moolenaar"  Installing:	:help glvs-install
79964e468SBram Moolenaar"  Usage:	:help glvs
89964e468SBram Moolenaar"
99964e468SBram Moolenaar" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim
109964e468SBram Moolenaar" ---------------------------------------------------------------------
119964e468SBram Moolenaar" Initialization:	{{{1
129964e468SBram Moolenaar" if you're sourcing this file, surely you can't be
139964e468SBram Moolenaar" expecting vim to be in its vi-compatible mode
149964e468SBram Moolenaarif &cp
159964e468SBram Moolenaar echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)"
169964e468SBram Moolenaar finish
179964e468SBram Moolenaarendif
189964e468SBram Moolenaarlet s:keepcpo = &cpo
199964e468SBram Moolenaarset cpo&vim
20*82038d73SBram Moolenaar"DechoTabOn
219964e468SBram Moolenaar
229964e468SBram Moolenaarif exists("g:loaded_getscript")
239964e468SBram Moolenaar finish
249964e468SBram Moolenaarendif
25*82038d73SBram Moolenaarlet g:loaded_getscript= "v25"
269964e468SBram Moolenaar
279964e468SBram Moolenaar" ---------------------------------------------------------------------
289964e468SBram Moolenaar"  Global Variables: {{{1
299964e468SBram Moolenaar" allow user to change the command for obtaining scripts (does fetch work?)
309964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget")
319964e468SBram Moolenaar if executable("wget")
329964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "wget"
339964e468SBram Moolenaar elseif executable("curl")
349964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "curl"
359964e468SBram Moolenaar else
369964e468SBram Moolenaar  let g:GetLatestVimScripts_wget    = 'echo "GetLatestVimScripts needs wget or curl"'
379964e468SBram Moolenaar  let g:GetLatestVimScripts_options = ""
389964e468SBram Moolenaar endif
399964e468SBram Moolenaarendif
409964e468SBram Moolenaar
419964e468SBram Moolenaar" options that wget and curl require:
429964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options")
439964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget"
449964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-q -O"
459964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl"
469964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-s -O"
479964e468SBram Moolenaar else
489964e468SBram Moolenaar  let g:GetLatestVimScripts_options= ""
499964e468SBram Moolenaar endif
509964e468SBram Moolenaarendif
519964e468SBram Moolenaar
529964e468SBram Moolenaar" by default, allow autoinstall lines to work
539964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall")
549964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1
559964e468SBram Moolenaarendif
569964e468SBram Moolenaar
579964e468SBram Moolenaar"" For debugging:
589964e468SBram Moolenaar"let g:GetLatestVimScripts_wget    = "echo"
599964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options"
609964e468SBram Moolenaar
619964e468SBram Moolenaar" ---------------------------------------------------------------------
629964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1
639964e468SBram Moolenaarlet s:autoinstall= ""
649964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall
659964e468SBram Moolenaar
669964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash"
679964e468SBram Moolenaar  " windows (but not cygwin/bash)
689964e468SBram Moolenaar  let s:dotvim= "vimfiles"
699964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
709964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "ren"
719964e468SBram Moolenaar  endif
729964e468SBram Moolenaar
739964e468SBram Moolenaar else
749964e468SBram Moolenaar  " unix
759964e468SBram Moolenaar  let s:dotvim= ".vim"
769964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
779964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "mv"
789964e468SBram Moolenaar  endif
799964e468SBram Moolenaar endif
809964e468SBram Moolenaar
819964e468SBram Moolenaar if exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim)
829964e468SBram Moolenaar  let s:autoinstall= $HOME."/".s:dotvim
839964e468SBram Moolenaar endif
849964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">")
859964e468SBram Moolenaar"else "Decho
869964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled")
879964e468SBram Moolenaarendif
889964e468SBram Moolenaar
899964e468SBram Moolenaar" ---------------------------------------------------------------------
909964e468SBram Moolenaar"  Public Interface: {{{1
919964e468SBram Moolenaarcom!        -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts()
929964e468SBram Moolenaarcom!        -nargs=0 GetScript           call getscript#GetLatestVimScripts()
939964e468SBram Moolenaarsilent! com -nargs=0 GLVS                call getscript#GetLatestVimScripts()
949964e468SBram Moolenaar
959964e468SBram Moolenaar" ---------------------------------------------------------------------
969964e468SBram Moolenaar"  GetOneScript: (Get Latest Vim Script) this function operates {{{1
979964e468SBram Moolenaar"    on the current line, interpreting two numbers and text as
989964e468SBram Moolenaar"    ScriptID, SourceID, and Filename.
999964e468SBram Moolenaar"    It downloads any scripts that have newer versions from vim.sf.net.
1009964e468SBram Moolenaarfun! s:GetOneScript(...)
1019964e468SBram Moolenaar"   call Dfunc("GetOneScript()")
1029964e468SBram Moolenaar
1039964e468SBram Moolenaar " set options to allow progress to be shown on screen
1049964e468SBram Moolenaar  let t_ti= &t_ti
1059964e468SBram Moolenaar  let t_te= &t_te
1069964e468SBram Moolenaar  let rs  = &rs
1079964e468SBram Moolenaar  set t_ti= t_te= nors
1089964e468SBram Moolenaar
1099964e468SBram Moolenaar " put current line on top-of-screen and interpret it into
1109964e468SBram Moolenaar " a      script identifer  : used to obtain webpage
1119964e468SBram Moolenaar "        source identifier : used to identify current version
1129964e468SBram Moolenaar " and an associated comment: used to report on what's being considered
1139964e468SBram Moolenaar  if a:0 >= 3
1149964e468SBram Moolenaar   let scriptid = a:1
1159964e468SBram Moolenaar   let srcid    = a:2
1169964e468SBram Moolenaar   let fname    = a:3
1179964e468SBram Moolenaar   let cmmnt    = ""
1189964e468SBram Moolenaar"   call Decho("scriptid<".scriptid.">")
1199964e468SBram Moolenaar"   call Decho("srcid   <".srcid.">")
1209964e468SBram Moolenaar"   call Decho("fname   <".fname.">")
1219964e468SBram Moolenaar  else
1229964e468SBram Moolenaar   let curline  = getline(".")
1239964e468SBram Moolenaar   if curline =~ '^\s*#'
1249964e468SBram Moolenaar"    call Dret("GetOneScript : skipping a pure comment line")
1259964e468SBram Moolenaar    return
1269964e468SBram Moolenaar   endif
1279964e468SBram Moolenaar   let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$'
1289964e468SBram Moolenaar   try
1299964e468SBram Moolenaar    let scriptid = substitute(curline,parsepat,'\1','e')
1309964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1319964e468SBram Moolenaar    let scriptid= 0
1329964e468SBram Moolenaar   endtry
1339964e468SBram Moolenaar   try
1349964e468SBram Moolenaar    let srcid    = substitute(curline,parsepat,'\2','e')
1359964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1369964e468SBram Moolenaar    let srcid= 0
1379964e468SBram Moolenaar   endtry
1389964e468SBram Moolenaar   try
1399964e468SBram Moolenaar    let fname= substitute(curline,parsepat,'\3','e')
1409964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1419964e468SBram Moolenaar    let fname= ""
1429964e468SBram Moolenaar   endtry
1439964e468SBram Moolenaar   try
1449964e468SBram Moolenaar    let cmmnt= substitute(curline,parsepat,'\4','e')
1459964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1469964e468SBram Moolenaar    let cmmnt= ""
1479964e468SBram Moolenaar   endtry
1489964e468SBram Moolenaar"   call Decho("curline <".curline.">")
1499964e468SBram Moolenaar"   call Decho("parsepat<".parsepat.">")
1509964e468SBram Moolenaar"   call Decho("scriptid<".scriptid.">")
1519964e468SBram Moolenaar"   call Decho("srcid   <".srcid.">")
1529964e468SBram Moolenaar"   call Decho("fname   <".fname.">")
1539964e468SBram Moolenaar  endif
1549964e468SBram Moolenaar
1559964e468SBram Moolenaar  if scriptid == 0 || srcid == 0
1569964e468SBram Moolenaar   " When looking for :AutoInstall: lines, skip scripts that
1579964e468SBram Moolenaar   " have  0 0 scriptname
1589964e468SBram Moolenaar"   call Dret("GetOneScript : skipping a scriptid==srcid==0 line")
1599964e468SBram Moolenaar   return
1609964e468SBram Moolenaar  endif
1619964e468SBram Moolenaar
1629964e468SBram Moolenaar  let doautoinstall= 0
1639964e468SBram Moolenaar  if fname =~ ":AutoInstall:"
1649964e468SBram Moolenaar"   call Decho("fname<".fname."> has :AutoInstall:...")
1659964e468SBram Moolenaar   let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','')
1669964e468SBram Moolenaar"   call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall)
1679964e468SBram Moolenaar   if s:autoinstall != ""
1689964e468SBram Moolenaar    let doautoinstall = g:GetLatestVimScripts_allowautoinstall
1699964e468SBram Moolenaar   endif
1709964e468SBram Moolenaar  else
1719964e468SBram Moolenaar   let aicmmnt= fname
1729964e468SBram Moolenaar  endif
1739964e468SBram Moolenaar"  call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall)
1749964e468SBram Moolenaar
1759964e468SBram Moolenaar  exe "norm z\<CR>"
1769964e468SBram Moolenaar  redraw!
1779964e468SBram Moolenaar"  call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid)
1789964e468SBram Moolenaar  echomsg 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid
1799964e468SBram Moolenaar
1809964e468SBram Moolenaar  " grab a copy of the plugin's vim.sf.net webpage
1819964e468SBram Moolenaar  let scriptaddr = 'http://vim.sf.net/script.php?script_id='.scriptid
1829964e468SBram Moolenaar  let tmpfile    = tempname()
1839964e468SBram Moolenaar  let v:errmsg   = ""
1849964e468SBram Moolenaar
1859964e468SBram Moolenaar  " make three tries at downloading the description
1869964e468SBram Moolenaar  let itry= 1
1879964e468SBram Moolenaar  while itry <= 3
1889964e468SBram Moolenaar"   	call Decho("try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr)
1899964e468SBram Moolenaar  	if has("win32") || has("win16") || has("win95")
1909964e468SBram Moolenaar"     call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"')
1919964e468SBram Moolenaar     exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"'
1929964e468SBram Moolenaar	else
1939964e468SBram Moolenaar"     call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'")
1949964e468SBram Moolenaar     exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'"
1959964e468SBram Moolenaar	endif
1969964e468SBram Moolenaar	if itry == 1
1979964e468SBram Moolenaar    exe "silent vsplit ".tmpfile
1989964e468SBram Moolenaar	else
1999964e468SBram Moolenaar	 silent! e %
2009964e468SBram Moolenaar	endif
2019964e468SBram Moolenaar
2029964e468SBram Moolenaar   " find the latest source-id in the plugin's webpage
2039964e468SBram Moolenaar   silent! 1
2049964e468SBram Moolenaar   let findpkg= search('Click on the package to download','W')
2059964e468SBram Moolenaar   if findpkg > 0
2069964e468SBram Moolenaar    break
2079964e468SBram Moolenaar   endif
2089964e468SBram Moolenaar   let itry= itry + 1
2099964e468SBram Moolenaar  endwhile
2109964e468SBram Moolenaar"  call Decho(" --- end downloading tries while loop --- itry=".itry)
2119964e468SBram Moolenaar
2129964e468SBram Moolenaar  " testing: did finding /Click on the package.../ fail?
2139964e468SBram Moolenaar  if findpkg == 0 || itry >= 4
2149964e468SBram Moolenaar    silent q!
2159964e468SBram Moolenaar    call delete(tmpfile)
2169964e468SBram Moolenaar   " restore options
2179964e468SBram Moolenaar	let &t_ti        = t_ti
2189964e468SBram Moolenaar	let &t_te        = t_te
2199964e468SBram Moolenaar	let &rs          = rs
2209964e468SBram Moolenaar	let s:downerrors = s:downerrors + 1
2219964e468SBram Moolenaar"  	call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">")
2229964e468SBram Moolenaar  	echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">"
2239964e468SBram Moolenaar"	call Dret("GetOneScript : srch for /Click on the package/ failed")
2249964e468SBram Moolenaar  	return
2259964e468SBram Moolenaar  endif
2269964e468SBram Moolenaar"  call Decho('found "Click on the package to download"')
2279964e468SBram Moolenaar
2289964e468SBram Moolenaar  let findsrcid= search('src_id=','W')
2299964e468SBram Moolenaar  if findsrcid == 0
2309964e468SBram Moolenaar    silent q!
2319964e468SBram Moolenaar    call delete(tmpfile)
2329964e468SBram Moolenaar   " restore options
2339964e468SBram Moolenaar	let &t_ti        = t_ti
2349964e468SBram Moolenaar	let &t_te        = t_te
2359964e468SBram Moolenaar	let &rs          = rs
2369964e468SBram Moolenaar	let s:downerrors = s:downerrors + 1
2379964e468SBram Moolenaar"  	call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">")
2389964e468SBram Moolenaar  	echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">"
2399964e468SBram Moolenaar"	call Dret("GetOneScript : srch for /src_id/ failed")
2409964e468SBram Moolenaar  	return
2419964e468SBram Moolenaar  endif
2429964e468SBram Moolenaar"  call Decho('found "src_id=" in description page')
2439964e468SBram Moolenaar
2449964e468SBram Moolenaar  let srcidpat   = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$'
2459964e468SBram Moolenaar  let latestsrcid= substitute(getline("."),srcidpat,'\1','')
2469964e468SBram Moolenaar  let fname      = substitute(getline("."),srcidpat,'\2','')
2479964e468SBram Moolenaar"  call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> fname<".fname.">")
2489964e468SBram Moolenaar  silent q!
2499964e468SBram Moolenaar  call delete(tmpfile)
2509964e468SBram Moolenaar
2519964e468SBram Moolenaar  " convert the strings-of-numbers into numbers
2529964e468SBram Moolenaar  let srcid       = srcid       + 0
2539964e468SBram Moolenaar  let latestsrcid = latestsrcid + 0
2549964e468SBram Moolenaar"   call Decho("srcid=".srcid." latestsrcid=".latestsrcid." fname<".fname.">")
2559964e468SBram Moolenaar
2569964e468SBram Moolenaar  " has the plugin's most-recent srcid increased, which indicates
2579964e468SBram Moolenaar  " that it has been updated
2589964e468SBram Moolenaar  if latestsrcid > srcid
2599964e468SBram Moolenaar   let s:downloads= s:downloads + 1
2609964e468SBram Moolenaar   if fname == bufname("%")
2619964e468SBram Moolenaar    " GetLatestVimScript has to be careful about downloading itself
2629964e468SBram Moolenaar    let fname= "NEW_".fname
2639964e468SBram Moolenaar   endif
2649964e468SBram Moolenaar
2659964e468SBram Moolenaar   " the plugin has been updated since we last obtained it, so download a new copy
2669964e468SBram Moolenaar"   call Decho("...downloading new <".fname.">")
2679964e468SBram Moolenaar   echomsg "...downloading new <".fname.">"
2689964e468SBram Moolenaar   if has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")
2699964e468SBram Moolenaar"    call Decho("windows: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"')
2709964e468SBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"'
2719964e468SBram Moolenaar   else
2729964e468SBram Moolenaar"    call Decho("unix: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'")
2739964e468SBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'"
2749964e468SBram Moolenaar   endif
2759964e468SBram Moolenaar
2769964e468SBram Moolenaar   " AutoInstall: only if doautoinstall is so indicating
2779964e468SBram Moolenaar   if doautoinstall
2789964e468SBram Moolenaar"   	call Decho("attempting to do autoinstall: getcwd<".getcwd()."> filereadable(".fname.")=".filereadable(fname))
2799964e468SBram Moolenaar	if filereadable(fname)
2809964e468SBram Moolenaar"	 call Decho("move <".fname."> to ".s:autoinstall)
2819964e468SBram Moolenaar   	 exe "silent !".g:GetLatestVimScripts_mv." ".fname." ".s:autoinstall
2829964e468SBram Moolenaar	 let curdir= escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #")
283*82038d73SBram Moolenaar"	 call Decho("exe cd ".s:autoinstall)
2849964e468SBram Moolenaar	 exe "cd ".s:autoinstall
285*82038d73SBram Moolenaar
286*82038d73SBram Moolenaar	 " decompress
2879964e468SBram Moolenaar	 if fname =~ '\.bz2$'
2889964e468SBram Moolenaar"	  call Decho("attempt to bunzip2 ".fname)
2899964e468SBram Moolenaar	  exe "silent !bunzip2 ".fname
2909964e468SBram Moolenaar	  let fname= substitute(fname,'\.bz2$','','')
291*82038d73SBram Moolenaar"	  call Decho("new fname<".fname."> after bunzip2")
2929964e468SBram Moolenaar	 elseif fname =~ '\.gz$'
2939964e468SBram Moolenaar"	  call Decho("attempt to gunzip ".fname)
2949964e468SBram Moolenaar	  exe "silent !gunzip ".fname
2959964e468SBram Moolenaar	  let fname= substitute(fname,'\.gz$','','')
296*82038d73SBram Moolenaar"	  call Decho("new fname<".fname."> after gunzip")
2979964e468SBram Moolenaar	 endif
298*82038d73SBram Moolenaar
299*82038d73SBram Moolenaar	 " distribute archive(.zip, .tar, .vba) contents
3009964e468SBram Moolenaar	 if fname =~ '\.zip$'
3019964e468SBram Moolenaar"	  call Decho("attempt to unzip ".fname)
3029964e468SBram Moolenaar	  exe "silent !unzip -o ".fname
3039964e468SBram Moolenaar	 elseif fname =~ '\.tar$'
3049964e468SBram Moolenaar"	  call Decho("attempt to untar ".fname)
3059964e468SBram Moolenaar	  exe "silent !tar -xvf ".fname
3069964e468SBram Moolenaar	 elseif fname =~ '\.vba$'
3079964e468SBram Moolenaar"	  call Decho("attempt to handle a vimball: ".fname)
3089964e468SBram Moolenaar          1split
3099964e468SBram Moolenaar	  exe "e ".fname
3109964e468SBram Moolenaar	  so %
3119964e468SBram Moolenaar	  q
3129964e468SBram Moolenaar	 endif
313*82038d73SBram Moolenaar
3149964e468SBram Moolenaar	 if fname =~ '.vim$'
3159964e468SBram Moolenaar"	  call Decho("attempt to simply move ".fname." to plugin")
3169964e468SBram Moolenaar	  exe "silent !".g:GetLatestVimScripts_mv." ".fname." plugin"
3179964e468SBram Moolenaar	 endif
318*82038d73SBram Moolenaar
319*82038d73SBram Moolenaar	 " helptags step
3209964e468SBram Moolenaar	 let docdir= substitute(&rtp,',.*','','e')."/doc"
3219964e468SBram Moolenaar"	 call Decho("helptags docdir<".docdir.">")
3229964e468SBram Moolenaar	 exe "helptags ".docdir
3239964e468SBram Moolenaar	 exe "cd ".curdir
3249964e468SBram Moolenaar	endif
3259964e468SBram Moolenaar   endif
3269964e468SBram Moolenaar
3279964e468SBram Moolenaar   " update the data in the <GetLatestVimScripts.dat> file
3289964e468SBram Moolenaar   let modline=scriptid." ".latestsrcid." ".fname.cmmnt
3299964e468SBram Moolenaar   call setline(line("."),modline)
330*82038d73SBram Moolenaar"   call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">")
3319964e468SBram Moolenaar  endif
3329964e468SBram Moolenaar
3339964e468SBram Moolenaar " restore options
3349964e468SBram Moolenaar  let &t_ti= t_ti
3359964e468SBram Moolenaar  let &t_te= t_te
3369964e468SBram Moolenaar  let &rs  = rs
3379964e468SBram Moolenaar
3389964e468SBram Moolenaar"  call Dret("GetOneScript")
3399964e468SBram Moolenaarendfun
3409964e468SBram Moolenaar
3419964e468SBram Moolenaar" ---------------------------------------------------------------------
3429964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1
3439964e468SBram Moolenaar"                      scripts based on the list in
3449964e468SBram Moolenaar"   (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat
3459964e468SBram Moolenaarfun! getscript#GetLatestVimScripts()
3469964e468SBram Moolenaar"  call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">")
3479964e468SBram Moolenaar
3489964e468SBram Moolenaar" insure that wget is executable
3499964e468SBram Moolenaar  if executable(g:GetLatestVimScripts_wget) != 1
3509964e468SBram Moolenaar   echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system"
3519964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : wget not executable/availble")
3529964e468SBram Moolenaar   return
3539964e468SBram Moolenaar  endif
3549964e468SBram Moolenaar
3559964e468SBram Moolenaar  " Find the .../GetLatest subdirectory under the runtimepath
3569964e468SBram Moolenaar  for datadir in split(&rtp,',') + ['']
3579964e468SBram Moolenaar   if isdirectory(datadir."/GetLatest")
3589964e468SBram Moolenaar"    call Decho("found directory<".datadir.">")
3599964e468SBram Moolenaar    let datadir= datadir . "/GetLatest"
3609964e468SBram Moolenaar    break
3619964e468SBram Moolenaar   endif
3629964e468SBram Moolenaar   if filereadable(datadir."GetLatestVimScripts.dat")
3639964e468SBram Moolenaar"    call Decho("found ".datadir."/GetLatestVimScripts.dat")
3649964e468SBram Moolenaar    break
3659964e468SBram Moolenaar   endif
3669964e468SBram Moolenaar  endfor
367*82038d73SBram Moolenaar
3689964e468SBram Moolenaar  " Sanity checks: readability and writability
3699964e468SBram Moolenaar  if datadir == ""
3709964e468SBram Moolenaar   echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install'
3719964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory")
3729964e468SBram Moolenaar   return
3739964e468SBram Moolenaar  endif
3749964e468SBram Moolenaar
3759964e468SBram Moolenaar  if filewritable(datadir) != 2
3769964e468SBram Moolenaar   echoerr "(getLatestVimScripts) Your ".datadir." isn't writable"
3779964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable directory<".datadir.">")
3789964e468SBram Moolenaar   return
3799964e468SBram Moolenaar  endif
3809964e468SBram Moolenaar  let datafile= datadir."/GetLatestVimScripts.dat"
3819964e468SBram Moolenaar  if !filereadable(datafile)
3829964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't readable"
3839964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">")
3849964e468SBram Moolenaar   return
3859964e468SBram Moolenaar  endif
3869964e468SBram Moolenaar  if !filewritable(datafile)
3879964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't writable"
3889964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">")
3899964e468SBram Moolenaar   return
3909964e468SBram Moolenaar  endif
3919964e468SBram Moolenaar"  call Decho("datadir  <".datadir.">")
3929964e468SBram Moolenaar"  call Decho("datafile <".datafile.">")
3939964e468SBram Moolenaar
3949964e468SBram Moolenaar  " don't let any events interfere (like winmanager's, taglist's, etc)
3959964e468SBram Moolenaar  let eikeep= &ei
3969964e468SBram Moolenaar  set ei=all
3979964e468SBram Moolenaar
3989964e468SBram Moolenaar  " record current directory, change to datadir, open split window with
3999964e468SBram Moolenaar  " datafile
4009964e468SBram Moolenaar  let origdir= getcwd()
4019964e468SBram Moolenaar  exe "cd ".escape(substitute(datadir,'\','/','ge'),"|[]*'\" #")
4029964e468SBram Moolenaar  split
4039964e468SBram Moolenaar  exe "e ".escape(substitute(datafile,'\','/','ge'),"|[]*'\" #")
4049964e468SBram Moolenaar  res 1000
4059964e468SBram Moolenaar  let s:downloads = 0
4069964e468SBram Moolenaar  let s:downerrors= 0
4079964e468SBram Moolenaar
4089964e468SBram Moolenaar  " Check on dependencies mentioned in plugins
4099964e468SBram Moolenaar"  call Decho(" ")
4109964e468SBram Moolenaar"  call Decho("searching plugins for GetLatestVimScripts dependencies")
4119964e468SBram Moolenaar  let lastline    = line("$")
412*82038d73SBram Moolenaar"  call Decho("lastline#".lastline)
413*82038d73SBram Moolenaar  let plugins     = split(globpath(&rtp,"plugin/*.vim"))
4149964e468SBram Moolenaar  let foundscript = 0
415*82038d73SBram Moolenaar  let firstdir= ""
4169964e468SBram Moolenaar
417*82038d73SBram Moolenaar  for plugin in plugins
418*82038d73SBram Moolenaar
419*82038d73SBram Moolenaar   " don't process plugins in system directories
420*82038d73SBram Moolenaar   if firstdir == ""
421*82038d73SBram Moolenaar    let firstdir= substitute(plugin,'[/\\][^/\\]\+$','','')
422*82038d73SBram Moolenaar"    call Decho("firstdir<".firstdir.">")
423*82038d73SBram Moolenaar   else
424*82038d73SBram Moolenaar    let curdir= substitute(plugin,'[/\\][^/\\]\+$','','')
425*82038d73SBram Moolenaar"    call Decho("curdir<".curdir.">")
426*82038d73SBram Moolenaar    if curdir != firstdir
427*82038d73SBram Moolenaar     break
428*82038d73SBram Moolenaar    endif
429*82038d73SBram Moolenaar   endif
430*82038d73SBram Moolenaar
431*82038d73SBram Moolenaar   " read plugin in
4329964e468SBram Moolenaar   $
433*82038d73SBram Moolenaar"   call Decho(" ")
4349964e468SBram Moolenaar"   call Decho(".dependency checking<".plugin."> line$=".line("$"))
4359964e468SBram Moolenaar   exe "silent r ".plugin
436*82038d73SBram Moolenaar
4379964e468SBram Moolenaar   while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0
4389964e468SBram Moolenaar    let newscript= substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e')
4399964e468SBram Moolenaar    let llp1     = lastline+1
440*82038d73SBram Moolenaar"    call Decho("..newscript<".newscript.">")
4419964e468SBram Moolenaar
442*82038d73SBram Moolenaar    " don't process ""GetLatestVimScripts lines
4439964e468SBram Moolenaar    if newscript !~ '^"'
4449964e468SBram Moolenaar     " found a "GetLatestVimScripts: # #" line in the script; check if its already in the datafile
4459964e468SBram Moolenaar     let curline     = line(".")
4469964e468SBram Moolenaar     let noai_script = substitute(newscript,'\s*:AutoInstall:\s*','','e')
4479964e468SBram Moolenaar     exe llp1
4489964e468SBram Moolenaar     let srchline    = search('\<'.noai_script.'\>','bW')
449*82038d73SBram Moolenaar"     call Decho("..noai_script<".noai_script."> srch=".srchline."curline#".line(".")." lastline#".lastline)
4509964e468SBram Moolenaar
4519964e468SBram Moolenaar     if srchline == 0
4529964e468SBram Moolenaar      " found a new script to permanently include in the datafile
4539964e468SBram Moolenaar      let keep_rega   = @a
4549964e468SBram Moolenaar      let @a          = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','')
4559964e468SBram Moolenaar      exe lastline."put a"
4569964e468SBram Moolenaar      echomsg "Appending <".@a."> to ".datafile." for ".newscript
4579964e468SBram Moolenaar"      call Decho("..APPEND (".noai_script.")<".@a."> to GetLatestVimScripts.dat")
4589964e468SBram Moolenaar      let @a          = keep_rega
4599964e468SBram Moolenaar      let lastline    = llp1
4609964e468SBram Moolenaar      let curline     = curline     + 1
4619964e468SBram Moolenaar      let foundscript = foundscript + 1
4629964e468SBram Moolenaar"     else	" Decho
4639964e468SBram Moolenaar"      call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")")
4649964e468SBram Moolenaar     endif
4659964e468SBram Moolenaar
4669964e468SBram Moolenaar     let curline = curline + 1
4679964e468SBram Moolenaar     exe curline
4689964e468SBram Moolenaar    endif
4699964e468SBram Moolenaar   endwhile
470*82038d73SBram Moolenaar
4719964e468SBram Moolenaar   let llp1= lastline + 1
4729964e468SBram Moolenaar"   call Decho(".deleting lines: ".llp1.",$d")
4739964e468SBram Moolenaar   exe "silent! ".llp1.",$d"
474*82038d73SBram Moolenaar  endfor
475*82038d73SBram Moolenaar"  call Decho("--- end dependency checking loop ---  foundscript=".foundscript)
476*82038d73SBram Moolenaar"  call Decho(" ")
4779964e468SBram Moolenaar
4789964e468SBram Moolenaar  if foundscript == 0
4799964e468SBram Moolenaar   set nomod
4809964e468SBram Moolenaar  endif
4819964e468SBram Moolenaar
4829964e468SBram Moolenaar  " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat
483*82038d73SBram Moolenaar"  call Decho("begin: checking out-of-date scripts using datafile<".datafile.">")
4849964e468SBram Moolenaar  set lz
4859964e468SBram Moolenaar  1
486*82038d73SBram Moolenaar"  /^-----/,$g/^\s*\d/call Decho(getline("."))
487*82038d73SBram Moolenaar  1
488*82038d73SBram Moolenaar  /^-----/,$g/^\s*\d/call s:GetOneScript()
489*82038d73SBram Moolenaar"  call Decho("--- end out-of-date checking --- ")
4909964e468SBram Moolenaar
4919964e468SBram Moolenaar  " Final report (an echomsg)
4929964e468SBram Moolenaar  try
4939964e468SBram Moolenaar   silent! ?^-------?
4949964e468SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E114/
4959964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : nothing done!")
4969964e468SBram Moolenaar   return
4979964e468SBram Moolenaar  endtry
4989964e468SBram Moolenaar  exe "norm! kz\<CR>"
4999964e468SBram Moolenaar  redraw!
5009964e468SBram Moolenaar  let s:msg = ""
5019964e468SBram Moolenaar  if s:downloads == 1
5029964e468SBram Moolenaar  let s:msg = "Downloaded one updated script to <".datadir.">"
5039964e468SBram Moolenaar  elseif s:downloads == 2
5049964e468SBram Moolenaar   let s:msg= "Downloaded two updated scripts to <".datadir.">"
5059964e468SBram Moolenaar  elseif s:downloads > 1
5069964e468SBram Moolenaar   let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">"
5079964e468SBram Moolenaar  else
5089964e468SBram Moolenaar   let s:msg= "Everything was already current"
5099964e468SBram Moolenaar  endif
5109964e468SBram Moolenaar  if s:downerrors > 0
5119964e468SBram Moolenaar   let s:msg= s:msg." (".s:downerrors." downloading errors)"
5129964e468SBram Moolenaar  endif
5139964e468SBram Moolenaar  echomsg s:msg
5149964e468SBram Moolenaar  " save the file
5159964e468SBram Moolenaar  if &mod
5169964e468SBram Moolenaar   silent! w!
5179964e468SBram Moolenaar  endif
5189964e468SBram Moolenaar  q
5199964e468SBram Moolenaar
5209964e468SBram Moolenaar  " restore events and current directory
5219964e468SBram Moolenaar  exe "cd ".escape(substitute(origdir,'\','/','ge'),"|[]*'\" #")
5229964e468SBram Moolenaar  let &ei= eikeep
5239964e468SBram Moolenaar  set nolz
5249964e468SBram Moolenaar"  call Dret("GetLatestVimScripts : did ".s:downloads." downloads")
5259964e468SBram Moolenaarendfun
5269964e468SBram Moolenaar" ---------------------------------------------------------------------
5279964e468SBram Moolenaar
5289964e468SBram Moolenaar" Restore Options: {{{1
5299964e468SBram Moolenaarlet &cpo= s:keepcpo
5309964e468SBram Moolenaar
5319964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap
532