@@ -139,21 +139,43 @@ def filter_runners(cask)
139139 RUNNERS . dup
140140 end
141141
142- filtered_runners = filtered_runners . merge ( LINUX_RUNNERS ) if cask . supports_linux?
143-
144- archs = architectures ( cask :)
142+ macos_archs = architectures ( cask :, os : :macos )
145143 filtered_runners . select! do |runner , _ |
146- archs . include? ( runner . fetch ( :arch ) )
144+ macos_archs . include? ( runner . fetch ( :arch ) )
147145 end
148146
149- filtered_runners
147+ return filtered_runners unless cask . supports_linux?
148+
149+ linux_archs = architectures ( cask :, os : :linux )
150+ linux_runners = LINUX_RUNNERS . select do |runner , _ |
151+ linux_archs . include? ( runner . fetch ( :arch ) )
152+ end
153+
154+ filtered_runners . merge ( linux_runners )
150155 end
151156
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?
157+ private
158+
159+ sig { params ( cask : Cask ::Cask , os : Symbol ) . returns ( T ::Array [ Symbol ] ) }
160+ def architectures ( cask :, os :)
161+ architectures = T . let ( [ ] , T ::Array [ Symbol ] )
162+ [ :arm , :intel ] . each do |arch |
163+ tag = Utils ::Bottles ::Tag . new ( system : os , arch : arch )
164+ Homebrew ::SimulateSystem . with_tag ( tag ) do
165+ cask . refresh
166+
167+ if cask . depends_on . arch . blank?
168+ architectures = RUNNERS . keys . map { |r | r . fetch ( :arch ) . to_sym } . uniq . sort
169+ next
170+ end
171+
172+ architectures = cask . depends_on . arch . map { |arch | arch [ :type ] }
173+ end
174+ rescue ::Cask ::CaskInvalidError
175+ # Can't read cask for this system-arch combination.
176+ end
155177
156- cask . depends_on . arch . map { | arch | arch [ :type ] } . uniq . sort
178+ architectures
157179 end
158180
159181 sig {
@@ -251,11 +273,11 @@ def generate_matrix(tap, labels: [], cask_names: [], skip_install: false, new_ca
251273 cask = Cask ::CaskLoader . load ( path . expand_path )
252274
253275 runners , multi_os = runners ( cask :)
254- runners . product ( architectures ( cask :) ) . filter_map do |runner , arch |
276+ runners . product ( architectures ( cask :, os : :macos ) ) . filter_map do |runner , arch |
255277 native_runner_arch = arch == runner . fetch ( :arch )
256- # we don't need to run simulated archs on Linux
278+ # we don't need to run simulated archs on Linux or macOS Sequoia
279+ # because they exist as real GitHub hosted runner
257280 next if runner . fetch ( :symbol ) == :linux && !native_runner_arch
258- # we don't need to run simulated archs on macOS
259281 next if runner . fetch ( :symbol ) == :sequoia && !native_runner_arch
260282
261283 # If it's just a single OS test then we can just use the two real arch runners.
0 commit comments