Skip to content

Commit 64311c2

Browse files
MikeMcQuaidclaude
andcommitted
Add Cask::Installer#prelude to check before download queueing
Fixes #20374 When using HOMEBREW_DOWNLOAD_CONCURRENCY, cask binaries were being downloaded before checking if the cask could actually be installed (e.g., disabled casks or conflict checks). This resulted in unnecessary downloads for casks that would ultimately fail to install. This change adds a `prelude` method to Cask::Installer that performs early validation checks (deprecation/disable status and conflicts) similar to Formula#prelude_fetch. The prelude method is called before enqueueing downloads in all download queue scenarios (install, reinstall, and upgrade commands), ensuring that validation failures occur before the "Fetching downloads for:" message is displayed. Key changes: - Add Cask::Installer#prelude method with @ran_prelude tracking - Call prelude before enqueueing downloads in install/reinstall/upgrade - Refactor to avoid creating installer objects multiple times - Maintain backward compatibility for non-download-queue scenarios 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent a7ea27a commit 64311c2

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

Library/Homebrew/cask/installer.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def initialize(cask, command: SystemCommand, force: false, adopt: false,
4646
@verify_download_integrity = verify_download_integrity
4747
@quiet = quiet
4848
@download_queue = download_queue
49+
@ran_prelude = T.let(false, T::Boolean)
4950
end
5051

5152
sig { returns(T::Boolean) }
@@ -140,8 +141,7 @@ def install
140141
old_config = @cask.config
141142
predecessor = @cask if reinstall? && @cask.installed?
142143

143-
check_deprecate_disable
144-
check_conflicts
144+
prelude
145145

146146
print caveats
147147
fetch
@@ -791,6 +791,16 @@ def forbidden_cask_and_formula_check
791791
)
792792
end
793793

794+
sig { void }
795+
def prelude
796+
return if @ran_prelude
797+
798+
check_deprecate_disable
799+
check_conflicts
800+
801+
@ran_prelude = true
802+
end
803+
794804
sig { void }
795805
def enqueue_downloads
796806
download_queue = @download_queue

Library/Homebrew/cask/reinstall.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ def self.reinstall_casks(
3030
end
3131

3232
if download_queue
33+
cask_installers.each(&:prelude)
34+
3335
oh1 "Fetching downloads for: #{casks.map { |cask| Formatter.identifier(cask.full_name) }.to_sentence}",
3436
truncate: false
3537
cask_installers.each(&:enqueue_downloads)

Library/Homebrew/cask/upgrade.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,19 +115,22 @@ def self.upgrade_casks!(
115115
download_queue = Homebrew::DownloadQueue.new(pour: true)
116116

117117
fetchable_casks = upgradable_casks.map(&:last)
118-
fetchable_casks_sentence = fetchable_casks.map { |cask| Formatter.identifier(cask.full_name) }.to_sentence
119-
oh1 "Fetching downloads for: #{fetchable_casks_sentence}", truncate: false
120-
121-
fetchable_casks.each do |cask|
118+
fetchable_cask_installers = fetchable_casks.map do |cask|
122119
# This is significantly easier given the weird difference in Sorbet signatures here.
123120
# rubocop:disable Style/DoubleNegation
124121
Installer.new(cask, binaries: !!binaries, verbose: !!verbose, force: !!force,
125122
skip_cask_deps: !!skip_cask_deps, require_sha: !!require_sha,
126123
upgrade: true, quarantine:, download_queue:)
127-
.enqueue_downloads
128124
# rubocop:enable Style/DoubleNegation
129125
end
130126

127+
fetchable_cask_installers.each(&:prelude)
128+
129+
fetchable_casks_sentence = fetchable_casks.map { |cask| Formatter.identifier(cask.full_name) }.to_sentence
130+
oh1 "Fetching downloads for: #{fetchable_casks_sentence}", truncate: false
131+
132+
fetchable_cask_installers.each(&:enqueue_downloads)
133+
131134
download_queue.fetch
132135
end
133136

Library/Homebrew/cmd/install.rb

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -248,17 +248,21 @@ def run
248248
fetch_casks = Homebrew::EnvConfig.no_install_upgrade? ? new_casks : casks
249249

250250
if download_queue
251-
fetch_casks_sentence = fetch_casks.map { |cask| Formatter.identifier(cask.full_name) }.to_sentence
252-
oh1 "Fetching downloads for: #{fetch_casks_sentence}", truncate: false
253-
254-
fetch_casks.each do |cask|
251+
fetch_cask_installers = fetch_casks.map do |cask|
255252
Cask::Installer.new(cask, binaries: args.binaries?, verbose: args.verbose?,
256253
force: args.force?, skip_cask_deps: args.skip_cask_deps?,
257254
require_sha: args.require_sha?, reinstall: true,
258255
quarantine: args.quarantine?, zap: args.zap?, download_queue:)
259-
.enqueue_downloads
260256
end
261257

258+
# Run prelude checks for all casks before enqueueing downloads
259+
fetch_cask_installers.each(&:prelude)
260+
261+
fetch_casks_sentence = fetch_casks.map { |cask| Formatter.identifier(cask.full_name) }.to_sentence
262+
oh1 "Fetching downloads for: #{fetch_casks_sentence}", truncate: false
263+
264+
fetch_cask_installers.each(&:enqueue_downloads)
265+
262266
download_queue.fetch
263267
end
264268

0 commit comments

Comments
 (0)