2021-01-20 09:06:37 -08:00
|
|
|
# typed: strict
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Homebrew
|
|
|
|
module Livecheck
|
|
|
|
# A formula or cask version, split into its component sub-versions.
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
class LivecheckVersion
|
|
|
|
include Comparable
|
|
|
|
|
2022-07-27 20:43:07 +02:00
|
|
|
sig {
|
|
|
|
params(package_or_resource: T.any(Formula, Cask::Cask, Resource), version: Version).returns(LivecheckVersion)
|
|
|
|
}
|
2022-07-27 13:26:48 +02:00
|
|
|
def self.create(package_or_resource, version)
|
|
|
|
versions = case package_or_resource
|
2022-07-31 12:38:00 +05:00
|
|
|
when Formula, Resource
|
2021-01-20 09:06:37 -08:00
|
|
|
[version]
|
|
|
|
when Cask::Cask
|
2023-02-10 17:28:58 -08:00
|
|
|
version.to_s.split(",").map { |s| Version.new(s) }
|
2021-01-20 09:06:37 -08:00
|
|
|
else
|
2022-07-27 13:26:48 +02:00
|
|
|
T.absurd(package_or_resource)
|
2021-01-20 09:06:37 -08:00
|
|
|
end
|
|
|
|
new(versions)
|
|
|
|
end
|
|
|
|
|
|
|
|
sig { returns(T::Array[Version]) }
|
|
|
|
attr_reader :versions
|
|
|
|
|
|
|
|
sig { params(versions: T::Array[Version]).void }
|
|
|
|
def initialize(versions)
|
|
|
|
@versions = versions
|
|
|
|
end
|
|
|
|
|
|
|
|
sig { params(other: T.untyped).returns(T.nilable(Integer)) }
|
|
|
|
def <=>(other)
|
|
|
|
return unless other.is_a?(LivecheckVersion)
|
|
|
|
|
|
|
|
lversions = versions
|
|
|
|
rversions = other.versions
|
|
|
|
max = [lversions.count, rversions.count].max
|
|
|
|
l = r = 0
|
|
|
|
|
|
|
|
while l < max
|
|
|
|
a = lversions[l] || Version::NULL
|
|
|
|
b = rversions[r] || Version::NULL
|
|
|
|
|
|
|
|
if a == b
|
|
|
|
l += 1
|
|
|
|
r += 1
|
|
|
|
next
|
|
|
|
elsif !a.null? && b.null?
|
|
|
|
return 1 if a > Version::NULL
|
|
|
|
|
|
|
|
l += 1
|
|
|
|
elsif a.null? && !b.null?
|
|
|
|
return -1 if b > Version::NULL
|
|
|
|
|
|
|
|
r += 1
|
|
|
|
else
|
|
|
|
return a <=> b
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|