basyura's blog

あしたになったらほんきだす。

vim の plugin を並列アップデート

某 neobundle にできて Ruby にできないわけ無いじゃない ヽ(`Д´)ノ てことで。

僕は自作の Rakefile を叩いて最新化してます。
gitplugins フォルダに github にあるプラグインが沢山置いてあるとしてこんな感じ。

task :update_github do
  puts ""
  puts ">>> pull github repositories ..."
  Dir.chdir("gitplugins")

  que = Queue.new
  Dir.glob("*") do |d|
    que.push d
  end

  dir = Dir.pwd

  threads = []
 
  while !que.empty?
    threads << Thread.new(que.pop) do |target|
      repos  =  File.join(dir, target)
      if File.directory? repos
        Dir.chdir(repos)
        #puts "git pull #{target}"
        ret = `git pull 2>&1`
        if ret.chomp != 'Already up-to-date.'
          error_flg = false
          ret.each_line do |line|
            if line =~ /error/
              puts "#{target} ... #{line}"
              error_flg = true
              break
            end
          end
          puts "updated #{target}" unless error_flg
        end
      end
    end
  end
  threads.each do |t|
    t.join
  end
end

1つずつ git pull するのにくらべてあっというま。
色々間違ってそうな気もするけど、いまのところ特に問題ないようだ。

end がやけに多いのが気になるね。