diff options
| author | Jack Nagel | 2013-09-23 21:39:19 -0500 |
|---|---|---|
| committer | Jack Nagel | 2013-09-23 21:39:24 -0500 |
| commit | 241791c7496e675fe5827ee8f20bb90690abe5dc (patch) | |
| tree | 20e6450f49c7493be408cd0865d1891cf2882762 /Library/Homebrew/download_strategy.rb | |
| parent | 0a2ac7692d391741e35a0723cf308af2401fc835 (diff) | |
| download | homebrew-241791c7496e675fe5827ee8f20bb90690abe5dc.tar.bz2 | |
Initialize cached filenames lazily
Closes #22751.
Diffstat (limited to 'Library/Homebrew/download_strategy.rb')
| -rw-r--r-- | Library/Homebrew/download_strategy.rb | 71 |
1 files changed, 41 insertions, 30 deletions
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb index f45bcc2cf..f844b9f23 100644 --- a/Library/Homebrew/download_strategy.rb +++ b/Library/Homebrew/download_strategy.rb @@ -4,7 +4,11 @@ require 'utils/json' class AbstractDownloadStrategy attr_accessor :local_bottle_path + attr_reader :name, :resource + def initialize name, resource + @name = name + @resource = resource @url = resource.url specs = resource.specs @spec, @ref = specs.dup.shift unless specs.empty? @@ -40,34 +44,38 @@ end class CurlDownloadStrategy < AbstractDownloadStrategy def initialize name, resource super + @mirrors = resource.mirrors + end - if name.to_s.empty? || name == '__UNKNOWN__' - @tarball_path = Pathname.new("#{HOMEBREW_CACHE}/#{basename_without_params}") + def tarball_path + @tarball_path ||= if name.to_s.empty? || name == '__UNKNOWN__' + Pathname.new("#{HOMEBREW_CACHE}/#{basename_without_params}") else - @tarball_path = Pathname.new("#{HOMEBREW_CACHE}/#{name}-#{resource.version}#{ext}") + Pathname.new("#{HOMEBREW_CACHE}/#{name}-#{resource.version}#{ext}") end + end - @mirrors = resource.mirrors - @temporary_path = Pathname.new("#@tarball_path.incomplete") + def temporary_path + @temporary_path ||= Pathname.new("#{tarball_path}.incomplete") end def cached_location - @tarball_path + tarball_path end def downloaded_size - @temporary_path.size? or 0 + temporary_path.size? or 0 end # Private method, can be overridden if needed. def _fetch - curl @url, '-C', downloaded_size, '-o', @temporary_path + curl @url, '-C', downloaded_size, '-o', temporary_path end def fetch ohai "Downloading #{@url}" - unless @tarball_path.exist? - had_incomplete_download = @temporary_path.exist? + unless tarball_path.exist? + had_incomplete_download = temporary_path.exist? begin _fetch rescue ErrorDuringExecution @@ -75,16 +83,16 @@ class CurlDownloadStrategy < AbstractDownloadStrategy # try wiping the incomplete download and retrying once if $?.exitstatus == 33 && had_incomplete_download ohai "Trying a full download" - @temporary_path.unlink + temporary_path.unlink had_incomplete_download = false retry else raise CurlDownloadStrategyError, "Download failed: #{@url}" end end - ignore_interrupts { @temporary_path.rename(@tarball_path) } + ignore_interrupts { temporary_path.rename(tarball_path) } else - puts "Already downloaded: #{@tarball_path}" + puts "Already downloaded: #{tarball_path}" end rescue CurlDownloadStrategyError raise if @mirrors.empty? @@ -92,15 +100,15 @@ class CurlDownloadStrategy < AbstractDownloadStrategy @url = @mirrors.shift retry else - @tarball_path + tarball_path end def stage - ohai "Pouring #{File.basename(@tarball_path)}" if @tarball_path.to_s.match bottle_regex + ohai "Pouring #{File.basename(tarball_path)}" if tarball_path.to_s.match bottle_regex - case @tarball_path.compression_type + case tarball_path.compression_type when :zip - with_system_path { quiet_safe_system 'unzip', {:quiet_flag => '-qq'}, @tarball_path } + with_system_path { quiet_safe_system 'unzip', {:quiet_flag => '-qq'}, tarball_path } chdir when :gzip_only # gunzip writes the compressed data in the location of the original, @@ -109,7 +117,7 @@ class CurlDownloadStrategy < AbstractDownloadStrategy with_system_path do target = File.basename(basename_without_params, ".gz") - IO.popen("gunzip -f '#{@tarball_path}' -c") do |pipe| + IO.popen("gunzip -f '#{tarball_path}' -c") do |pipe| File.open(target, "wb") do |f| buf = "" f.write(buf) while pipe.read(1024, buf) @@ -119,23 +127,23 @@ class CurlDownloadStrategy < AbstractDownloadStrategy when :gzip, :bzip2, :compress, :tar # Assume these are also tarred # TODO check if it's really a tar archive - with_system_path { safe_system 'tar', 'xf', @tarball_path } + with_system_path { safe_system 'tar', 'xf', tarball_path } chdir when :xz raise "You must install XZutils: brew install xz" unless File.executable? xzpath - with_system_path { safe_system "#{xzpath} -dc \"#{@tarball_path}\" | tar xf -" } + with_system_path { safe_system "#{xzpath} -dc \"#{tarball_path}\" | tar xf -" } chdir when :pkg - safe_system '/usr/sbin/pkgutil', '--expand', @tarball_path, basename_without_params + safe_system '/usr/sbin/pkgutil', '--expand', tarball_path, basename_without_params chdir when :rar raise "You must install unrar: brew install unrar" unless which "unrar" - quiet_safe_system 'unrar', 'x', {:quiet_flag => '-inul'}, @tarball_path + quiet_safe_system 'unrar', 'x', {:quiet_flag => '-inul'}, tarball_path when :p7zip raise "You must install 7zip: brew install p7zip" unless which "7zr" - safe_system '7zr', 'x', @tarball_path + safe_system '7zr', 'x', tarball_path else - FileUtils.cp @tarball_path, basename_without_params + FileUtils.cp tarball_path, basename_without_params end end @@ -186,7 +194,7 @@ class CurlApacheMirrorDownloadStrategy < CurlDownloadStrategy url = mirrors.fetch('preferred') + mirrors.fetch('path_info') ohai "Best Mirror #{url}" - curl url, '-C', downloaded_size, '-o', @temporary_path + curl url, '-C', downloaded_size, '-o', temporary_path rescue IndexError, Utils::JSON::Error raise "Couldn't determine mirror. Try again later." end @@ -197,14 +205,14 @@ end class CurlPostDownloadStrategy < CurlDownloadStrategy def _fetch base_url,data = @url.split('?') - curl base_url, '-d', data, '-C', downloaded_size, '-o', @temporary_path + curl base_url, '-d', data, '-C', downloaded_size, '-o', temporary_path end end # Download from an SSL3-only host. class CurlSSL3DownloadStrategy < CurlDownloadStrategy def _fetch - curl @url, '-3', '-C', downloaded_size, '-o', @temporary_path + curl @url, '-3', '-C', downloaded_size, '-o', temporary_path end end @@ -212,7 +220,7 @@ end # Useful for installing jars. class NoUnzipCurlDownloadStrategy < CurlDownloadStrategy def stage - FileUtils.cp @tarball_path, basename_without_params + FileUtils.cp tarball_path, basename_without_params end end @@ -221,7 +229,7 @@ end # the formula. class CurlUnsafeDownloadStrategy < CurlDownloadStrategy def _fetch - curl @url, '--insecure', '-C', downloaded_size, '-o', @temporary_path + curl @url, '--insecure', '-C', downloaded_size, '-o', temporary_path end end @@ -229,10 +237,13 @@ end class CurlBottleDownloadStrategy < CurlDownloadStrategy def initialize name, resource super - @tarball_path = HOMEBREW_CACHE/"#{name}-#{resource.version}#{ext}" mirror = ENV['HOMEBREW_SOURCEFORGE_MIRROR'] @url = "#{@url}?use_mirror=#{mirror}" if mirror end + + def tarball_path + @tarball_path ||= HOMEBREW_CACHE/"#{name}-#{resource.version}#{ext}" + end end # This strategy extracts local binary packages. |
