From dd382487c728796aed87714b1c43a3deb36afa07 Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Fri, 29 Mar 2024 23:07:38 +0000 Subject: [PATCH] Sort kegs based on version scheme --- Library/Homebrew/cli/named_args.rb | 2 +- Library/Homebrew/cmd/info.rb | 2 +- Library/Homebrew/cmd/upgrade.rb | 7 +++---- Library/Homebrew/formula.rb | 13 ++++++------- Library/Homebrew/formula_pin.rb | 5 ++++- Library/Homebrew/formulary.rb | 2 +- Library/Homebrew/installed_dependents.rb | 2 +- Library/Homebrew/keg.rb | 9 +++++++++ 8 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Library/Homebrew/cli/named_args.rb b/Library/Homebrew/cli/named_args.rb index 284c18aa9bbe4..f07b45d34e3e5 100644 --- a/Library/Homebrew/cli/named_args.rb +++ b/Library/Homebrew/cli/named_args.rb @@ -381,7 +381,7 @@ def resolve_latest_keg(name) end end - stable_kegs.max_by(&:version) + Keg.sort(stable_kegs).first end def resolve_default_keg(name) diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb index 477cf6709f3a6..0685a959e3512 100644 --- a/Library/Homebrew/cmd/info.rb +++ b/Library/Homebrew/cmd/info.rb @@ -299,7 +299,7 @@ def info_formula(formula, args:) heads, versioned = kegs.partition { |k| k.version.head? } kegs = [ *heads.sort_by { |k| -Tab.for_keg(k).time.to_i }, - *versioned.sort_by(&:version), + *Keg.sort(versioned), ] if kegs.empty? puts "Not installed" diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 9aa4d07187739..1ce38eaba7e32 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -175,12 +175,11 @@ def upgrade_outdated_formulae(formulae, args:) end not_outdated.each do |f| - versions = f.installed_kegs.map(&:version) - if versions.empty? + latest_keg = Keg.sort(f.installed_kegs).first + if latest_keg.nil? ofail "#{f.full_specified_name} not installed" else - version = versions.max - opoo "#{f.full_specified_name} #{version} already installed" + opoo "#{f.full_specified_name} #{latest_keg.version} already installed" end end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 0a5b11abdcc99..f8ca1a185d88b 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1492,9 +1492,8 @@ def outdated_kegs(fetch_head: false) version = keg.version next if version.head? - tab = Tab.for_keg(keg) - next if version_scheme > tab.version_scheme && pkg_version != version - next if version_scheme == tab.version_scheme && pkg_version > version + next if version_scheme > keg.version_scheme && pkg_version != version + next if version_scheme == keg.version_scheme && pkg_version > version # don't consider this keg current if there's a newer formula available next if follow_installed_alias? && new_formula_available? @@ -1509,7 +1508,7 @@ def outdated_kegs(fetch_head: false) [] else all_kegs += old_installed_formulae.flat_map(&:installed_kegs) - all_kegs.sort_by(&:version) + Keg.sort(all_kegs) end end end @@ -2244,7 +2243,7 @@ def to_hash "conflicts_with_reasons" => conflicts.map(&:reason), "link_overwrite" => self.class.link_overwrite_paths.to_a, "caveats" => caveats_with_placeholders, - "installed" => [], + "installed" => T.let([], T::Array[T::Hash[String, T.untyped]]), "linked_keg" => linked_version&.to_s, "pinned" => pinned?, "outdated" => outdated?, @@ -2269,7 +2268,7 @@ def to_hash hsh.merge!(dependencies_hash) - hsh["installed"] = installed_kegs.sort_by(&:version).map do |keg| + hsh["installed"] = Keg.sort(installed_kegs).map do |keg| tab = Tab.for_keg keg { "version" => keg.version.to_s, @@ -2842,7 +2841,7 @@ def eligible_kegs_for_cleanup(quiet: false) eligible_kegs = if head? && (head_prefix = latest_head_prefix) head, stable = installed_kegs.partition { |k| k.version.head? } # Remove newest head and stable kegs - head - [Keg.new(head_prefix)] + stable.sort_by(&:version).slice(0...-1) + head - [Keg.new(head_prefix)] + Keg.sort(stable).drop(1) else installed_kegs.select do |keg| tab = Tab.for_keg(keg) diff --git a/Library/Homebrew/formula_pin.rb b/Library/Homebrew/formula_pin.rb index dc181e81dfe36..c8f9e78c6d4b9 100644 --- a/Library/Homebrew/formula_pin.rb +++ b/Library/Homebrew/formula_pin.rb @@ -22,7 +22,10 @@ def pin_at(version) end def pin - pin_at(@formula.installed_kegs.map(&:version).max) + latest_keg = Keg.sort(@formula.installed_kegs).first + return if latest_keg.nil? + + pin_at(latest_keg.version) end def unpin diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index c1fa055f6fedf..bbf45e946391e 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -994,7 +994,7 @@ def self.from_rack( flags: T.unsafe(nil) ) kegs = rack.directory? ? rack.subdirs.map { |d| Keg.new(d) } : [] - keg = kegs.find(&:linked?) || kegs.find(&:optlinked?) || kegs.max_by(&:version) + keg = kegs.find(&:linked?) || kegs.find(&:optlinked?) || Keg.sort(kegs).first options = { alias_path:, diff --git a/Library/Homebrew/installed_dependents.rb b/Library/Homebrew/installed_dependents.rb index afd7bf2418e70..cec9974dee751 100644 --- a/Library/Homebrew/installed_dependents.rb +++ b/Library/Homebrew/installed_dependents.rb @@ -56,7 +56,7 @@ def find_some_installed_dependents(kegs, casks: []) f_kegs = kegs_by_source[[f.name, f.tap]] next unless f_kegs - f_kegs.max_by(&:version) + Keg.sort(f_kegs).first end next if required_kegs.empty? diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 4e5015c9babf5..41a7e2a6d9977 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -148,6 +148,11 @@ def self.all Formula.racks.flat_map(&:subdirs).map { |d| new(d) } end + sig { params(kegs: T::Array[Keg]).returns(T::Array[Keg]) } + def self.sort(kegs) + kegs.sort_by { |keg| [keg.version_scheme, keg.version] }.reverse! + end + attr_reader :path, :name, :linked_keg_record, :opt_record protected :path @@ -387,6 +392,10 @@ def version PkgVersion.parse(path.basename.to_s) end + def version_scheme + @version_scheme ||= tab.version_scheme + end + def to_formula Formulary.from_keg(self) end