homebrew-cask/lib/cask/download.rb

52 lines
1.5 KiB
Ruby

class Cask::Download
attr_reader :cask
def initialize(cask)
@cask = cask
end
def perform(force=false)
require 'software_spec'
cask = @cask
if cask.url.using == :svn
downloader = Cask::SubversionDownloadStrategy.new(cask)
elsif cask.url.using == :post
downloader = Cask::CurlPostDownloadStrategy.new(cask)
else
downloader = Cask::CurlDownloadStrategy.new(cask)
end
downloader.clear_cache if force
begin
downloaded_path = downloader.fetch
rescue StandardError => e
raise CaskError.new("Download failed on Cask '#{@cask}' with message: #{e}")
end
begin
# this symlink helps track which downloads are ours
File.symlink downloaded_path,
HOMEBREW_CACHE_CASKS.join(downloaded_path.basename)
rescue
end
_check_sums(downloaded_path, cask.sums) unless cask.sums === :no_check
downloaded_path
end
private
def _check_sums(path, sums)
has_sum = false
sums.each do |sum|
unless sum.empty?
computed = Checksum.new(sum.hash_type, Digest.const_get(sum.hash_type.to_s.upcase).file(path).hexdigest)
if sum == computed
odebug "Checksums match"
else
ohai 'Note: running "brew update" may fix checksum errors'
raise ChecksumMismatchError.new(path, sum, computed)
end
has_sum = true
end
end
raise ChecksumMissingError.new("Checksum required: sha256 '#{Digest::SHA256.file(path).hexdigest}'") unless has_sum
end
end