Merge pull request #16973 from Homebrew/keg-sort

Sort kegs based on version scheme
This commit is contained in:
Bo Anderson 2024-03-29 23:55:45 +00:00 committed by GitHub
commit 02a0ea8449
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 26 additions and 16 deletions

View File

@ -381,7 +381,7 @@ module Homebrew
end end
end end
stable_kegs.max_by(&:version) Keg.sort(stable_kegs).first
end end
def resolve_default_keg(name) def resolve_default_keg(name)

View File

@ -299,7 +299,7 @@ module Homebrew
heads, versioned = kegs.partition { |k| k.version.head? } heads, versioned = kegs.partition { |k| k.version.head? }
kegs = [ kegs = [
*heads.sort_by { |k| -Tab.for_keg(k).time.to_i }, *heads.sort_by { |k| -Tab.for_keg(k).time.to_i },
*versioned.sort_by(&:version), *Keg.sort(versioned),
] ]
if kegs.empty? if kegs.empty?
puts "Not installed" puts "Not installed"

View File

@ -175,12 +175,11 @@ module Homebrew
end end
not_outdated.each do |f| not_outdated.each do |f|
versions = f.installed_kegs.map(&:version) latest_keg = Keg.sort(f.installed_kegs).first
if versions.empty? if latest_keg.nil?
ofail "#{f.full_specified_name} not installed" ofail "#{f.full_specified_name} not installed"
else else
version = versions.max opoo "#{f.full_specified_name} #{latest_keg.version} already installed"
opoo "#{f.full_specified_name} #{version} already installed"
end end
end end
end end

View File

@ -1492,9 +1492,8 @@ class Formula
version = keg.version version = keg.version
next if version.head? next if version.head?
tab = Tab.for_keg(keg) next if version_scheme > keg.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 == tab.version_scheme && pkg_version > version
# don't consider this keg current if there's a newer formula available # don't consider this keg current if there's a newer formula available
next if follow_installed_alias? && new_formula_available? next if follow_installed_alias? && new_formula_available?
@ -1509,7 +1508,7 @@ class Formula
[] []
else else
all_kegs += old_installed_formulae.flat_map(&:installed_kegs) all_kegs += old_installed_formulae.flat_map(&:installed_kegs)
all_kegs.sort_by(&:version) Keg.sort(all_kegs)
end end
end end
end end
@ -2244,7 +2243,7 @@ class Formula
"conflicts_with_reasons" => conflicts.map(&:reason), "conflicts_with_reasons" => conflicts.map(&:reason),
"link_overwrite" => self.class.link_overwrite_paths.to_a, "link_overwrite" => self.class.link_overwrite_paths.to_a,
"caveats" => caveats_with_placeholders, "caveats" => caveats_with_placeholders,
"installed" => [], "installed" => T.let([], T::Array[T::Hash[String, T.untyped]]),
"linked_keg" => linked_version&.to_s, "linked_keg" => linked_version&.to_s,
"pinned" => pinned?, "pinned" => pinned?,
"outdated" => outdated?, "outdated" => outdated?,
@ -2269,7 +2268,7 @@ class Formula
hsh.merge!(dependencies_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 tab = Tab.for_keg keg
{ {
"version" => keg.version.to_s, "version" => keg.version.to_s,
@ -2842,7 +2841,7 @@ class Formula
eligible_kegs = if head? && (head_prefix = latest_head_prefix) eligible_kegs = if head? && (head_prefix = latest_head_prefix)
head, stable = installed_kegs.partition { |k| k.version.head? } head, stable = installed_kegs.partition { |k| k.version.head? }
# Remove newest head and stable kegs # 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 else
installed_kegs.select do |keg| installed_kegs.select do |keg|
tab = Tab.for_keg(keg) tab = Tab.for_keg(keg)

View File

@ -22,7 +22,10 @@ class FormulaPin
end end
def pin 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 end
def unpin def unpin

View File

@ -994,7 +994,7 @@ module Formulary
flags: T.unsafe(nil) flags: T.unsafe(nil)
) )
kegs = rack.directory? ? rack.subdirs.map { |d| Keg.new(d) } : [] 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 = { options = {
alias_path:, alias_path:,

View File

@ -56,7 +56,7 @@ module InstalledDependents
f_kegs = kegs_by_source[[f.name, f.tap]] f_kegs = kegs_by_source[[f.name, f.tap]]
next unless f_kegs next unless f_kegs
f_kegs.max_by(&:version) Keg.sort(f_kegs).first
end end
next if required_kegs.empty? next if required_kegs.empty?

View File

@ -148,6 +148,11 @@ class Keg
Formula.racks.flat_map(&:subdirs).map { |d| new(d) } Formula.racks.flat_map(&:subdirs).map { |d| new(d) }
end 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 attr_reader :path, :name, :linked_keg_record, :opt_record
protected :path protected :path
@ -387,6 +392,10 @@ class Keg
PkgVersion.parse(path.basename.to_s) PkgVersion.parse(path.basename.to_s)
end end
def version_scheme
@version_scheme ||= tab.version_scheme
end
def to_formula def to_formula
Formulary.from_keg(self) Formulary.from_keg(self)
end end