Merge pull request #22556 from Homebrew/cask-ci-matrix-maximum-macos

generate-cask-ci-matrix: respect `maximum_macos` requirement
This commit is contained in:
Mike McQuaid
2026-06-06 06:59:44 +00:00
committed by GitHub
2 changed files with 96 additions and 12 deletions
@@ -129,22 +129,25 @@ module Homebrew
def filter_runners(cask)
filtered_runners = T.let({}, T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float])
if cask.supports_macos?
filtered_macos_runners = RUNNERS.select do |runner, _|
runner[:symbol] != :linux &&
cask.depends_on.macos.present? &&
cask.depends_on.macos.allows?(MacOSVersion.from_symbol(runner.fetch(:symbol).to_sym))
end
# Skip macOS if no runner satisfies the cask's min/max macOS requirements.
macos_requirements = [cask.depends_on.macos, cask.depends_on.maximum_macos]
.compact.select(&:version_specified?)
filtered_runners = if filtered_macos_runners.any?
filtered_macos_runners
else
filtered_runners = if macos_requirements.empty?
MACOS_RUNNERS.dup
else
MACOS_RUNNERS.select do |runner, _|
macos_version = MacOSVersion.from_symbol(runner.fetch(:symbol).to_sym)
macos_requirements.all? { |requirement| requirement.allows?(macos_version) }
end
end
end
macos_archs = architectures(cask:, os: :macos)
filtered_runners.select! do |runner, _|
macos_archs.include?(runner.fetch(:arch))
if filtered_runners.any?
macos_archs = architectures(cask:, os: :macos)
filtered_runners.select! do |runner, _|
macos_archs.include?(runner.fetch(:arch))
end
end
end
return filtered_runners unless cask.supports_linux?
@@ -131,6 +131,63 @@ RSpec.describe Homebrew::DevCmd::GenerateCaskCiMatrix do
app "Test.app"
end
end
let(:c_minimum_macos) do
Cask::Cask.new("test-minimum-macos") do
version "0.0.1,2"
url "https://brew.sh/test-0.0.1.dmg"
name "Test"
desc "Test cask"
homepage "https://brew.sh"
depends_on macos: :sequoia
app "Test.app"
end
end
let(:c_maximum_macos) do
Cask::Cask.new("test-maximum-macos") do
version "0.0.1,2"
url "https://brew.sh/test-0.0.1.dmg"
name "Test"
desc "Test cask"
homepage "https://brew.sh"
depends_on maximum_macos: :sonoma
app "Test.app"
end
end
let(:c_maximum_macos_below_all_runners) do
Cask::Cask.new("test-maximum-macos-below-all-runners") do
version "0.0.1,2"
url "https://brew.sh/test-0.0.1.dmg"
name "Test"
desc "Test cask"
homepage "https://brew.sh"
depends_on maximum_macos: :ventura
app "Test.app"
end
end
let(:c_minimum_and_maximum_macos) do
Cask::Cask.new("test-minimum-and-maximum-macos") do
version "0.0.1,2"
url "https://brew.sh/test-0.0.1.dmg"
name "Test"
desc "Test cask"
homepage "https://brew.sh"
depends_on macos: :sonoma
depends_on maximum_macos: :sequoia
app "Test.app"
end
end
let(:c_linux) do
Cask::Cask.new("test-linux") do
version "0.0.1,2"
@@ -218,6 +275,30 @@ RSpec.describe Homebrew::DevCmd::GenerateCaskCiMatrix do
end
end
context "when cask has a macOS version requirement" do
it "filters macOS runners by the minimum and maximum macOS requirements" do
expect(generate_matrix.filter_runners(c_minimum_macos))
.to eq({
{ arch: :arm, name: "macos-15", symbol: :sequoia } => 0.0,
{ arch: :arm, name: "macos-26", symbol: :tahoe } => 1.0,
{ arch: :intel, name: "macos-15-intel", symbol: :sequoia } => 1.0,
})
expect(generate_matrix.filter_runners(c_maximum_macos))
.to eq({ { arch: :arm, name: "macos-14", symbol: :sonoma } => 0.0 })
expect(generate_matrix.filter_runners(c_minimum_and_maximum_macos))
.to eq({
{ arch: :arm, name: "macos-14", symbol: :sonoma } => 0.0,
{ arch: :arm, name: "macos-15", symbol: :sequoia } => 0.0,
{ arch: :intel, name: "macos-15-intel", symbol: :sequoia } => 1.0,
})
# A requirement excluding all runners must skip macOS, not test them all.
expect(generate_matrix.filter_runners(c_maximum_macos_below_all_runners)).to eq({})
end
end
context "when cask only supports Linux" do
it "returns an array including all Linux" do
expect(generate_matrix.filter_runners(c_linux))