Skip to content

Commit 9552c1f

Browse files
committed
Improve Cask upgrades
- Don't download unnecessary casks with download queue - Don't show "no outdated dependents to upgrade" message - Skip some messages/work if there's no outdated casks
1 parent 2db85ee commit 9552c1f

File tree

3 files changed

+65
-39
lines changed

3 files changed

+65
-39
lines changed

Library/Homebrew/cask/upgrade.rb

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,53 @@ module Cask
99
class Upgrade
1010
extend ::Utils::Output::Mixin
1111

12+
sig { returns(T::Array[String]) }
13+
def self.greedy_casks
14+
if (upgrade_greedy_casks = Homebrew::EnvConfig.upgrade_greedy_casks.presence)
15+
upgrade_greedy_casks.split
16+
else
17+
[]
18+
end
19+
end
20+
21+
sig {
22+
params(
23+
casks: T::Array[Cask],
24+
args: Homebrew::CLI::Args,
25+
force: T.nilable(T::Boolean),
26+
quiet: T.nilable(T::Boolean),
27+
greedy: T.nilable(T::Boolean),
28+
greedy_latest: T.nilable(T::Boolean),
29+
greedy_auto_updates: T.nilable(T::Boolean),
30+
).returns(T::Array[Cask])
31+
}
32+
def self.outdated_casks(casks, args:, force:, quiet:,
33+
greedy: false, greedy_latest: false, greedy_auto_updates: false)
34+
greedy = true if Homebrew::EnvConfig.upgrade_greedy?
35+
36+
if casks.empty?
37+
Caskroom.casks(config: Config.from_args(args)).select do |cask|
38+
cask_greedy = greedy || greedy_casks.include?(cask.token)
39+
cask.outdated?(greedy: cask_greedy, greedy_latest:,
40+
greedy_auto_updates:)
41+
end
42+
else
43+
casks.select do |cask|
44+
raise CaskNotInstalledError, cask if !cask.installed? && !force
45+
46+
if cask.outdated?(greedy: true)
47+
true
48+
elsif cask.version.latest?
49+
opoo "Not upgrading #{cask.token}, the downloaded artifact has not changed" unless quiet
50+
false
51+
else
52+
opoo "Not upgrading #{cask.token}, the latest version is already installed" unless quiet
53+
false
54+
end
55+
end
56+
end
57+
end
58+
1259
sig {
1360
params(
1461
casks: Cask,
@@ -43,35 +90,8 @@ def self.upgrade_casks!(
4390
)
4491
quarantine = true if quarantine.nil?
4592

46-
greedy = true if Homebrew::EnvConfig.upgrade_greedy?
47-
48-
greedy_casks = if (upgrade_greedy_casks = Homebrew::EnvConfig.upgrade_greedy_casks.presence)
49-
upgrade_greedy_casks.split
50-
else
51-
[]
52-
end
53-
54-
outdated_casks = if casks.empty?
55-
Caskroom.casks(config: Config.from_args(args)).select do |cask|
56-
cask_greedy = greedy || greedy_casks.include?(cask.token)
57-
cask.outdated?(greedy: cask_greedy, greedy_latest:,
58-
greedy_auto_updates:)
59-
end
60-
else
61-
casks.select do |cask|
62-
raise CaskNotInstalledError, cask if !cask.installed? && !force
63-
64-
if cask.outdated?(greedy: true)
65-
true
66-
elsif cask.version.latest?
67-
opoo "Not upgrading #{cask.token}, the downloaded artifact has not changed" unless quiet
68-
false
69-
else
70-
opoo "Not upgrading #{cask.token}, the latest version is already installed" unless quiet
71-
false
72-
end
73-
end
74-
end
93+
outdated_casks = \
94+
self.outdated_casks(casks, args:, greedy:, greedy_latest:, greedy_auto_updates:, force:, quiet:)
7595

7696
manual_installer_casks = outdated_casks.select do |cask|
7797
cask.artifacts.any? do |artifact|

Library/Homebrew/cmd/install.rb

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
require "abstract_command"
55
require "cask/config"
66
require "cask/installer"
7+
require "cask/upgrade"
8+
79
require "cask_dependent"
810
require "missing_formula"
911
require "formula_installer"
@@ -246,13 +248,21 @@ def run
246248

247249
download_queue = Homebrew::DownloadQueue.new_if_concurrency_enabled(pour: true)
248250
fetch_casks = Homebrew::EnvConfig.no_install_upgrade? ? new_casks : casks
251+
outdated_casks = Cask::Upgrade.outdated_casks(fetch_casks, args:, force: true, quiet: true)
252+
fetch_casks = outdated_casks.intersection(fetch_casks)
253+
254+
if download_queue && fetch_casks.any?
255+
binaries = args.binaries?
256+
verbose = args.verbose?
257+
force = args.force?
258+
require_sha = args.require_sha?
259+
quarantine = args.quarantine?
260+
skip_cask_deps = args.skip_cask_deps?
261+
zap = args.zap?
249262

250-
if download_queue
251263
fetch_cask_installers = fetch_casks.map do |cask|
252-
Cask::Installer.new(cask, binaries: args.binaries?, verbose: args.verbose?,
253-
force: args.force?, skip_cask_deps: args.skip_cask_deps?,
254-
require_sha: args.require_sha?, reinstall: true,
255-
quarantine: args.quarantine?, zap: args.zap?, download_queue:)
264+
Cask::Installer.new(cask, reinstall: true, binaries:, verbose:, force:, skip_cask_deps:,
265+
require_sha:, quarantine:, zap:, download_queue:)
256266
end
257267

258268
# Run prelude checks for all casks before enqueueing downloads
@@ -281,8 +291,6 @@ def run
281291
end
282292

283293
if !Homebrew::EnvConfig.no_install_upgrade? && installed_casks.any?
284-
require "cask/upgrade"
285-
286294
Cask::Upgrade.upgrade_casks!(
287295
*installed_casks,
288296
force: args.force?,

Library/Homebrew/upgrade.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,7 @@ def upgrade_dependents(deps, formulae,
247247
upgradeable.reject! { |f| FormulaInstaller.installed.include?(f) }
248248

249249
# Print the upgradable dependents.
250-
if upgradeable.blank?
251-
ohai "No outdated dependents to upgrade!" unless dry_run
252-
else
250+
if upgradeable.present?
253251
installed_formulae = (dry_run ? formulae : FormulaInstaller.installed.to_a).dup
254252
formula_plural = Utils.pluralize("formula", installed_formulae.count)
255253
upgrade_verb = dry_run ? "Would upgrade" : "Upgrading"

0 commit comments

Comments
 (0)