19964e468SBram Moolenaar" ---------------------------------------------------------------------
29964e468SBram Moolenaar" getscript.vim
39964e468SBram Moolenaar"  Author:	Charles E. Campbell, Jr.
4*9e368dbaSBram Moolenaar"  Date:	May 11, 2007
5*9e368dbaSBram Moolenaar"  Version:	27
69964e468SBram Moolenaar"  Installing:	:help glvs-install
79964e468SBram Moolenaar"  Usage:	:help glvs
89964e468SBram Moolenaar"
99964e468SBram Moolenaar" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim
10*9e368dbaSBram 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
149964e468SBram 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*9e368dbaSBram Moolenaarlet g:loaded_getscript= "v27"
279964e468SBram Moolenaar
289964e468SBram Moolenaar" ---------------------------------------------------------------------
299964e468SBram Moolenaar"  Global Variables: {{{1
309964e468SBram Moolenaar" allow user to change the command for obtaining scripts (does fetch work?)
319964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget")
329964e468SBram Moolenaar if executable("wget")
339964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "wget"
349964e468SBram Moolenaar elseif executable("curl")
359964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "curl"
369964e468SBram Moolenaar else
379964e468SBram Moolenaar  let g:GetLatestVimScripts_wget    = 'echo "GetLatestVimScripts needs wget or curl"'
389964e468SBram Moolenaar  let g:GetLatestVimScripts_options = ""
399964e468SBram Moolenaar endif
409964e468SBram Moolenaarendif
419964e468SBram Moolenaar
429964e468SBram Moolenaar" options that wget and curl require:
439964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options")
449964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget"
459964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-q -O"
469964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl"
479964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-s -O"
489964e468SBram Moolenaar else
499964e468SBram Moolenaar  let g:GetLatestVimScripts_options= ""
509964e468SBram Moolenaar endif
519964e468SBram Moolenaarendif
529964e468SBram Moolenaar
539964e468SBram Moolenaar" by default, allow autoinstall lines to work
549964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall")
559964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1
569964e468SBram Moolenaarendif
579964e468SBram Moolenaar
589964e468SBram Moolenaar"" For debugging:
599964e468SBram Moolenaar"let g:GetLatestVimScripts_wget    = "echo"
609964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options"
619964e468SBram Moolenaar
629964e468SBram Moolenaar" ---------------------------------------------------------------------
639964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1
649964e468SBram Moolenaarlet s:autoinstall= ""
659964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall
669964e468SBram Moolenaar
679964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash"
689964e468SBram Moolenaar  " windows (but not cygwin/bash)
699964e468SBram Moolenaar  let s:dotvim= "vimfiles"
709964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
719964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "ren"
729964e468SBram Moolenaar  endif
739964e468SBram Moolenaar
749964e468SBram Moolenaar else
759964e468SBram Moolenaar  " unix
769964e468SBram Moolenaar  let s:dotvim= ".vim"
779964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
789964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "mv"
799964e468SBram Moolenaar  endif
809964e468SBram Moolenaar endif
819964e468SBram Moolenaar
829964e468SBram Moolenaar if exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim)
839964e468SBram Moolenaar  let s:autoinstall= $HOME."/".s:dotvim
849964e468SBram Moolenaar endif
859964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">")
869964e468SBram Moolenaar"else "Decho
879964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled")
889964e468SBram Moolenaarendif
899964e468SBram Moolenaar
909964e468SBram Moolenaar" ---------------------------------------------------------------------
919964e468SBram Moolenaar"  Public Interface: {{{1
929964e468SBram Moolenaarcom!        -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts()
939964e468SBram Moolenaarcom!        -nargs=0 GetScript           call getscript#GetLatestVimScripts()
949964e468SBram Moolenaarsilent! com -nargs=0 GLVS                call getscript#GetLatestVimScripts()
959964e468SBram Moolenaar
969964e468SBram Moolenaar" ---------------------------------------------------------------------
979964e468SBram Moolenaar"  GetOneScript: (Get Latest Vim Script) this function operates {{{1
989964e468SBram Moolenaar"    on the current line, interpreting two numbers and text as
999964e468SBram Moolenaar"    ScriptID, SourceID, and Filename.
1009964e468SBram Moolenaar"    It downloads any scripts that have newer versions from vim.sf.net.
1019964e468SBram Moolenaarfun! s:GetOneScript(...)
1029964e468SBram Moolenaar"   call Dfunc("GetOneScript()")
1039964e468SBram Moolenaar
1049964e468SBram Moolenaar " set options to allow progress to be shown on screen
1059964e468SBram Moolenaar  let t_ti= &t_ti
1069964e468SBram Moolenaar  let t_te= &t_te
1079964e468SBram Moolenaar  let rs  = &rs
1089964e468SBram Moolenaar  set t_ti= t_te= nors
1099964e468SBram Moolenaar
1109964e468SBram Moolenaar " put current line on top-of-screen and interpret it into
1119964e468SBram Moolenaar " a      script identifer  : used to obtain webpage
1129964e468SBram Moolenaar "        source identifier : used to identify current version
1139964e468SBram Moolenaar " and an associated comment: used to report on what's being considered
1149964e468SBram Moolenaar  if a:0 >= 3
1159964e468SBram Moolenaar   let scriptid = a:1
1169964e468SBram Moolenaar   let srcid    = a:2
1179964e468SBram Moolenaar   let fname    = a:3
1189964e468SBram Moolenaar   let cmmnt    = ""
1199964e468SBram Moolenaar"   call Decho("scriptid<".scriptid.">")
1209964e468SBram Moolenaar"   call Decho("srcid   <".srcid.">")
1219964e468SBram Moolenaar"   call Decho("fname   <".fname.">")
1229964e468SBram Moolenaar  else
1239964e468SBram Moolenaar   let curline  = getline(".")
1249964e468SBram Moolenaar   if curline =~ '^\s*#'
1259964e468SBram Moolenaar"    call Dret("GetOneScript : skipping a pure comment line")
1269964e468SBram Moolenaar    return
1279964e468SBram Moolenaar   endif
1289964e468SBram Moolenaar   let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$'
1299964e468SBram Moolenaar   try
1309964e468SBram Moolenaar    let scriptid = substitute(curline,parsepat,'\1','e')
1319964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1329964e468SBram Moolenaar    let scriptid= 0
1339964e468SBram Moolenaar   endtry
1349964e468SBram Moolenaar   try
1359964e468SBram Moolenaar    let srcid    = substitute(curline,parsepat,'\2','e')
1369964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1379964e468SBram Moolenaar    let srcid= 0
1389964e468SBram Moolenaar   endtry
1399964e468SBram Moolenaar   try
1409964e468SBram Moolenaar    let fname= substitute(curline,parsepat,'\3','e')
1419964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1429964e468SBram Moolenaar    let fname= ""
1439964e468SBram Moolenaar   endtry
1449964e468SBram Moolenaar   try
1459964e468SBram Moolenaar    let cmmnt= substitute(curline,parsepat,'\4','e')
1469964e468SBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
1479964e468SBram Moolenaar    let cmmnt= ""
1489964e468SBram Moolenaar   endtry
1499964e468SBram Moolenaar"   call Decho("curline <".curline.">")
1509964e468SBram Moolenaar"   call Decho("parsepat<".parsepat.">")
1519964e468SBram Moolenaar"   call Decho("scriptid<".scriptid.">")
1529964e468SBram Moolenaar"   call Decho("srcid   <".srcid.">")
1539964e468SBram Moolenaar"   call Decho("fname   <".fname.">")
1549964e468SBram Moolenaar  endif
1559964e468SBram Moolenaar
1569964e468SBram Moolenaar  if scriptid == 0 || srcid == 0
1579964e468SBram Moolenaar   " When looking for :AutoInstall: lines, skip scripts that
1589964e468SBram Moolenaar   " have  0 0 scriptname
1599964e468SBram Moolenaar"   call Dret("GetOneScript : skipping a scriptid==srcid==0 line")
1609964e468SBram Moolenaar   return
1619964e468SBram Moolenaar  endif
1629964e468SBram Moolenaar
1639964e468SBram Moolenaar  let doautoinstall= 0
1649964e468SBram Moolenaar  if fname =~ ":AutoInstall:"
1659964e468SBram Moolenaar"   call Decho("fname<".fname."> has :AutoInstall:...")
1669964e468SBram Moolenaar   let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','')
1679964e468SBram Moolenaar"   call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall)
1689964e468SBram Moolenaar   if s:autoinstall != ""
1699964e468SBram Moolenaar    let doautoinstall = g:GetLatestVimScripts_allowautoinstall
1709964e468SBram Moolenaar   endif
1719964e468SBram Moolenaar  else
1729964e468SBram Moolenaar   let aicmmnt= fname
1739964e468SBram Moolenaar  endif
1749964e468SBram Moolenaar"  call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall)
1759964e468SBram Moolenaar
1769964e468SBram Moolenaar  exe "norm z\<CR>"
1779964e468SBram Moolenaar  redraw!
1789964e468SBram Moolenaar"  call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid)
1799964e468SBram Moolenaar  echomsg 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid
1809964e468SBram Moolenaar
1819964e468SBram Moolenaar  " grab a copy of the plugin's vim.sf.net webpage
1829964e468SBram Moolenaar  let scriptaddr = 'http://vim.sf.net/script.php?script_id='.scriptid
1839964e468SBram Moolenaar  let tmpfile    = tempname()
1849964e468SBram Moolenaar  let v:errmsg   = ""
1859964e468SBram Moolenaar
186*9e368dbaSBram Moolenaar  " make up to three tries at downloading the description
1879964e468SBram Moolenaar  let itry= 1
1889964e468SBram Moolenaar  while itry <= 3
1899964e468SBram Moolenaar"   	call Decho("try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr)
1909964e468SBram Moolenaar  	if has("win32") || has("win16") || has("win95")
1919964e468SBram Moolenaar"     call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"')
1929964e468SBram Moolenaar     exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"'
1939964e468SBram Moolenaar	else
1949964e468SBram Moolenaar"     call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'")
1959964e468SBram Moolenaar     exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'"
1969964e468SBram Moolenaar	endif
1979964e468SBram Moolenaar	if itry == 1
1989964e468SBram Moolenaar    exe "silent vsplit ".tmpfile
1999964e468SBram Moolenaar	else
2009964e468SBram Moolenaar	 silent! e %
2019964e468SBram Moolenaar	endif
2029964e468SBram Moolenaar
2039964e468SBram Moolenaar   " find the latest source-id in the plugin's webpage
2049964e468SBram Moolenaar   silent! 1
2059964e468SBram Moolenaar   let findpkg= search('Click on the package to download','W')
2069964e468SBram Moolenaar   if findpkg > 0
2079964e468SBram Moolenaar    break
2089964e468SBram Moolenaar   endif
2099964e468SBram Moolenaar   let itry= itry + 1
2109964e468SBram Moolenaar  endwhile
2119964e468SBram Moolenaar"  call Decho(" --- end downloading tries while loop --- itry=".itry)
2129964e468SBram Moolenaar
213*9e368dbaSBram Moolenaar  " testing: did finding "Click on the package..." fail?
2149964e468SBram Moolenaar  if findpkg == 0 || itry >= 4
2159964e468SBram Moolenaar    silent q!
2169964e468SBram Moolenaar    call delete(tmpfile)
2179964e468SBram Moolenaar   " restore options
2189964e468SBram Moolenaar    let &t_ti        = t_ti
2199964e468SBram Moolenaar    let &t_te        = t_te
2209964e468SBram Moolenaar    let &rs          = rs
2219964e468SBram Moolenaar    let s:downerrors = s:downerrors + 1
2229964e468SBram Moolenaar"    call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">")
2239964e468SBram Moolenaar    echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">"
2249964e468SBram Moolenaar"    call Dret("GetOneScript : srch for /Click on the package/ failed")
2259964e468SBram Moolenaar    return
2269964e468SBram Moolenaar  endif
2279964e468SBram Moolenaar"  call Decho('found "Click on the package to download"')
2289964e468SBram Moolenaar
2299964e468SBram Moolenaar  let findsrcid= search('src_id=','W')
2309964e468SBram Moolenaar  if findsrcid == 0
2319964e468SBram Moolenaar    silent q!
2329964e468SBram Moolenaar    call delete(tmpfile)
2339964e468SBram Moolenaar   " restore options
2349964e468SBram Moolenaar	let &t_ti        = t_ti
2359964e468SBram Moolenaar	let &t_te        = t_te
2369964e468SBram Moolenaar	let &rs          = rs
2379964e468SBram Moolenaar	let s:downerrors = s:downerrors + 1
2389964e468SBram Moolenaar"  	call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">")
2399964e468SBram Moolenaar  	echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">"
2409964e468SBram Moolenaar"	call Dret("GetOneScript : srch for /src_id/ failed")
2419964e468SBram Moolenaar  	return
2429964e468SBram Moolenaar  endif
2439964e468SBram Moolenaar"  call Decho('found "src_id=" in description page')
2449964e468SBram Moolenaar
2459964e468SBram Moolenaar  let srcidpat   = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$'
2469964e468SBram Moolenaar  let latestsrcid= substitute(getline("."),srcidpat,'\1','')
247*9e368dbaSBram Moolenaar  let sname      = substitute(getline("."),srcidpat,'\2','') " script name actually downloaded
248*9e368dbaSBram Moolenaar"  call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> sname<".sname.">")
2499964e468SBram Moolenaar  silent q!
2509964e468SBram Moolenaar  call delete(tmpfile)
2519964e468SBram Moolenaar
2529964e468SBram Moolenaar  " convert the strings-of-numbers into numbers
2539964e468SBram Moolenaar  let srcid       = srcid       + 0
2549964e468SBram Moolenaar  let latestsrcid = latestsrcid + 0
255*9e368dbaSBram Moolenaar"  call Decho("srcid=".srcid." latestsrcid=".latestsrcid." sname<".sname.">")
2569964e468SBram Moolenaar
2579964e468SBram Moolenaar  " has the plugin's most-recent srcid increased, which indicates
2589964e468SBram Moolenaar  " that it has been updated
2599964e468SBram Moolenaar  if latestsrcid > srcid
260*9e368dbaSBram Moolenaar"   call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."]: need to update <".sname.">")
261*9e368dbaSBram Moolenaar
2629964e468SBram Moolenaar   let s:downloads= s:downloads + 1
263*9e368dbaSBram Moolenaar   if sname == bufname("%")
2649964e468SBram Moolenaar    " GetLatestVimScript has to be careful about downloading itself
265*9e368dbaSBram Moolenaar    let sname= "NEW_".sname
2669964e468SBram Moolenaar   endif
2679964e468SBram Moolenaar
2689964e468SBram Moolenaar   " the plugin has been updated since we last obtained it, so download a new copy
269*9e368dbaSBram Moolenaar"   call Decho("...downloading new <".sname.">")
270*9e368dbaSBram Moolenaar   echomsg "...downloading new <".sname.">"
2719964e468SBram Moolenaar   if has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")
272*9e368dbaSBram Moolenaar"    call Decho("windows: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"')
273*9e368dbaSBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"'
2749964e468SBram Moolenaar   else
275*9e368dbaSBram Moolenaar"    call Decho("unix: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'")
276*9e368dbaSBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'"
2779964e468SBram Moolenaar   endif
2789964e468SBram Moolenaar
2799964e468SBram Moolenaar   " AutoInstall: only if doautoinstall is so indicating
2809964e468SBram Moolenaar   if doautoinstall
281*9e368dbaSBram Moolenaar"     call Decho("attempting to do autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname))
282*9e368dbaSBram Moolenaar     if filereadable(sname)
283*9e368dbaSBram Moolenaar"       call Decho("move <".sname."> to ".s:autoinstall)
284*9e368dbaSBram Moolenaar       exe "silent !".g:GetLatestVimScripts_mv." ".sname." ".s:autoinstall
2859964e468SBram Moolenaar       let curdir= escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #")
28682038d73SBram Moolenaar"       call Decho("exe cd ".s:autoinstall)
2879964e468SBram Moolenaar       exe "cd ".s:autoinstall
28882038d73SBram Moolenaar
28982038d73SBram Moolenaar       " decompress
290*9e368dbaSBram Moolenaar       if sname =~ '\.bz2$'
291*9e368dbaSBram Moolenaar"         call Decho("decompress: attempt to bunzip2 ".sname)
292*9e368dbaSBram Moolenaar         exe "silent !bunzip2 ".sname
293*9e368dbaSBram Moolenaar         let sname= substitute(sname,'\.bz2$','','')
294*9e368dbaSBram Moolenaar"         call Decho("decompress: new sname<".sname."> after bunzip2")
295*9e368dbaSBram Moolenaar       elseif sname =~ '\.gz$'
296*9e368dbaSBram Moolenaar"         call Decho("decompress: attempt to gunzip ".sname)
297*9e368dbaSBram Moolenaar         exe "silent !gunzip ".sname
298*9e368dbaSBram Moolenaar         let sname= substitute(sname,'\.gz$','','')
299*9e368dbaSBram Moolenaar"         call Decho("decompress: new sname<".sname."> after gunzip")
3009964e468SBram Moolenaar       endif
30182038d73SBram Moolenaar
30282038d73SBram Moolenaar       " distribute archive(.zip, .tar, .vba) contents
303*9e368dbaSBram Moolenaar       if sname =~ '\.zip$'
304*9e368dbaSBram Moolenaar"         call Decho("dearchive: attempt to unzip ".sname)
305*9e368dbaSBram Moolenaar         exe "silent !unzip -o ".sname
306*9e368dbaSBram Moolenaar       elseif sname =~ '\.tar$'
307*9e368dbaSBram Moolenaar"         call Decho("dearchive: attempt to untar ".sname)
308*9e368dbaSBram Moolenaar         exe "silent !tar -xvf ".sname
309*9e368dbaSBram Moolenaar       elseif sname =~ '\.vba$'
310*9e368dbaSBram Moolenaar"         call Decho("dearchive: attempt to handle a vimball: ".sname)
311*9e368dbaSBram Moolenaar         silent 1split
312*9e368dbaSBram Moolenaar         exe "silent e ".sname
313*9e368dbaSBram Moolenaar         silent so %
314*9e368dbaSBram Moolenaar         silent q
3159964e468SBram Moolenaar       endif
31682038d73SBram Moolenaar
317*9e368dbaSBram Moolenaar       if sname =~ '.vim$'
318*9e368dbaSBram Moolenaar"         call Decho("dearchive: attempt to simply move ".sname." to plugin")
319*9e368dbaSBram Moolenaar         exe "silent !".g:GetLatestVimScripts_mv." ".sname." plugin"
3209964e468SBram Moolenaar       endif
32182038d73SBram Moolenaar
32282038d73SBram Moolenaar       " helptags step
3239964e468SBram Moolenaar       let docdir= substitute(&rtp,',.*','','e')."/doc"
324*9e368dbaSBram Moolenaar"       call Decho("helptags: docdir<".docdir.">")
3259964e468SBram Moolenaar       exe "helptags ".docdir
3269964e468SBram Moolenaar       exe "cd ".curdir
3279964e468SBram Moolenaar     endif
328*9e368dbaSBram Moolenaar     if fname !~ ':AutoInstall:'
329*9e368dbaSBram Moolenaar      let modline=scriptid." ".latestsrcid." :AutoInstall: ".fname.cmmnt
330*9e368dbaSBram Moolenaar     else
331*9e368dbaSBram Moolenaar      let modline=scriptid." ".latestsrcid." ".fname.cmmnt
332*9e368dbaSBram Moolenaar     endif
333*9e368dbaSBram Moolenaar   else
334*9e368dbaSBram Moolenaar     let modline=scriptid." ".latestsrcid." ".fname.cmmnt
3359964e468SBram Moolenaar   endif
3369964e468SBram Moolenaar
3379964e468SBram Moolenaar   " update the data in the <GetLatestVimScripts.dat> file
3389964e468SBram Moolenaar   call setline(line("."),modline)
33982038d73SBram Moolenaar"   call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">")
340*9e368dbaSBram Moolenaar"  else " Decho
341*9e368dbaSBram Moolenaar"   call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."], no need to update")
3429964e468SBram Moolenaar  endif
3439964e468SBram Moolenaar
3449964e468SBram Moolenaar " restore options
3459964e468SBram Moolenaar  let &t_ti= t_ti
3469964e468SBram Moolenaar  let &t_te= t_te
3479964e468SBram Moolenaar  let &rs  = rs
3489964e468SBram Moolenaar
3499964e468SBram Moolenaar"  call Dret("GetOneScript")
3509964e468SBram Moolenaarendfun
3519964e468SBram Moolenaar
3529964e468SBram Moolenaar" ---------------------------------------------------------------------
3539964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1
3549964e468SBram Moolenaar"                      scripts based on the list in
3559964e468SBram Moolenaar"   (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat
3569964e468SBram Moolenaarfun! getscript#GetLatestVimScripts()
3579964e468SBram Moolenaar"  call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">")
3589964e468SBram Moolenaar
3599964e468SBram Moolenaar" insure that wget is executable
3609964e468SBram Moolenaar  if executable(g:GetLatestVimScripts_wget) != 1
3619964e468SBram Moolenaar   echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system"
3629964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : wget not executable/availble")
3639964e468SBram Moolenaar   return
3649964e468SBram Moolenaar  endif
3659964e468SBram Moolenaar
3669964e468SBram Moolenaar  " Find the .../GetLatest subdirectory under the runtimepath
3679964e468SBram Moolenaar  for datadir in split(&rtp,',') + ['']
3689964e468SBram Moolenaar   if isdirectory(datadir."/GetLatest")
3699964e468SBram Moolenaar"    call Decho("found directory<".datadir.">")
3709964e468SBram Moolenaar    let datadir= datadir . "/GetLatest"
3719964e468SBram Moolenaar    break
3729964e468SBram Moolenaar   endif
3739964e468SBram Moolenaar   if filereadable(datadir."GetLatestVimScripts.dat")
3749964e468SBram Moolenaar"    call Decho("found ".datadir."/GetLatestVimScripts.dat")
3759964e468SBram Moolenaar    break
3769964e468SBram Moolenaar   endif
3779964e468SBram Moolenaar  endfor
37882038d73SBram Moolenaar
3799964e468SBram Moolenaar  " Sanity checks: readability and writability
3809964e468SBram Moolenaar  if datadir == ""
3819964e468SBram Moolenaar   echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install'
3829964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory")
3839964e468SBram Moolenaar   return
3849964e468SBram Moolenaar  endif
3859964e468SBram Moolenaar
3869964e468SBram Moolenaar  if filewritable(datadir) != 2
3879964e468SBram Moolenaar   echoerr "(getLatestVimScripts) Your ".datadir." isn't writable"
3889964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable directory<".datadir.">")
3899964e468SBram Moolenaar   return
3909964e468SBram Moolenaar  endif
3919964e468SBram Moolenaar  let datafile= datadir."/GetLatestVimScripts.dat"
3929964e468SBram Moolenaar  if !filereadable(datafile)
3939964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't readable"
3949964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">")
3959964e468SBram Moolenaar   return
3969964e468SBram Moolenaar  endif
3979964e468SBram Moolenaar  if !filewritable(datafile)
3989964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't writable"
3999964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">")
4009964e468SBram Moolenaar   return
4019964e468SBram Moolenaar  endif
4029964e468SBram Moolenaar"  call Decho("datadir  <".datadir.">")
4039964e468SBram Moolenaar"  call Decho("datafile <".datafile.">")
4049964e468SBram Moolenaar
4059964e468SBram Moolenaar  " don't let any events interfere (like winmanager's, taglist's, etc)
4069964e468SBram Moolenaar  let eikeep= &ei
4079964e468SBram Moolenaar  set ei=all
4089964e468SBram Moolenaar
4099964e468SBram Moolenaar  " record current directory, change to datadir, open split window with
4109964e468SBram Moolenaar  " datafile
4119964e468SBram Moolenaar  let origdir= getcwd()
4129964e468SBram Moolenaar  exe "cd ".escape(substitute(datadir,'\','/','ge'),"|[]*'\" #")
4139964e468SBram Moolenaar  split
4149964e468SBram Moolenaar  exe "e ".escape(substitute(datafile,'\','/','ge'),"|[]*'\" #")
4159964e468SBram Moolenaar  res 1000
4169964e468SBram Moolenaar  let s:downloads = 0
4179964e468SBram Moolenaar  let s:downerrors= 0
4189964e468SBram Moolenaar
4199964e468SBram Moolenaar  " Check on dependencies mentioned in plugins
4209964e468SBram Moolenaar"  call Decho(" ")
4219964e468SBram Moolenaar"  call Decho("searching plugins for GetLatestVimScripts dependencies")
4229964e468SBram Moolenaar  let lastline    = line("$")
42382038d73SBram Moolenaar"  call Decho("lastline#".lastline)
42482038d73SBram Moolenaar  let plugins     = split(globpath(&rtp,"plugin/*.vim"))
4259964e468SBram Moolenaar  let foundscript = 0
42682038d73SBram Moolenaar  let firstdir= ""
4279964e468SBram Moolenaar
42882038d73SBram Moolenaar  for plugin in plugins
42982038d73SBram Moolenaar
43082038d73SBram Moolenaar   " don't process plugins in system directories
43182038d73SBram Moolenaar   if firstdir == ""
43282038d73SBram Moolenaar    let firstdir= substitute(plugin,'[/\\][^/\\]\+$','','')
43382038d73SBram Moolenaar"    call Decho("firstdir<".firstdir.">")
43482038d73SBram Moolenaar   else
43582038d73SBram Moolenaar    let curdir= substitute(plugin,'[/\\][^/\\]\+$','','')
43682038d73SBram Moolenaar"    call Decho("curdir<".curdir.">")
43782038d73SBram Moolenaar    if curdir != firstdir
43882038d73SBram Moolenaar     break
43982038d73SBram Moolenaar    endif
44082038d73SBram Moolenaar   endif
44182038d73SBram Moolenaar
44282038d73SBram Moolenaar   " read plugin in
4439964e468SBram Moolenaar   $
44482038d73SBram Moolenaar"   call Decho(" ")
4459964e468SBram Moolenaar"   call Decho(".dependency checking<".plugin."> line$=".line("$"))
4469964e468SBram Moolenaar   exe "silent r ".plugin
44782038d73SBram Moolenaar
4489964e468SBram Moolenaar   while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0
4499964e468SBram Moolenaar    let newscript= substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e')
4509964e468SBram Moolenaar    let llp1     = lastline+1
45182038d73SBram Moolenaar"    call Decho("..newscript<".newscript.">")
4529964e468SBram Moolenaar
45382038d73SBram Moolenaar    " don't process ""GetLatestVimScripts lines
4549964e468SBram Moolenaar    if newscript !~ '^"'
4559964e468SBram Moolenaar     " found a "GetLatestVimScripts: # #" line in the script; check if its already in the datafile
4569964e468SBram Moolenaar     let curline     = line(".")
4579964e468SBram Moolenaar     let noai_script = substitute(newscript,'\s*:AutoInstall:\s*','','e')
4589964e468SBram Moolenaar     exe llp1
4599964e468SBram Moolenaar     let srchline    = search('\<'.noai_script.'\>','bW')
46082038d73SBram Moolenaar"     call Decho("..noai_script<".noai_script."> srch=".srchline."curline#".line(".")." lastline#".lastline)
4619964e468SBram Moolenaar
4629964e468SBram Moolenaar     if srchline == 0
4639964e468SBram Moolenaar      " found a new script to permanently include in the datafile
4649964e468SBram Moolenaar      let keep_rega   = @a
4659964e468SBram Moolenaar      let @a          = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','')
4669964e468SBram Moolenaar      exe lastline."put a"
4679964e468SBram Moolenaar      echomsg "Appending <".@a."> to ".datafile." for ".newscript
4689964e468SBram Moolenaar"      call Decho("..APPEND (".noai_script.")<".@a."> to GetLatestVimScripts.dat")
4699964e468SBram Moolenaar      let @a          = keep_rega
4709964e468SBram Moolenaar      let lastline    = llp1
4719964e468SBram Moolenaar      let curline     = curline     + 1
4729964e468SBram Moolenaar      let foundscript = foundscript + 1
4739964e468SBram Moolenaar"     else	" Decho
4749964e468SBram Moolenaar"      call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")")
4759964e468SBram Moolenaar     endif
4769964e468SBram Moolenaar
4779964e468SBram Moolenaar     let curline = curline + 1
4789964e468SBram Moolenaar     exe curline
4799964e468SBram Moolenaar    endif
4809964e468SBram Moolenaar   endwhile
48182038d73SBram Moolenaar
4829964e468SBram Moolenaar   let llp1= lastline + 1
4839964e468SBram Moolenaar"   call Decho(".deleting lines: ".llp1.",$d")
4849964e468SBram Moolenaar   exe "silent! ".llp1.",$d"
48582038d73SBram Moolenaar  endfor
48682038d73SBram Moolenaar"  call Decho("--- end dependency checking loop ---  foundscript=".foundscript)
48782038d73SBram Moolenaar"  call Decho(" ")
4889964e468SBram Moolenaar
4899964e468SBram Moolenaar  if foundscript == 0
4909964e468SBram Moolenaar   set nomod
4919964e468SBram Moolenaar  endif
4929964e468SBram Moolenaar
4939964e468SBram Moolenaar  " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat
49482038d73SBram Moolenaar"  call Decho("begin: checking out-of-date scripts using datafile<".datafile.">")
4959964e468SBram Moolenaar  set lz
4969964e468SBram Moolenaar  1
49782038d73SBram Moolenaar"  /^-----/,$g/^\s*\d/call Decho(getline("."))
49882038d73SBram Moolenaar  1
49982038d73SBram Moolenaar  /^-----/,$g/^\s*\d/call s:GetOneScript()
50082038d73SBram Moolenaar"  call Decho("--- end out-of-date checking --- ")
5019964e468SBram Moolenaar
5029964e468SBram Moolenaar  " Final report (an echomsg)
5039964e468SBram Moolenaar  try
5049964e468SBram Moolenaar   silent! ?^-------?
5059964e468SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E114/
5069964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : nothing done!")
5079964e468SBram Moolenaar   return
5089964e468SBram Moolenaar  endtry
5099964e468SBram Moolenaar  exe "norm! kz\<CR>"
5109964e468SBram Moolenaar  redraw!
5119964e468SBram Moolenaar  let s:msg = ""
5129964e468SBram Moolenaar  if s:downloads == 1
5139964e468SBram Moolenaar  let s:msg = "Downloaded one updated script to <".datadir.">"
5149964e468SBram Moolenaar  elseif s:downloads == 2
5159964e468SBram Moolenaar   let s:msg= "Downloaded two updated scripts to <".datadir.">"
5169964e468SBram Moolenaar  elseif s:downloads > 1
5179964e468SBram Moolenaar   let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">"
5189964e468SBram Moolenaar  else
5199964e468SBram Moolenaar   let s:msg= "Everything was already current"
5209964e468SBram Moolenaar  endif
5219964e468SBram Moolenaar  if s:downerrors > 0
5229964e468SBram Moolenaar   let s:msg= s:msg." (".s:downerrors." downloading errors)"
5239964e468SBram Moolenaar  endif
5249964e468SBram Moolenaar  echomsg s:msg
5259964e468SBram Moolenaar  " save the file
5269964e468SBram Moolenaar  if &mod
5279964e468SBram Moolenaar   silent! w!
5289964e468SBram Moolenaar  endif
5299964e468SBram Moolenaar  q
5309964e468SBram Moolenaar
5319964e468SBram Moolenaar  " restore events and current directory
5329964e468SBram Moolenaar  exe "cd ".escape(substitute(origdir,'\','/','ge'),"|[]*'\" #")
5339964e468SBram Moolenaar  let &ei= eikeep
5349964e468SBram Moolenaar  set nolz
5359964e468SBram Moolenaar"  call Dret("GetLatestVimScripts : did ".s:downloads." downloads")
5369964e468SBram Moolenaarendfun
5379964e468SBram Moolenaar" ---------------------------------------------------------------------
5389964e468SBram Moolenaar
5399964e468SBram Moolenaar" Restore Options: {{{1
5409964e468SBram Moolenaarlet &cpo= s:keepcpo
5419964e468SBram Moolenaar
5429964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap
543