From 0c1a96b6b2168b01b7ca4e4238a40943fa8ee08f Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 11 Sep 2013 12:06:57 +0900 Subject: [PATCH] Improve parallel update process --- README.md | 12 ++++++------ plug.vim | 41 +++++++++++++++++++++++------------------ 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 769d749..dc9e79d 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/plug.vim b/plug.vim index d447e5c..2b225d6 100644 --- a/plug.vim +++ b/plug.vim @@ -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