Remove plugin directory on failure during installation (#75)

If installation process is terminated during `git submodule ...`, the
directory ends up in an inconsistent directory. This commit ensures
that the directory is removed on failure.
This commit is contained in:
Junegunn Choi 2014-09-14 13:30:11 +09:00
parent 6406d73c9a
commit 5ec1faefab

View file

@ -789,7 +789,7 @@ function! s:update_parallel(pull, todo, threads)
logh.call logh.call
end end
} }
bt = proc { |cmd, name, type| bt = proc { |cmd, name, type, cleanup|
tried = timeout = 0 tried = timeout = 0
begin begin
tried += 1 tried += 1
@ -820,6 +820,7 @@ function! s:update_parallel(pull, todo, threads)
killall fd.pid killall fd.pid
fd.close fd.close
end end
cleanup.call if cleanup
if e.is_a?(Timeout::Error) && tried < tries if e.is_a?(Timeout::Error) && tried < tries
3.downto(1) do |countdown| 3.downto(1) do |countdown|
s = countdown > 1 ? 's' : '' s = countdown > 1 ? 's' : ''
@ -868,7 +869,7 @@ function! s:update_parallel(pull, todo, threads)
ok, result = ok, result =
if exists if exists
dir = esc dir dir = esc dir
ret, data = bt.call "#{cd} #{dir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url", nil, nil ret, data = bt.call "#{cd} #{dir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url"
current_uri = data.lines.to_a.last current_uri = data.lines.to_a.last
if !ret if !ret
if data =~ /^Interrupted|^Timeout/ if data =~ /^Interrupted|^Timeout/
@ -891,7 +892,9 @@ function! s:update_parallel(pull, todo, threads)
else else
d = esc dir.sub(%r{[\\/]+$}, '') d = esc dir.sub(%r{[\\/]+$}, '')
log.call name, 'Installing ...', :install log.call name, 'Installing ...', :install
bt.call "(git clone #{progress} --recursive #{uri} -b #{branch} #{d} 2>&1 && cd #{esc dir} && #{subm})", name, :install bt.call "(git clone #{progress} --recursive #{uri} -b #{branch} #{d} 2>&1 && cd #{esc dir} && #{subm})", name, :install, proc {
FileUtils.rm_rf dir
}
end end
mtx.synchronize { VIM::command("let s:prev_update.new['#{name}'] = 1") } if !exists && ok mtx.synchronize { VIM::command("let s:prev_update.new['#{name}'] = 1") } if !exists && ok
log.call name, result, ok log.call name, result, ok