|
9 | 9 |
|
10 | 10 | module Homebrew |
11 | 11 | module DevCmd |
| 12 | + # Generates a GitHub Actions CI matrix for Casks. |
| 13 | + # @api private |
12 | 14 | class GenerateCaskCiMatrix < AbstractCommand |
13 | 15 | MAX_JOBS = 256 |
14 | 16 |
|
@@ -127,33 +129,71 @@ def run |
127 | 129 |
|
128 | 130 | sig { params(cask: Cask::Cask).returns(T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float]) } |
129 | 131 | def filter_runners(cask) |
130 | | - filtered_macos_runners = RUNNERS.select do |runner, _| |
131 | | - runner[:symbol] != :linux && |
| 132 | + filtered_runners = if cask.supports_macos? |
| 133 | + filtered_macos_runners = MACOS_RUNNERS.select do |runner, _| |
132 | 134 | cask.depends_on.macos.present? && |
133 | | - cask.depends_on.macos.allows?(MacOSVersion.from_symbol(T.must(runner[:symbol]).to_sym)) |
134 | | - end |
| 135 | + cask.depends_on.macos.allows?(MacOSVersion.from_symbol(T.must(runner[:symbol]).to_sym)) |
| 136 | + end |
| 137 | + |
| 138 | + return MACOS_RUNNERS.dup if filtered_macos_runners.none? |
135 | 139 |
|
136 | | - filtered_runners = if filtered_macos_runners.any? |
137 | 140 | filtered_macos_runners |
138 | | - else |
139 | | - RUNNERS.dup |
140 | 141 | end |
141 | 142 |
|
142 | | - filtered_runners = filtered_runners.merge(LINUX_RUNNERS) if cask.supports_linux? |
| 143 | + filtered_runners = T.must(filtered_runners) |
143 | 144 |
|
144 | 145 | archs = architectures(cask:) |
| 146 | + odebug "Architectures macOS: #{archs}" if archs.any? |
145 | 147 | filtered_runners.select! do |runner, _| |
146 | 148 | archs.include?(runner.fetch(:arch)) |
147 | 149 | end |
148 | 150 |
|
| 151 | + odebug "Filtered runners: #{filtered_runners.keys.map { |r| r[:name] }}" if filtered_runners.any? |
| 152 | + if cask.supports_linux? |
| 153 | + filtered_linux_runners = LINUX_RUNNERS.dup |
| 154 | + |
| 155 | + archs = architectures(cask:, os: :linux, arch: :intel) |
| 156 | + filtered_linux_runners.select! do |runner, _| |
| 157 | + archs.include?(runner.fetch(:arch)) |
| 158 | + end |
| 159 | + |
| 160 | + filtered_runners.merge!(filtered_linux_runners) |
| 161 | + end |
| 162 | + |
| 163 | + odebug "Architectures linux: #{archs}" if archs.any? |
| 164 | + odebug "Filtered runners: #{filtered_runners.keys.map { |r| r[:name] }}" if filtered_runners.any? |
| 165 | + |
149 | 166 | filtered_runners |
150 | 167 | end |
151 | 168 |
|
152 | | - sig { params(cask: Cask::Cask).returns(T::Array[Symbol]) } |
153 | | - def architectures(cask:) |
154 | | - return RUNNERS.keys.map { |r| r.fetch(:arch).to_sym }.uniq.sort if cask.depends_on.arch.blank? |
| 169 | + sig { params(cask: Cask::Cask, os: Symbol, arch: Symbol).returns(T::Array[Symbol]) } |
| 170 | + def architectures(cask:, os: :macos, arch: :arm) |
| 171 | + architectures = T.let([], T.untyped) |
| 172 | + begin |
| 173 | + tag = Utils::Bottles::Tag.new(system: os, arch: arch) |
| 174 | + Homebrew::SimulateSystem.with_tag(tag) do |
| 175 | + cask.refresh |
| 176 | + |
| 177 | + if cask.depends_on.arch.blank? |
| 178 | + # If the Cask does not define a general architecture requirement, |
| 179 | + # check if there is one specific to Linux. |
| 180 | + architectures = if (linux_archs = Homebrew::SimulateSystem.with(os: :linux) do |
| 181 | + Cask::CaskLoader.load(cask.sourcefile_path).depends_on.arch |
| 182 | + end) |
| 183 | + linux_archs.map { |a| a[:type] }.uniq.sort |
| 184 | + else |
| 185 | + RUNNERS.keys.map { |r| r.fetch(:arch).to_sym }.uniq.sort |
| 186 | + end |
| 187 | + next |
| 188 | + end |
| 189 | + |
| 190 | + architectures = cask.depends_on.arch.map { |arch| arch[:type] } |
| 191 | + end |
| 192 | + rescue ::Cask::CaskInvalidError |
| 193 | + # Can't read cask for this system-arch combination. |
| 194 | + end |
155 | 195 |
|
156 | | - cask.depends_on.arch.map { |arch| arch[:type] }.uniq.sort |
| 196 | + architectures |
157 | 197 | end |
158 | 198 |
|
159 | 199 | sig { |
@@ -255,7 +295,7 @@ def generate_matrix(tap, labels: [], cask_names: [], skip_install: false, new_ca |
255 | 295 | native_runner_arch = arch == runner.fetch(:arch) |
256 | 296 | # we don't need to run simulated archs on Linux |
257 | 297 | next if runner.fetch(:symbol) == :linux && !native_runner_arch |
258 | | - # we don't need to run simulated archs on macOS |
| 298 | + # we don't need to run simulated archs on macOS Sequoia |
259 | 299 | next if runner.fetch(:symbol) == :sequoia && !native_runner_arch |
260 | 300 |
|
261 | 301 | # If it's just a single OS test then we can just use the two real arch runners. |
|
0 commit comments