Merge pull request #15152 from dduugg/version-compare
This commit is contained in:
commit
e12ca4cee6
@ -202,7 +202,7 @@ module Homebrew
|
|||||||
when MacOSRequirement
|
when MacOSRequirement
|
||||||
next true unless r.version_specified?
|
next true unless r.version_specified?
|
||||||
|
|
||||||
macos_version.public_send(r.comparator, r.version)
|
macos_version.compare(r.comparator, r.version)
|
||||||
when XcodeRequirement
|
when XcodeRequirement
|
||||||
next true unless r.version
|
next true unless r.version
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@ module Readall
|
|||||||
# Fine to have missing URLs for unsupported macOS
|
# Fine to have missing URLs for unsupported macOS
|
||||||
macos_req = cask.depends_on.macos
|
macos_req = cask.depends_on.macos
|
||||||
next if macos_req&.version && Array(macos_req.version).none? do |macos_version|
|
next if macos_req&.version && Array(macos_req.version).none? do |macos_version|
|
||||||
current_macos_version.public_send(macos_req.comparator, macos_version)
|
current_macos_version.compare(macos_req.comparator, macos_version)
|
||||||
end
|
end
|
||||||
|
|
||||||
raise "Missing URL" if cask.url.nil?
|
raise "Missing URL" if cask.url.nil?
|
||||||
|
|||||||
@ -56,7 +56,7 @@ class MacOSRequirement < Requirement
|
|||||||
|
|
||||||
satisfy(build_env: false) do
|
satisfy(build_env: false) do
|
||||||
T.bind(self, MacOSRequirement)
|
T.bind(self, MacOSRequirement)
|
||||||
next Array(@version).any? { |v| MacOS.version.public_send(@comparator, v) } if OS.mac? && version_specified?
|
next Array(@version).any? { |v| MacOS.version.compare(@comparator, v) } if OS.mac? && version_specified?
|
||||||
next true if OS.mac?
|
next true if OS.mac?
|
||||||
next true if @version
|
next true if @version
|
||||||
|
|
||||||
|
|||||||
@ -93,6 +93,26 @@ describe Version do
|
|||||||
expect(described_class.create("1.2.3")).to be < described_class.create("1.2.3-p34")
|
expect(described_class.create("1.2.3")).to be < described_class.create("1.2.3-p34")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
specify "compare" do
|
||||||
|
expect(described_class.create("0.1").compare("==", described_class.create("0.1.0"))).to be true
|
||||||
|
expect(described_class.create("0.1").compare("<", described_class.create("0.2"))).to be true
|
||||||
|
expect(described_class.create("1.2.3").compare(">", described_class.create("1.2.2"))).to be true
|
||||||
|
expect(described_class.create("1.2.4").compare("<", described_class.create("1.2.4.1"))).to be true
|
||||||
|
expect(described_class.create("0.1").compare("!=", described_class.create("0.1.0"))).to be false
|
||||||
|
expect(described_class.create("0.1").compare(">=", described_class.create("0.2"))).to be false
|
||||||
|
expect(described_class.create("1.2.3").compare("<=", described_class.create("1.2.2"))).to be false
|
||||||
|
expect(described_class.create("1.2.4").compare(">=", described_class.create("1.2.4.1"))).to be false
|
||||||
|
|
||||||
|
expect(described_class.create("1.2.3").compare(">", described_class.create("1.2.3alpha4"))).to be true
|
||||||
|
expect(described_class.create("1.2.3").compare(">", described_class.create("1.2.3beta2"))).to be true
|
||||||
|
expect(described_class.create("1.2.3").compare(">", described_class.create("1.2.3rc3"))).to be true
|
||||||
|
expect(described_class.create("1.2.3").compare("<", described_class.create("1.2.3-p34"))).to be true
|
||||||
|
expect(described_class.create("1.2.3").compare("<=", described_class.create("1.2.3alpha4"))).to be false
|
||||||
|
expect(described_class.create("1.2.3").compare("<=", described_class.create("1.2.3beta2"))).to be false
|
||||||
|
expect(described_class.create("1.2.3").compare("<=", described_class.create("1.2.3rc3"))).to be false
|
||||||
|
expect(described_class.create("1.2.3").compare(">=", described_class.create("1.2.3-p34"))).to be false
|
||||||
|
end
|
||||||
|
|
||||||
specify "HEAD" do
|
specify "HEAD" do
|
||||||
expect(described_class.create("HEAD")).to be > described_class.create("1.2.3")
|
expect(described_class.create("HEAD")).to be > described_class.create("1.2.3")
|
||||||
expect(described_class.create("HEAD-abcdef")).to be > described_class.create("1.2.3")
|
expect(described_class.create("HEAD-abcdef")).to be > described_class.create("1.2.3")
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "pkg_version"
|
require "pkg_version"
|
||||||
|
require "version/head"
|
||||||
require "version/null"
|
require "version/null"
|
||||||
require "version/parser"
|
require "version/parser"
|
||||||
|
|
||||||
@ -532,6 +533,19 @@ class Version
|
|||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(comparator: String, other: Version).returns(T::Boolean) }
|
||||||
|
def compare(comparator, other)
|
||||||
|
case comparator
|
||||||
|
when ">=" then self >= other
|
||||||
|
when ">" then self > other
|
||||||
|
when "<" then self < other
|
||||||
|
when "<=" then self <= other
|
||||||
|
when "==" then self == other
|
||||||
|
when "!=" then self != other
|
||||||
|
else raise ArgumentError, "Unknown comparator: #{comparator}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
sig { params(other: T.untyped).returns(T.nilable(Integer)) }
|
sig { params(other: T.untyped).returns(T.nilable(Integer)) }
|
||||||
def <=>(other)
|
def <=>(other)
|
||||||
# Needed to retain API compatibility with older string comparisons
|
# Needed to retain API compatibility with older string comparisons
|
||||||
@ -663,34 +677,3 @@ class Version
|
|||||||
version.scan(SCAN_PATTERN).map { |token| Token.create(T.cast(token, String)) }
|
version.scan(SCAN_PATTERN).map { |token| Token.create(T.cast(token, String)) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# A formula's HEAD version.
|
|
||||||
# @see https://docs.brew.sh/Formula-Cookbook#unstable-versions-head Unstable versions (head)
|
|
||||||
#
|
|
||||||
# @api private
|
|
||||||
class HeadVersion < Version
|
|
||||||
extend T::Sig
|
|
||||||
|
|
||||||
sig { returns(T.nilable(String)) }
|
|
||||||
attr_reader :commit
|
|
||||||
|
|
||||||
def initialize(*)
|
|
||||||
super
|
|
||||||
@commit = @version[/^HEAD-(.+)$/, 1]
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { params(commit: T.nilable(String)).void }
|
|
||||||
def update_commit(commit)
|
|
||||||
@commit = commit
|
|
||||||
@version = if commit
|
|
||||||
"HEAD-#{commit}"
|
|
||||||
else
|
|
||||||
"HEAD"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
sig { returns(T::Boolean) }
|
|
||||||
def head?
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|||||||
35
Library/Homebrew/version/head.rb
Normal file
35
Library/Homebrew/version/head.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# typed: true
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Version
|
||||||
|
# A formula's HEAD version.
|
||||||
|
# @see https://docs.brew.sh/Formula-Cookbook#unstable-versions-head Unstable versions (head)
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
class HeadVersion < Version
|
||||||
|
extend T::Sig
|
||||||
|
|
||||||
|
sig { returns(T.nilable(String)) }
|
||||||
|
attr_reader :commit
|
||||||
|
|
||||||
|
def initialize(*)
|
||||||
|
super
|
||||||
|
@commit = @version[/^HEAD-(.+)$/, 1]
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(commit: T.nilable(String)).void }
|
||||||
|
def update_commit(commit)
|
||||||
|
@commit = commit
|
||||||
|
@version = if commit
|
||||||
|
"HEAD-#{commit}"
|
||||||
|
else
|
||||||
|
"HEAD"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
|
def head?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user