brew/Library/Homebrew/cask/download.rb
apainintheneck 8c2f101138 cmd/fetch: handle nil cask urls
These urls can be nil if there is an unsatisfied macos version
requirement. We check for false here because either the macos
requirement can be satisfied and return true or can not be
specified and return nil. If it's not specified, it means it
can run on any macos version.

The change in Cask::Download should provide better error messages
in Downloadable but honestly we're better off just checking for
the missing url higher up the call stack which is why I made
the changes in the fetch command. Either way it seemed like
a good idea while I'm here.
2023-09-02 20:56:55 -07:00

115 lines
2.7 KiB
Ruby

# typed: true
# frozen_string_literal: true
require "downloadable"
require "fileutils"
require "cask/cache"
require "cask/quarantine"
module Cask
# A download corresponding to a {Cask}.
#
# @api private
class Download < ::Downloadable
include Context
attr_reader :cask
def initialize(cask, quarantine: nil)
super()
@cask = cask
@quarantine = quarantine
end
sig { override.returns(T.nilable(::URL)) }
def url
return if cask.url.nil?
@url ||= ::URL.new(cask.url.to_s, cask.url.specs)
end
sig { override.returns(T.nilable(::Checksum)) }
def checksum
@checksum ||= cask.sha256 if cask.sha256 != :no_check
end
sig { override.returns(T.nilable(Version)) }
def version
@version ||= Version.new(cask.version)
end
sig {
override
.params(quiet: T.nilable(T::Boolean),
verify_download_integrity: T::Boolean,
timeout: T.nilable(T.any(Integer, Float)))
.returns(Pathname)
}
def fetch(quiet: nil, verify_download_integrity: true, timeout: nil)
downloader.shutup! if quiet
begin
super(verify_download_integrity: false, timeout: timeout)
rescue DownloadError => e
error = CaskError.new("Download failed on Cask '#{cask}' with message: #{e.cause}")
error.set_backtrace e.backtrace
raise error
end
downloaded_path = cached_download
quarantine(downloaded_path)
self.verify_download_integrity(downloaded_path) if verify_download_integrity
downloaded_path
end
def time_file_size(timeout: nil)
raise ArgumentError, "not supported for this download strategy" unless downloader.is_a?(CurlDownloadStrategy)
T.cast(downloader, CurlDownloadStrategy).resolved_time_file_size(timeout: timeout)
end
def basename
downloader.basename
end
sig { override.params(filename: Pathname).void }
def verify_download_integrity(filename)
if @cask.sha256 == :no_check
opoo "No checksum defined for cask '#{@cask}', skipping verification."
return
end
super
end
sig { override.returns(String) }
def download_name
cask.token
end
private
def quarantine(path)
return if @quarantine.nil?
return unless Quarantine.available?
if @quarantine
Quarantine.cask!(cask: @cask, download_path: path)
else
Quarantine.release!(download_path: path)
end
end
sig { override.returns(T.nilable(::URL)) }
def determine_url
url
end
sig { override.returns(Pathname) }
def cache
Cache.path
end
end
end