From 2d00e50071bc121bf408ec9690d304a233dda0c3 Mon Sep 17 00:00:00 2001 From: Eric Knibbe Date: Mon, 3 Jun 2024 12:33:00 -0400 Subject: [PATCH] cask: skip variations for inapplicable versions --- Library/Homebrew/cask/cask.rb | 1 + Library/Homebrew/macos_version.rb | 5 +++++ Library/Homebrew/requirements/macos_requirement.rb | 13 +++++++++++++ Library/Homebrew/test/macos_version_spec.rb | 4 ++++ .../test/requirements/macos_requirement_spec.rb | 13 +++++++++++++ 5 files changed, 36 insertions(+) diff --git a/Library/Homebrew/cask/cask.rb b/Library/Homebrew/cask/cask.rb index 14e6885a70..49d802dde3 100644 --- a/Library/Homebrew/cask/cask.rb +++ b/Library/Homebrew/cask/cask.rb @@ -440,6 +440,7 @@ module Cask MacOSVersion::SYMBOLS.keys.product(OnSystem::ARCH_OPTIONS).each do |os, arch| bottle_tag = ::Utils::Bottles::Tag.new(system: os, arch:) next unless bottle_tag.valid_combination? + next if depends_on.macos && !depends_on.macos.allows?(bottle_tag.to_macos_version) Homebrew::SimulateSystem.with(os:, arch:) do refresh diff --git a/Library/Homebrew/macos_version.rb b/Library/Homebrew/macos_version.rb index 649b55bcdd..9fad6cd119 100644 --- a/Library/Homebrew/macos_version.rb +++ b/Library/Homebrew/macos_version.rb @@ -100,6 +100,11 @@ class MacOSVersion < Version pretty_name end + sig { returns(String) } + def inspect + "#<#{self.class.name}: #{to_s.inspect}>" + end + sig { returns(T::Boolean) } def outdated_release? self < HOMEBREW_MACOS_OLDEST_SUPPORTED diff --git a/Library/Homebrew/requirements/macos_requirement.rb b/Library/Homebrew/requirements/macos_requirement.rb index db0538aff7..a407559d49 100644 --- a/Library/Homebrew/requirements/macos_requirement.rb +++ b/Library/Homebrew/requirements/macos_requirement.rb @@ -61,6 +61,19 @@ class MacOSRequirement < Requirement false end + def allows?(other) + return true unless version_specified? + + case @comparator + when ">=" then other >= @version + when "<=" then other <= @version + else + return @version.include?(other) if @version.respond_to?(:to_ary) + + @version == other + end + end + def message(type: :formula) return "macOS is required for this software." unless version_specified? diff --git a/Library/Homebrew/test/macos_version_spec.rb b/Library/Homebrew/test/macos_version_spec.rb index e4de970bd5..826059ecb9 100644 --- a/Library/Homebrew/test/macos_version_spec.rb +++ b/Library/Homebrew/test/macos_version_spec.rb @@ -80,6 +80,10 @@ RSpec.describe MacOSVersion do expect(described_class.new("10.14").pretty_name).to eq("Mojave") end + specify "#inspect" do + expect(described_class.new("11").inspect).to eq("#") + end + specify "#requires_nehalem_cpu?", :needs_macos do expect(Hardware::CPU).to receive(:type).at_least(:twice).and_return(:intel) expect(described_class.new("10.14").requires_nehalem_cpu?).to be true diff --git a/Library/Homebrew/test/requirements/macos_requirement_spec.rb b/Library/Homebrew/test/requirements/macos_requirement_spec.rb index 5d81012193..d18e95fece 100644 --- a/Library/Homebrew/test/requirements/macos_requirement_spec.rb +++ b/Library/Homebrew/test/requirements/macos_requirement_spec.rb @@ -5,6 +5,8 @@ require "requirements/macos_requirement" RSpec.describe MacOSRequirement do subject(:requirement) { described_class.new } + let(:big_sur_major) { MacOSVersion.new("11.0") } + describe "#satisfied?" do it "returns true on macOS" do expect(requirement.satisfied?).to eq OS.mac? @@ -20,4 +22,15 @@ RSpec.describe MacOSRequirement do expect(requirement.satisfied?).to eq MacOS.version <= :catalina end end + + specify "#allows?" do + max_requirement = described_class.new([:mojave], comparator: "<=") + min_requirement = described_class.new([:catalina], comparator: ">=") + exact_requirement = described_class.new([:big_sur], comparator: "==") + range_requirement = described_class.new([[:monterey, :big_sur]], comparator: "==") + expect(max_requirement.allows?(big_sur_major)).to be false + expect(min_requirement.allows?(big_sur_major)).to be true + expect(exact_requirement.allows?(big_sur_major)).to be true + expect(range_requirement.allows?(big_sur_major)).to be true + end end