Skip to content

Improve Download Queue output #20370

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions Library/Homebrew/api/json_download.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,7 @@ def downloader
end

sig { override.returns(String) }
def name = download_name

sig { override.returns(String) }
def download_type = "JSON API"
def download_queue_type = "JSON API"
end
end
end
5 changes: 1 addition & 4 deletions Library/Homebrew/api/source_download.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,7 @@ def downloader
end

sig { override.returns(String) }
def name = download_name

sig { override.returns(String) }
def download_type = "API Source"
def download_queue_type = "API Source"

sig { override.returns(Pathname) }
def cache
Expand Down
5 changes: 4 additions & 1 deletion Library/Homebrew/bottle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,10 @@ def github_packages_manifest_resource
end

sig { override.returns(String) }
def download_type = "Bottle"
def download_queue_type = "Bottle"

sig { override.returns(String) }
def download_queue_name = "#{name} (#{resource.version})"

private

Expand Down
9 changes: 2 additions & 7 deletions Library/Homebrew/cask/download.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,6 @@ def initialize(cask, quarantine: nil)
@quarantine = quarantine
end

sig { override.returns(String) }
def name
cask.token
end

sig { override.returns(T.nilable(::URL)) }
def url
return if (cask_url = cask.url).nil?
Expand Down Expand Up @@ -95,10 +90,10 @@ def verify_download_integrity(filename)
end

sig { override.returns(String) }
def download_name = cask.token
def download_queue_name = "#{cask.token} (#{version})"

sig { override.returns(String) }
def download_type = "Cask"
def download_queue_type = "Cask"

private

Expand Down
8 changes: 4 additions & 4 deletions Library/Homebrew/download_queue.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ def enqueue(downloadable)
def fetch
return if downloads.empty?

if concurrency == 1 || downloads.one?
if concurrency == 1
downloads.each do |downloadable, promise|
promise.wait!
rescue ChecksumMismatchError => e
opoo "#{downloadable.download_type} reports different checksum: #{e.expected}"
opoo "#{downloadable.download_queue_type} reports different checksum: #{e.expected}"
Homebrew.failed = true if downloadable.is_a?(Resource::Patch)
rescue => e
raise e unless bottle_manifest_error?(downloadable, e)
Expand Down Expand Up @@ -73,7 +73,7 @@ def fetch
exception = future.reason if future.rejected?
next 1 if bottle_manifest_error?(downloadable, exception)

message = "#{downloadable.download_type} #{downloadable.name}"
message = "#{downloadable.download_queue_type} #{downloadable.download_queue_name}"
if tty
stdout_print_and_flush "#{status} #{message}#{"\n" unless last}"
elsif status
Expand All @@ -82,7 +82,7 @@ def fetch

if future.rejected?
if exception.is_a?(ChecksumMismatchError)
opoo "#{downloadable.download_type} reports different checksum: #{exception.expected}"
opoo "#{downloadable.download_queue_type} reports different checksum: #{exception.expected}"
Homebrew.failed = true if downloadable.is_a?(Resource::Patch)
next 2
else
Expand Down
15 changes: 6 additions & 9 deletions Library/Homebrew/downloadable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,11 @@ def freeze
super
end

sig { abstract.returns(String) }
def name; end

sig { returns(String) }
def download_type
class_name = T.let(self.class, T::Class[Downloadable]).name&.split("::")&.last
T.must(class_name).gsub(/([[:lower:]])([[:upper:]])/, '\1 \2').downcase
end
def download_queue_name = download_name

sig { abstract.returns(String) }
def download_queue_type; end

sig(:final) { returns(T::Boolean) }
def downloaded?
Expand Down Expand Up @@ -135,13 +132,13 @@ def verify_download_integrity(filename)
EOS
end

private

sig { overridable.returns(String) }
def download_name
@download_name ||= File.basename(determine_url.to_s).freeze
end

private

sig { overridable.returns(T::Boolean) }
def silence_checksum_missing_error?
false
Expand Down
2 changes: 1 addition & 1 deletion Library/Homebrew/exceptions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,7 @@ class DownloadError < RuntimeError

def initialize(downloadable, cause)
super <<~EOS
Failed to download resource #{downloadable.download_name.inspect}
Failed to download resource #{downloadable.download_queue_name.inspect}
#{cause.message}
EOS
@cause = cause
Expand Down
55 changes: 25 additions & 30 deletions Library/Homebrew/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,8 @@ def owner=(owner)
patches.each { |p| p.owner = owner }
end

