From 9aca7f8f78f444f7a24d771c6c754392d09c95d4 Mon Sep 17 00:00:00 2001 From: Ryan Melton Date: Fri, 24 Sep 2010 22:10:31 -0600 Subject: [PATCH] Add progress bar during gem downloads. Will help with large downloads such as qtbindings on Windows --- lib/rubygems.rb | 1 + lib/rubygems/remote_fetcher.rb | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index ecc7ed3e8eb5..5989cd24b142 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -92,6 +92,7 @@ # * Daniel Berger -- djberg96(at)gmail.com # * Phil Hagelberg -- technomancy(at)gmail.com # * Ryan Davis -- ryand-ruby(at)zenspider.com +# * Ryan Melton -- ryanmelt(at)gmail.com # # (If your name is missing, PLEASE let us know!) # diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb index 626f93de45c6..e592e691f7fe 100644 --- a/lib/rubygems/remote_fetcher.rb +++ b/lib/rubygems/remote_fetcher.rb @@ -4,6 +4,7 @@ require 'uri' require 'rubygems' +require 'rubygems/progressbar' ## # RemoteFetcher handles the details of fetching gems and gem information from @@ -341,7 +342,30 @@ def request(uri, request_class, last_modified = nil) say "#{request.method} #{uri}" if Gem.configuration.really_verbose - response = connection.request request + + if request.response_body_permitted? + response = connection.request request do |incomplete_response| + if Net::HTTPOK === incomplete_response + file_name = uri.to_s.split('/')[-1] + say "Downloading #{file_name}" + progress_bar = ProgressBar.new("Progress", 100) + file_size = incomplete_response.content_length + downloaded_size = 0 + data = '' + incomplete_response.read_body do |segment| + data << segment + downloaded_size += segment.length + downloaded_percentage = (downloaded_size * 100) / file_size + progress_bar.set(downloaded_percentage) + end + incomplete_response.body = data + progress_bar.finish + end + end + else + response = connection.request request + end + say "#{response.code} #{response.message}" if Gem.configuration.really_verbose