func! vundle#installer#new(bang, ...) abort let bundles = (a:1 == '') ? \ g:bundles : \ map(copy(a:000), 'vundle#config#init_bundle(v:val, {})') let names = vundle#scripts#bundle_names(map(copy(bundles), 'v:val.name_spec')) call vundle#scripts#view('Installer',['" Installing bundles to '.expand(g:bundle_dir, 1)], names + ['Helptags']) call s:process(a:bang, (a:bang ? 'add!' : 'add')) call vundle#config#require(bundles) endf func! s:process(bang, cmd) let msg = '' redraw sleep 1m let lines = (getline('.','$')[0:-2]) for line in lines redraw exec ':norm '.a:cmd if 'error' == g:vundle_last_status let msg = 'With errors; press l to view log' endif " goto next one exec ':+1' setl nomodified endfor redraw echo 'Done! '.msg endf func! vundle#installer#run(func_name, name, ...) abort let n = a:name echo 'Processing '.n call s:sign('active') sleep 1m let status = call(a:func_name, a:1) call s:sign(status) redraw if 'updated' == status echo n.' installed' elseif 'todate' == status echo n.' already installed' elseif 'deleted' == status echo n.' deleted' elseif 'error' == status echohl Error echo 'Error processing '.n echohl None sleep 1 else throw 'whoops, unknown status:'.status endif let g:vundle_last_status = status return status endf func! s:sign(status) if (!has('signs')) return endif exe ":sign place ".line('.')." line=".line('.')." name=Vu_". a:status ." buffer=" . bufnr("%") endf func! vundle#installer#install_and_require(bang, name) abort let result = vundle#installer#install(a:bang, a:name) let b = vundle#config#init_bundle(a:name, {}) call vundle#config#require([b]) return result endf func! vundle#installer#install(bang, name) abort if !isdirectory(g:bundle_dir) | call mkdir(g:bundle_dir, 'p') | endif let b = vundle#config#init_bundle(a:name, {}) return s:sync(a:bang, b) endf func! vundle#installer#docs() abort call vundle#installer#helptags(g:bundles) return 'updated' endf func! vundle#installer#helptags(bundles) abort let bundle_dirs = map(copy(a:bundles),'v:val.rtpath()') let help_dirs = filter(bundle_dirs, 's:has_doc(v:val)') call s:log('') call s:log('Helptags:') call map(copy(help_dirs), 's:helptags(v:val)') call s:log('Helptags: '.len(help_dirs).' bundles processed') return help_dirs endf func! vundle#installer#list(bang) abort let bundles = vundle#scripts#bundle_names(map(copy(g:bundles), 'v:val.name_spec')) call vundle#scripts#view('list', ['" My Bundles'], bundles) redraw echo len(g:bundles).' bundles configured' endf func! vundle#installer#clean(bang) abort let bundle_dirs = map(copy(g:bundles), 'v:val.path()') let all_dirs = split(globpath(g:bundle_dir, '*', 1), "\n") let x_dirs = filter(all_dirs, '0 > index(bundle_dirs, v:val)') if empty(x_dirs) let headers = ['" All clean!'] let names = [] else let headers = ['" Removing bundles:'] let names = vundle#scripts#bundle_names(map(copy(x_dirs), 'fnamemodify(v:val, ":t")')) end call vundle#scripts#view('clean', headers, names) redraw if (a:bang || empty(names)) call s:process(a:bang, 'D') else call inputsave() let response = input('Continue? [Y/n]: ') call inputrestore() if (response =~? 'y' || response == '') call s:process(a:bang, 'D') endif endif endf func! vundle#installer#delete(bang, dir_name) abort let cmd = (has('win32') || has('win64')) ? \ 'rmdir /S /Q' : \ 'rm -rf' let bundle = vundle#config#init_bundle(a:dir_name, {}) let cmd .= ' '.shellescape(bundle.path()) let out = s:system(cmd) call s:log('') call s:log('Bundle '.a:dir_name) call s:log('$ '.cmd) call s:log('> '.out) if 0 != v:shell_error return 'error' else return 'deleted' endif endf func! s:has_doc(rtp) abort return isdirectory(a:rtp.'/doc') \ && (!filereadable(a:rtp.'/doc/tags') || filewritable(a:rtp.'/doc/tags')) \ && !(empty(glob(a:rtp.'/doc/*.txt', 1)) && empty(glob(a:rtp.'/doc/*.??x', 1))) endf func! s:helptags(rtp) abort let doc_path = a:rtp.'/doc/' call s:log(':helptags '.doc_path) try helptags `=doc_path` catch call s:log("> Error running :helptags ".doc_path) endtry endf func! s:sync(bang, bundle) abort let git_dir = expand(a:bundle.path().'/.git/', 1) if isdirectory(git_dir) if !(a:bang) | return 'todate' | endif let cmd = 'cd '.shellescape(a:bundle.path()).' && git pull' if (has('win32') || has('win64')) let cmd = substitute(cmd, '^cd ','cd /d ','') " add /d switch to change drives let cmd = '"'.cmd.'"' " enclose in quotes endif else let cmd = 'git clone '.a:bundle.uri.' '.shellescape(a:bundle.path()) endif let out = s:system(cmd) call s:log('') call s:log('Bundle '.a:bundle.name_spec) call s:log('$ '.cmd) call s:log('> '.out) if 0 != v:shell_error return 'error' end if out =~# 'up-to-date' return 'todate' end return 'updated' endf func! s:system(cmd) abort return system(a:cmd) endf func! s:log(str) abort let fmt = '%y%m%d %H:%M:%S' call add(g:vundle_log, '['.strftime(fmt).'] '.a:str) return a:str endf