# Removes /s from resource names; this allows Go package names
# to be used as resource names without confusing software that
# interacts with {download_name}, e.g. `github.com/foo/bar`.
def escaped_name
name.tr("/", "-")
end

def download_name
return owner.name if name.nil?
return escaped_name if owner.nil?

"#{owner.name}--#{escaped_name}"
end
sig { override.returns(String) }
def download_queue_type = "Resource"

# Verifies download and unpacks it.
# The block may call `|resource, staging| staging.retain!` to retain the staging
Expand Down Expand Up @@ -236,9 +225,6 @@ def specs
@url&.specs || {}.freeze
end

sig { override.returns(String) }
def download_type = "Resource"

protected

def stage_resource(prefix, debug_symbols: false, &block)
Expand All @@ -247,6 +233,19 @@ def stage_resource(prefix, debug_symbols: false, &block)

private

sig { override.returns(String) }
def download_name
return owner.name if name.nil?

# Removes /s from resource names; this allows Go package names
# to be used as resource names without confusing software that
# interacts with {download_name}, e.g. `github.com/foo/bar`.
escaped_name = name.tr("/", "-")
return escaped_name if owner.nil?

"#{owner.name}--#{escaped_name}"
end

def determine_url_mirrors
extra_urls = []
url = T.must(self.url)
Expand Down Expand Up @@ -288,14 +287,10 @@ def initialize(path)
# A resource for a formula.
class Formula < Resource
sig { override.returns(String) }
def name
T.must(owner).name
end
def download_queue_type = "Formula"

sig { override.returns(String) }
def download_name
name
end
def download_queue_name = "#{T.must(owner).name} (#{version})"
end

# A resource containing a Go package.
Expand Down Expand Up @@ -344,10 +339,10 @@ def installed_size
end

sig { override.returns(String) }
def download_type = "Bottle Manifest"
def download_queue_type = "Bottle Manifest"

sig { override.returns(String) }
def name = bottle.name
def download_queue_name = "#{bottle.name} (#{bottle.resource.version})"

private

Expand Down Expand Up @@ -403,15 +398,15 @@ def directory(val = nil)
end

sig { override.returns(String) }
def download_type = "Patch"
def download_queue_type = "Patch"

sig { override.returns(String) }
def name
if (url = self.url)
url.to_s.split("/").last
else
super
def download_queue_name
if (last_url_component = url.to_s.split("/").last)
return last_url_component
end

super
end
end
end
Expand Down
7 changes: 2 additions & 5 deletions Library/Homebrew/retryable_download.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ def initialize(downloadable, tries:, pour: false)
end

sig { override.returns(String) }
def name = downloadable.name
def download_queue_name = downloadable.download_queue_name

sig { override.returns(String) }
def download_type = downloadable.download_type
def download_queue_type = downloadable.download_queue_type

sig { override.returns(Pathname) }
def cached_download = downloadable.cached_download
Expand Down Expand Up @@ -103,9 +103,6 @@ def fetch(verify_download_integrity: true, timeout: nil, quiet: false)
sig { override.params(filename: Pathname).void }
def verify_download_integrity(filename) = downloadable.verify_download_integrity(filename)

sig { override.returns(String) }
def download_name = downloadable.download_name

private

sig { returns(Downloadable) }
Expand Down
7 changes: 2 additions & 5 deletions Library/Homebrew/software_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ class SoftwareSpec
attr_reader :name, :full_name, :owner, :build, :resources, :patches, :options, :deprecated_flags,
:deprecated_options, :dependency_collector, :bottle_specification, :compiler_failures

def_delegators :@resource, :stage, :fetch, :verify_download_integrity, :source_modified_time, :download_name,
def_delegators :@resource, :stage, :fetch, :verify_download_integrity, :source_modified_time,
:cached_download, :clear_cache, :checksum, :mirrors, :specs, :using, :version, :mirror,
:downloader
:downloader, :download_queue_name, :download_queue_type

def_delegators :@resource, :sha256

Expand Down Expand Up @@ -81,9 +81,6 @@ def freeze
super
end

sig { override.returns(String) }
def download_type = "Formula"

def owner=(owner)
@name = owner.name
@full_name = owner.full_name
Expand Down
Loading