brew/Library/Homebrew/cask/download.rb
apainintheneck 1dc9274f62 Improve cask audit
- check for cask.url in audit steps
- check for cask.version in audit steps
- check for cask.sha256 in fetch command
- stop omitting casks based on nil url in audit command

It would be nice to be able to omit casks from the audit
if the os is not supported but there is not easy way to
do that without updating the SimulateSystem code or
refactoring how MacOSRequirement's are defined in the DSL.
2023-09-07 20:38:17 -07:00

117 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
return if cask.version.nil?
@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