Improve parallel update process

This commit is contained in:
Junegunn Choi 2013-09-11 12:06:57 +09:00
parent bc438626ba
commit 0c1a96b6b2
2 changed files with 29 additions and 24 deletions

View file

@ -1,15 +1,15 @@
vim-plug
========
Vim plugin manager.
A single-file Vim plugin manager.
### Why?
### Wh..why?
Because I can?
... because I can?
### Pros.
- Marginally simpler
- Easier to setup
- Parallel installation/update (requires +ruby)
- Alternative directory structure: user/repo/branch
@ -23,7 +23,7 @@ Download plug.vim and put it in ~/.vim/autoload
```sh
mkdir -p ~/.vim/autoload
curl -fL -o ~/.vim/autoload/plug.vim https://raw.github.com/junegunn/vim-plug/master/plug.vim
curl -fLo ~/.vim/autoload/plug.vim https://raw.github.com/junegunn/vim-plug/master/plug.vim
```
Edit your .vimrc
@ -50,5 +50,5 @@ You can change the location of the plugins with `plug#init(path)` call.
| PlugClean | Remove unused directories |
| PlugUpgrade | Upgrade vim-plug itself |
(Default #threads = Number of plugins)
(Default number of threads = `g:plug_threads` or 16)

View file

@ -4,7 +4,7 @@
" Download plug.vim and put it in ~/.vim/autoload
"
" mkdir -p ~/.vim/autoload
" curl -fL -o ~/.vim/autoload/plug.vim \
" curl -fLo ~/.vim/autoload/plug.vim \
" https://raw.github.com/junegunn/vim-plug/master/plug.vim
"
" Edit your .vimrc
@ -188,7 +188,8 @@ endfunction
function! s:update_impl(pull, args)
if has('ruby') && get(g:, 'plug_parallel', 1)
let threads = len(a:args) > 0 ? a:args[0] : len(g:plug)
let threads = min(
\ [len(g:plug), len(a:args) > 0 ? a:args[0] : get(g:, 'plug_threads', 16)])
else
let threads = 1
endif
@ -255,11 +256,23 @@ function! s:update_parallel(pull, threads)
total = all.length
cnt = 0
skip = 'Already installed'
all.each_slice(VIM::evaluate('a:threads').to_i).each do |slice|
slice.map { |pair|
spec = pair.last
Thread.new do
name, dir, uri, branch = spec.values_at *%w[name dir uri branch]
mtx = Mutex.new
take1 = proc { mtx.synchronize { all.shift } }
log = proc { |name, result, ok|
mtx.synchronize {
result = '(x) ' + result unless ok
result = "- #{name}: #{result}"
$curbuf[1] = "Updating plugins (#{cnt += 1}/#{total})"
$curbuf[2] = '[' + ('=' * cnt).ljust(total) + ']'
$curbuf.append $curbuf.count, result
VIM::command('normal! 2G')
VIM::command('redraw')
}
}
VIM::evaluate('a:threads').to_i.times.map { |i|
Thread.new(i) do |ii|
while pair = take1.call
name, dir, uri, branch = pair.last.values_at *%w[name dir uri branch]
result =
if File.directory? dir
pull ? `#{cd} #{dir} && git pull 2>&1` : skip
@ -267,18 +280,10 @@ function! s:update_parallel(pull, threads)
FileUtils.mkdir_p(base)
`#{cd} #{base} && git clone --recursive #{uri} -b #{branch} #{dir} 2>&1`
end.lines.to_a.last.strip
result = '(x) ' + result if $? != 0 && result != skip
Thread.current[:result] = "- #{name}: #{result}"
log.call name, result, ($? == 0 || result == skip)
end
}.each do |t|
t.join
$curbuf[1] = "Updating plugins (#{cnt += 1}/#{total})"
$curbuf[2] = '[' + ('=' * cnt).ljust(total) + ']'
$curbuf.append $curbuf.count, t[:result]
VIM::command('normal! 2G')
VIM::command('redraw')
end
end
}.each(&:join)
$curbuf[1] = "Updated. Elapsed time: #{"%.6f" % (Time.now - st)} sec."
EOF
endfunction
@ -345,7 +350,7 @@ function! s:upgrade()
redraw
let mv = s:is_win ? 'move /Y' : 'mv -f'
call system(printf(
\ "curl -fL -o %s %s && ".mv." %s %s.old && ".mv." %s %s",
\ "curl -fLo %s %s && ".mv." %s %s.old && ".mv." %s %s",
\ new, s:plug_source, mee, mee, new, mee))
if v:shell_error == 0
unlet g:loaded_plug