|
|
@@ -68,10 +68,12 @@ let g:loaded_plug = 1
|
|
|
let s:cpo_save = &cpo
|
|
|
set cpo&vim
|
|
|
|
|
|
-let s:plug_source = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
|
|
+let s:plug_src = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
|
|
+let s:plug_tab = get(s:, 'plug_tab', -1)
|
|
|
let s:plug_buf = get(s:, 'plug_buf', -1)
|
|
|
let s:mac_gui = has('gui_macvim') && has('gui_running')
|
|
|
let s:is_win = has('win32') || has('win64')
|
|
|
+let s:nvim = exists('##JobActivity') && !s:is_win
|
|
|
let s:me = resolve(expand('<sfile>:p'))
|
|
|
let s:base_spec = { 'branch': 'master', 'frozen': 0 }
|
|
|
let s:TYPE = {
|
|
|
@@ -96,7 +98,6 @@ function! plug#begin(...)
|
|
|
|
|
|
let g:plug_home = home
|
|
|
let g:plugs = {}
|
|
|
- " we want to keep track of the order plugins where registered.
|
|
|
let g:plugs_order = []
|
|
|
|
|
|
call s:define_commands()
|
|
|
@@ -123,7 +124,7 @@ endfunction
|
|
|
|
|
|
function! s:source(from, ...)
|
|
|
for pattern in a:000
|
|
|
- for vim in split(globpath(a:from, pattern), '\n')
|
|
|
+ for vim in s:lines(globpath(a:from, pattern))
|
|
|
execute 'source' vim
|
|
|
endfor
|
|
|
endfor
|
|
|
@@ -483,25 +484,59 @@ function! s:lpad(str, len)
|
|
|
return a:str . repeat(' ', a:len - len(a:str))
|
|
|
endfunction
|
|
|
|
|
|
+function! s:lines(msg)
|
|
|
+ return split(a:msg, "[\r\n]")
|
|
|
+endfunction
|
|
|
+
|
|
|
function! s:lastline(msg)
|
|
|
- let lines = split(a:msg, '\n')
|
|
|
- return get(lines, -1, '')
|
|
|
+ return get(s:lines(a:msg), -1, '')
|
|
|
endfunction
|
|
|
|
|
|
function! s:new_window()
|
|
|
execute get(g:, 'plug_window', 'vertical topleft new')
|
|
|
endfunction
|
|
|
|
|
|
-function! s:prepare()
|
|
|
- if bufexists(s:plug_buf)
|
|
|
+function! s:plug_window_exists()
|
|
|
+ let buflist = tabpagebuflist(s:plug_tab)
|
|
|
+ return !empty(buflist) && index(buflist, s:plug_buf) >= 0
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:switch_in()
|
|
|
+ if !s:plug_window_exists()
|
|
|
+ return 0
|
|
|
+ endif
|
|
|
+
|
|
|
+ if winbufnr(0) != s:plug_buf
|
|
|
+ let s:pos = [tabpagenr(), winnr(), winsaveview()]
|
|
|
+ execute 'normal!' s:plug_tab.'gt'
|
|
|
let winnr = bufwinnr(s:plug_buf)
|
|
|
- if winnr < 0
|
|
|
- call s:new_window()
|
|
|
- execute 'buffer' s:plug_buf
|
|
|
- else
|
|
|
- execute winnr . 'wincmd w'
|
|
|
- endif
|
|
|
- setlocal modifiable
|
|
|
+ execute winnr.'wincmd w'
|
|
|
+ call add(s:pos, winsaveview())
|
|
|
+ else
|
|
|
+ let s:pos = [winsaveview()]
|
|
|
+ endif
|
|
|
+
|
|
|
+ setlocal modifiable
|
|
|
+ return 1
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:switch_out(...)
|
|
|
+ call winrestview(s:pos[-1])
|
|
|
+ setlocal nomodifiable
|
|
|
+ if a:0 > 0
|
|
|
+ execute a:1
|
|
|
+ endif
|
|
|
+
|
|
|
+ if len(s:pos) > 1
|
|
|
+ execute 'normal!' s:pos[0].'gt'
|
|
|
+ execute s:pos[1] 'wincmd w'
|
|
|
+ call winrestview(s:pos[2])
|
|
|
+ endif
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:prepare()
|
|
|
+ call s:job_abort()
|
|
|
+ if s:switch_in()
|
|
|
silent %d _
|
|
|
else
|
|
|
call s:new_window()
|
|
|
@@ -514,6 +549,7 @@ function! s:prepare()
|
|
|
nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
|
|
|
nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
|
|
|
let b:plug_preview = -1
|
|
|
+ let s:plug_tab = tabpagenr()
|
|
|
let s:plug_buf = winbufnr(0)
|
|
|
call s:assign_name()
|
|
|
endif
|
|
|
@@ -542,7 +578,7 @@ function! s:do(pull, force, todo)
|
|
|
if !isdirectory(spec.dir)
|
|
|
continue
|
|
|
endif
|
|
|
- let installed = has_key(s:prev_update.new, name)
|
|
|
+ let installed = has_key(s:update.new, name)
|
|
|
let updated = installed ? 0 :
|
|
|
\ (a:pull && !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', spec.dir)))
|
|
|
if a:force || installed || updated
|
|
|
@@ -582,11 +618,9 @@ function! s:finish(pull)
|
|
|
call plug#helptags()
|
|
|
call plug#end()
|
|
|
call setline(4, getline(4) . 'Done!')
|
|
|
- normal! gg
|
|
|
- call s:syntax()
|
|
|
redraw
|
|
|
let msgs = []
|
|
|
- if !empty(s:prev_update.errors)
|
|
|
+ if !empty(s:update.errors)
|
|
|
call add(msgs, "Press 'R' to retry.")
|
|
|
endif
|
|
|
if a:pull && !empty(filter(getline(5, '$'),
|
|
|
@@ -597,11 +631,11 @@ function! s:finish(pull)
|
|
|
endfunction
|
|
|
|
|
|
function! s:retry()
|
|
|
- if empty(s:prev_update.errors)
|
|
|
+ if empty(s:update.errors)
|
|
|
return
|
|
|
endif
|
|
|
- call s:update_impl(s:prev_update.pull, s:prev_update.force,
|
|
|
- \ extend(copy(s:prev_update.errors), [s:prev_update.threads]))
|
|
|
+ call s:update_impl(s:update.pull, s:update.force,
|
|
|
+ \ extend(copy(s:update.errors), [s:update.threads]))
|
|
|
endfunction
|
|
|
|
|
|
function! s:is_managed(name)
|
|
|
@@ -609,11 +643,10 @@ function! s:is_managed(name)
|
|
|
endfunction
|
|
|
|
|
|
function! s:names(...)
|
|
|
- return filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')
|
|
|
+ return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
|
|
|
endfunction
|
|
|
|
|
|
function! s:update_impl(pull, force, args) abort
|
|
|
- let st = reltime()
|
|
|
let args = copy(a:args)
|
|
|
let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
|
|
|
\ remove(args, -1) : get(g:, 'plug_threads', 16)
|
|
|
@@ -634,99 +667,254 @@ function! s:update_impl(pull, force, args) abort
|
|
|
call mkdir(g:plug_home, 'p')
|
|
|
catch
|
|
|
return s:err(printf('Invalid plug directory: %s.'
|
|
|
- \ 'Try to call plug#begin with a valid directory', g:plug_home))
|
|
|
+ \ 'Try to call plug#begin with a valid directory', g:plug_home))
|
|
|
endtry
|
|
|
endif
|
|
|
|
|
|
+ let s:update = {
|
|
|
+ \ 'start': reltime(),
|
|
|
+ \ 'all': todo,
|
|
|
+ \ 'todo': copy(todo),
|
|
|
+ \ 'errors': [],
|
|
|
+ \ 'pull': a:pull,
|
|
|
+ \ 'force': a:force,
|
|
|
+ \ 'new': {},
|
|
|
+ \ 'threads': (has('ruby') || s:nvim) ? min([len(todo), threads]) : 1,
|
|
|
+ \ 'bar': '',
|
|
|
+ \ 'fin': 0
|
|
|
+ \ }
|
|
|
+
|
|
|
call s:prepare()
|
|
|
- call append(0, a:pull ? 'Updating plugins' : 'Installing plugins')
|
|
|
- call append(1, '['. s:lpad('', len(todo)) .']')
|
|
|
+ call append(0, ['', ''])
|
|
|
normal! 2G
|
|
|
- redraw
|
|
|
|
|
|
- let s:prev_update = { 'errors': [], 'pull': a:pull, 'force': a:force, 'new': {}, 'threads': threads }
|
|
|
- if has('ruby') && threads > 1
|
|
|
+ if has('ruby') && s:update.threads > 1
|
|
|
try
|
|
|
let imd = &imd
|
|
|
if s:mac_gui
|
|
|
set noimd
|
|
|
endif
|
|
|
- call s:update_parallel(a:pull, todo, threads)
|
|
|
+ call s:update_ruby()
|
|
|
catch
|
|
|
let lines = getline(4, '$')
|
|
|
let printed = {}
|
|
|
silent 4,$d _
|
|
|
for line in lines
|
|
|
- let name = matchstr(line, '^. \zs[^:]\+\ze:')
|
|
|
+ let name = s:extract_name(line, '.', '')
|
|
|
if empty(name) || !has_key(printed, name)
|
|
|
call append('$', line)
|
|
|
if !empty(name)
|
|
|
let printed[name] = 1
|
|
|
- if line[0] == 'x' && index(s:prev_update.errors, name) < 0
|
|
|
- call add(s:prev_update.errors, name)
|
|
|
+ if line[0] == 'x' && index(s:update.errors, name) < 0
|
|
|
+ call add(s:update.errors, name)
|
|
|
end
|
|
|
endif
|
|
|
endif
|
|
|
endfor
|
|
|
finally
|
|
|
let &imd = imd
|
|
|
+ call s:update_finish()
|
|
|
endtry
|
|
|
else
|
|
|
- call s:update_serial(a:pull, todo)
|
|
|
+ call s:update_vim()
|
|
|
endif
|
|
|
- call s:do(a:pull, a:force, filter(copy(todo), 'has_key(v:val, "do")'))
|
|
|
- call s:finish(a:pull)
|
|
|
- call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(st)))[0] . ' sec.')
|
|
|
endfunction
|
|
|
|
|
|
-function! s:update_progress(pull, cnt, bar, total)
|
|
|
- call setline(1, (a:pull ? 'Updating' : 'Installing').
|
|
|
- \ ' plugins ('.a:cnt.'/'.a:total.')')
|
|
|
- call s:progress_bar(2, a:bar, a:total)
|
|
|
- normal! 2G
|
|
|
- redraw
|
|
|
+function! s:update_finish()
|
|
|
+ if s:switch_in()
|
|
|
+ call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'has_key(v:val, "do")'))
|
|
|
+ call s:finish(s:update.pull)
|
|
|
+ call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
|
|
|
+ call s:switch_out('normal! gg')
|
|
|
+ endif
|
|
|
endfunction
|
|
|
|
|
|
-function! s:update_serial(pull, todo)
|
|
|
- let base = g:plug_home
|
|
|
- let todo = copy(a:todo)
|
|
|
- let total = len(todo)
|
|
|
- let done = {}
|
|
|
- let bar = ''
|
|
|
-
|
|
|
- for [name, spec] in items(todo)
|
|
|
- let done[name] = 1
|
|
|
- if isdirectory(spec.dir)
|
|
|
- let [valid, msg] = s:git_valid(spec, 0)
|
|
|
- if valid
|
|
|
- let result = a:pull ?
|
|
|
- \ s:system(
|
|
|
- \ printf('git checkout -q %s 2>&1 && git pull --no-rebase origin %s 2>&1 && git submodule update --init --recursive 2>&1',
|
|
|
- \ s:shellesc(spec.branch), s:shellesc(spec.branch)), spec.dir) : 'Already installed'
|
|
|
- let error = a:pull ? v:shell_error != 0 : 0
|
|
|
- else
|
|
|
- let result = msg
|
|
|
- let error = 1
|
|
|
- endif
|
|
|
+function! s:job_abort()
|
|
|
+ if !s:nvim || !exists('s:jobs')
|
|
|
+ return
|
|
|
+ endif
|
|
|
+ augroup PlugJobControl
|
|
|
+ autocmd!
|
|
|
+ augroup END
|
|
|
+ for [name, j] in items(s:jobs)
|
|
|
+ silent! call jobstop(j.jobid)
|
|
|
+ if j.new
|
|
|
+ call system('rm -rf ' . s:shellesc(g:plugs[name].dir))
|
|
|
+ endif
|
|
|
+ endfor
|
|
|
+ let s:jobs = {}
|
|
|
+ let s:jobs_idx = {}
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:job_handler() abort
|
|
|
+ if !s:plug_window_exists() " plug window closed
|
|
|
+ return s:job_abort()
|
|
|
+ endif
|
|
|
+
|
|
|
+ let name = get(s:jobs_idx, v:job_data[0], '')
|
|
|
+ if empty(name) " stale task
|
|
|
+ return
|
|
|
+ endif
|
|
|
+ let job = s:jobs[name]
|
|
|
+
|
|
|
+ if v:job_data[1] == 'exit'
|
|
|
+ let job.running = 0
|
|
|
+ if s:lastline(job.result) ==# 'Error'
|
|
|
+ let job.error = 1
|
|
|
+ let job.result = substitute(job.result, "Error[\r\n]$", '', '')
|
|
|
+ endif
|
|
|
+ call s:reap(name)
|
|
|
+ call s:tick()
|
|
|
+ else
|
|
|
+ let job.result .= v:job_data[2]
|
|
|
+ " To reduce the number of buffer updates
|
|
|
+ let job.tick = get(job, 'tick', -1) + 1
|
|
|
+ if job.tick % len(s:jobs) == 0
|
|
|
+ call s:log(job.new ? '+' : '*', name, job.result)
|
|
|
+ endif
|
|
|
+ endif
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:spawn(name, cmd, opts)
|
|
|
+ let job = { 'running': 1, 'new': get(a:opts, 'new', 0),
|
|
|
+ \ 'error': 0, 'result': '' }
|
|
|
+ let s:jobs[a:name] = job
|
|
|
+
|
|
|
+ if s:nvim
|
|
|
+ let x = jobstart(a:name, 'sh', ['-c',
|
|
|
+ \ (has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd)
|
|
|
+ \ . ' || echo Error'])
|
|
|
+ if x > 0
|
|
|
+ let s:jobs_idx[x] = a:name
|
|
|
+ let job.jobid = x
|
|
|
+ augroup PlugJobControl
|
|
|
+ execute 'autocmd JobActivity' a:name 'call s:job_handler()'
|
|
|
+ augroup END
|
|
|
else
|
|
|
- let result = s:system(
|
|
|
- \ printf('git clone --recursive %s -b %s %s 2>&1',
|
|
|
- \ s:shellesc(spec.uri),
|
|
|
- \ s:shellesc(spec.branch),
|
|
|
- \ s:shellesc(s:trim(spec.dir))))
|
|
|
- let error = v:shell_error != 0
|
|
|
- if !error | let s:prev_update.new[name] = 1 | endif
|
|
|
+ let job.running = 0
|
|
|
+ let job.error = 1
|
|
|
+ let job.result = x < 0 ? 'sh is not executable' :
|
|
|
+ \ 'Invalid arguments (or job table is full)'
|
|
|
endif
|
|
|
- let bar .= error ? 'x' : '='
|
|
|
- if error
|
|
|
- call add(s:prev_update.errors, name)
|
|
|
+ else
|
|
|
+ let params = has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]
|
|
|
+ let job.result = call('s:system', params)
|
|
|
+ let job.error = v:shell_error != 0
|
|
|
+ let job.running = 0
|
|
|
+ endif
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:reap(name)
|
|
|
+ if s:nvim
|
|
|
+ silent! execute 'autocmd! PlugJobControl JobActivity' a:name
|
|
|
+ endif
|
|
|
+
|
|
|
+ let job = s:jobs[a:name]
|
|
|
+ if job.error
|
|
|
+ call add(s:update.errors, a:name)
|
|
|
+ elseif get(job, 'new', 0)
|
|
|
+ let s:update.new[a:name] = 1
|
|
|
+ endif
|
|
|
+ let s:update.bar .= job.error ? 'x' : '='
|
|
|
+
|
|
|
+ call s:log(job.error ? 'x' : '-', a:name, job.result)
|
|
|
+ call s:bar()
|
|
|
+
|
|
|
+ call remove(s:jobs, a:name)
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:bar()
|
|
|
+ if s:switch_in()
|
|
|
+ let total = len(s:update.all)
|
|
|
+ call setline(1, (s:update.pull ? 'Updating' : 'Installing').
|
|
|
+ \ ' plugins ('.len(s:update.bar).'/'.total.')')
|
|
|
+ call s:progress_bar(2, s:update.bar, total)
|
|
|
+ call s:switch_out()
|
|
|
+ endif
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:logpos(name)
|
|
|
+ for i in range(1, line('$'))
|
|
|
+ if getline(i) =~# '^[-+x*] '.a:name.':'
|
|
|
+ return i
|
|
|
endif
|
|
|
- call append(3, s:format_message(!error, name, result))
|
|
|
- call s:update_progress(a:pull, len(done), bar, total)
|
|
|
endfor
|
|
|
+ return 0
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:log(bullet, name, lines)
|
|
|
+ if s:switch_in()
|
|
|
+ let pos = s:logpos(a:name)
|
|
|
+ if pos > 0
|
|
|
+ execute pos 'd _'
|
|
|
+ if pos > winheight('.')
|
|
|
+ let pos = 4
|
|
|
+ endif
|
|
|
+ else
|
|
|
+ let pos = 4
|
|
|
+ endif
|
|
|
+ call append(pos - 1, s:format_message(a:bullet, a:name, a:lines))
|
|
|
+ call s:switch_out()
|
|
|
+ endif
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:update_vim()
|
|
|
+ let s:jobs = {}
|
|
|
+ let s:jobs_idx = {}
|
|
|
+
|
|
|
+ call s:bar()
|
|
|
+ call s:tick()
|
|
|
+endfunction
|
|
|
+
|
|
|
+function! s:tick()
|
|
|
+while 1 " Without TCO, Vim stack is bound to explode
|
|
|
+ if empty(s:update.todo)
|
|
|
+ if empty(s:jobs) && !s:update.fin
|
|
|
+ let s:update.fin = 1
|
|
|
+ call s:update_finish()
|
|
|
+ endif
|
|
|
+ return
|
|
|
+ endif
|
|
|
+
|
|
|
+ let name = keys(s:update.todo)[0]
|
|
|
+ let spec = remove(s:update.todo, name)
|
|
|
+ let pull = s:update.pull
|
|
|
+ let new = !isdirectory(spec.dir)
|
|
|
+
|
|
|
+ call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
|
|
|
+ redraw
|
|
|
+
|
|
|
+ if !new
|
|
|
+ let [valid, msg] = s:git_valid(spec, 0)
|
|
|
+ if valid
|
|
|
+ if pull
|
|
|
+ call s:spawn(name,
|
|
|
+ \ printf('git checkout -q %s 2>&1 && git pull --progress --no-rebase origin %s 2>&1 && git submodule update --init --recursive 2>&1',
|
|
|
+ \ s:shellesc(spec.branch), s:shellesc(spec.branch)), { 'dir': spec.dir })
|
|
|
+ else
|
|
|
+ let s:jobs[name] = { 'running': 0, 'result': 'Already installed', 'error': 0 }
|
|
|
+ endif
|
|
|
+ else
|
|
|
+ let s:jobs[name] = { 'running': 0, 'result': msg, 'error': 1 }
|
|
|
+ endif
|
|
|
+ else
|
|
|
+ call s:spawn(name,
|
|
|
+ \ printf('git clone --progress --recursive %s -b %s %s 2>&1',
|
|
|
+ \ s:shellesc(spec.uri),
|
|
|
+ \ s:shellesc(spec.branch),
|
|
|
+ \ s:shellesc(s:trim(spec.dir))), { 'new': 1 })
|
|
|
+ endif
|
|
|
+
|
|
|
+ if !s:jobs[name].running
|
|
|
+ call s:reap(name)
|
|
|
+ endif
|
|
|
+ if len(s:jobs) >= s:update.threads
|
|
|
+ break
|
|
|
+ endif
|
|
|
+endwhile
|
|
|
endfunction
|
|
|
|
|
|
-function! s:update_parallel(pull, todo, threads)
|
|
|
+function! s:update_ruby()
|
|
|
ruby << EOF
|
|
|
module PlugStream
|
|
|
SEP = ["\r", "\n", nil]
|
|
|
@@ -768,15 +956,15 @@ function! s:update_parallel(pull, todo, threads)
|
|
|
require 'timeout'
|
|
|
running = true
|
|
|
iswin = VIM::evaluate('s:is_win').to_i == 1
|
|
|
- pull = VIM::evaluate('a:pull').to_i == 1
|
|
|
+ pull = VIM::evaluate('s:update.pull').to_i == 1
|
|
|
base = VIM::evaluate('g:plug_home')
|
|
|
- all = VIM::evaluate('a:todo')
|
|
|
+ all = VIM::evaluate('s:update.todo')
|
|
|
limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
|
|
|
tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
|
|
|
- nthr = VIM::evaluate('a:threads').to_i
|
|
|
+ nthr = VIM::evaluate('s:update.threads').to_i
|
|
|
maxy = VIM::evaluate('winheight(".")').to_i
|
|
|
cd = iswin ? 'cd /d' : 'cd'
|
|
|
- tot = VIM::evaluate('len(a:todo)') || 0
|
|
|
+ tot = VIM::evaluate('len(s:update.todo)') || 0
|
|
|
bar = ''
|
|
|
skip = 'Already installed'
|
|
|
mtx = Mutex.new
|
|
|
@@ -796,7 +984,7 @@ function! s:update_parallel(pull, todo, threads)
|
|
|
b = case type
|
|
|
when :install then '+' when :update then '*'
|
|
|
when true, nil then '-' else
|
|
|
- VIM::command("call add(s:prev_update.errors, '#{name}')")
|
|
|
+ VIM::command("call add(s:update.errors, '#{name}')")
|
|
|
'x'
|
|
|
end
|
|
|
result =
|
|
|
@@ -885,7 +1073,7 @@ function! s:update_parallel(pull, todo, threads)
|
|
|
} if VIM::evaluate('s:mac_gui') == 1
|
|
|
|
|
|
progress = iswin ? '' : '--progress'
|
|
|
- [all.length, nthr].min.times do
|
|
|
+ nthr.times do
|
|
|
mtx.synchronize do
|
|
|
threads << Thread.new {
|
|
|
while pair = take1.call
|
|
|
@@ -924,7 +1112,7 @@ function! s:update_parallel(pull, todo, threads)
|
|
|
FileUtils.rm_rf dir
|
|
|
}
|
|
|
end
|
|
|
- mtx.synchronize { VIM::command("let s:prev_update.new['#{name}'] = 1") } if !exists && ok
|
|
|
+ mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
|
|
|
log.call name, result, ok
|
|
|
end
|
|
|
} if running
|
|
|
@@ -942,7 +1130,7 @@ function! s:shellesc(arg)
|
|
|
endfunction
|
|
|
|
|
|
function! s:glob_dir(path)
|
|
|
- return map(filter(split(globpath(a:path, '**'), '\n'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
|
|
|
+ return map(filter(s:lines(globpath(a:path, '**')), 'isdirectory(v:val)'), 's:dirpath(v:val)')
|
|
|
endfunction
|
|
|
|
|
|
function! s:progress_bar(line, bar, total)
|
|
|
@@ -955,17 +1143,21 @@ function! s:compare_git_uri(a, b)
|
|
|
return a ==# b
|
|
|
endfunction
|
|
|
|
|
|
-function! s:format_message(ok, name, message)
|
|
|
- if a:ok
|
|
|
- return [printf('- %s: %s', a:name, s:lastline(a:message))]
|
|
|
+function! s:format_message(bullet, name, message)
|
|
|
+ if a:bullet != 'x'
|
|
|
+ return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
|
|
|
else
|
|
|
- let lines = map(split(a:message, '\n'), '" ".v:val')
|
|
|
+ let lines = map(s:lines(a:message), '" ".v:val')
|
|
|
return extend([printf('x %s:', a:name)], lines)
|
|
|
endif
|
|
|
endfunction
|
|
|
|
|
|
+function! s:with_cd(cmd, dir)
|
|
|
+ return 'cd '.s:esc(a:dir).' && '.a:cmd
|
|
|
+endfunction
|
|
|
+
|
|
|
function! s:system(cmd, ...)
|
|
|
- let cmd = a:0 > 0 ? 'cd '.s:esc(a:1).' && '.a:cmd : a:cmd
|
|
|
+ let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd
|
|
|
return system(s:is_win ? '('.cmd.')' : cmd)
|
|
|
endfunction
|
|
|
|
|
|
@@ -978,7 +1170,7 @@ function! s:git_valid(spec, check_branch)
|
|
|
let ret = 1
|
|
|
let msg = 'OK'
|
|
|
if isdirectory(a:spec.dir)
|
|
|
- let result = split(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url', a:spec.dir), '\n')
|
|
|
+ let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url', a:spec.dir))
|
|
|
let remote = result[-1]
|
|
|
if v:shell_error
|
|
|
let msg = join([remote, 'PlugClean required.'], "\n")
|
|
|
@@ -1067,19 +1259,19 @@ endfunction
|
|
|
|
|
|
function! s:upgrade()
|
|
|
let new = s:me . '.new'
|
|
|
- echo 'Downloading '. s:plug_source
|
|
|
+ echo 'Downloading '. s:plug_src
|
|
|
redraw
|
|
|
try
|
|
|
if executable('curl')
|
|
|
- let output = system(printf('curl -fLo %s %s', s:shellesc(new), s:plug_source))
|
|
|
+ let output = system(printf('curl -fLo %s %s', s:shellesc(new), s:plug_src))
|
|
|
if v:shell_error
|
|
|
- throw get(split(output, '\n'), -1, v:shell_error)
|
|
|
+ throw get(s:lines(output), -1, v:shell_error)
|
|
|
endif
|
|
|
elseif has('ruby')
|
|
|
ruby << EOF
|
|
|
require 'open-uri'
|
|
|
File.open(VIM::evaluate('new'), 'w') do |f|
|
|
|
- f << open(VIM::evaluate('s:plug_source')).read
|
|
|
+ f << open(VIM::evaluate('s:plug_src')).read
|
|
|
end
|
|
|
EOF
|
|
|
else
|
|
|
@@ -1138,7 +1330,7 @@ function! s:status()
|
|
|
let msg .= ' (not loaded)'
|
|
|
endif
|
|
|
call s:progress_bar(2, repeat('=', cnt), total)
|
|
|
- call append(3, s:format_message(valid, name, msg))
|
|
|
+ call append(3, s:format_message(valid ? '-' : 'x', name, msg))
|
|
|
normal! 2G
|
|
|
redraw
|
|
|
endfor
|
|
|
@@ -1191,7 +1383,7 @@ function! s:find_name(lnum)
|
|
|
if empty(line)
|
|
|
return ''
|
|
|
endif
|
|
|
- let name = matchstr(line, '\(^- \)\@<=[^:]\+')
|
|
|
+ let name = s:extract_name(line, '-', '')
|
|
|
if !empty(name)
|
|
|
return name
|
|
|
endif
|
|
|
@@ -1223,7 +1415,7 @@ function! s:preview_commit()
|
|
|
endfunction
|
|
|
|
|
|
function! s:section(flags)
|
|
|
- call search('\(^- \)\@<=.', a:flags)
|
|
|
+ call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
|
|
|
endfunction
|
|
|
|
|
|
function! s:diff()
|
|
|
@@ -1242,7 +1434,7 @@ function! s:diff()
|
|
|
if !empty(diff)
|
|
|
call append(1, '')
|
|
|
call append(2, '- '.k.':')
|
|
|
- call append(3, map(split(diff, '\n'), '" ". v:val'))
|
|
|
+ call append(3, map(s:lines(diff), '" ". v:val'))
|
|
|
let cnt += 1
|
|
|
normal! gg
|
|
|
redraw
|