Skip to content

Commit 7e498eb

Browse files
authored
Merge pull request #20720 from Homebrew/chore/cask/regex_matrix
chore: switch cask-ci-matrix to cask methods
2 parents ffdb66a + 3919bb3 commit 7e498eb

File tree

1 file changed

+24
-68
lines changed

1 file changed

+24
-68
lines changed

Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

Lines changed: 24 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -115,70 +115,32 @@ def run
115115
end
116116
end
117117

118-
sig { params(cask_content: String).returns(T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float]) }
119-
def filter_runners(cask_content)
120-
# Retrieve arguments from `depends_on macos:`
121-
required_macos = case cask_content
122-
when /depends_on\s+macos:\s+\[([^\]]+)\]/
123-
T.must(Regexp.last_match(1)).scan(/\s*(?:"([=<>]=)\s+)?:([^\s",]+)"?,?\s*/).map do |match|
124-
{
125-
version: T.must(match[1]).to_sym,
126-
comparator: match[0] || "==",
127-
}
128-
end
129-
when /depends_on\s+macos:\s+"?:([^\s"]+)"?/ # e.g. `depends_on macos: :big_sur`
130-
[
131-
{
132-
version: T.must(Regexp.last_match(1)).to_sym,
133-
comparator: "==",
134-
},
135-
]
136-
when /depends_on\s+macos:\s+"([=<>]=)\s+:([^\s"]+)"/ # e.g. `depends_on macos: ">= :monterey"`
137-
[
138-
{
139-
version: T.must(Regexp.last_match(2)).to_sym,
140-
comparator: Regexp.last_match(1),
141-
},
142-
]
143-
when /depends_on\s+macos:/
144-
# In this case, `depends_on macos:` is present but wasn't matched by the
145-
# previous regexes. We want this to visibly fail so we can address the
146-
# shortcoming instead of quietly defaulting to `RUNNERS`.
147-
odie "Unhandled `depends_on macos` argument"
148-
else
149-
[]
118+
sig { params(cask: Cask::Cask).returns(T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float]) }
119+
def filter_runners(cask)
120+
filtered_macos_runners = RUNNERS.select do |runner, _|
121+
cask.depends_on.macos.present? &&
122+
cask.depends_on.macos.allows?(MacOSVersion.from_symbol(T.must(runner[:symbol]).to_sym))
150123
end
151124

152-
filtered_runners = RUNNERS.select do |runner, _|
153-
required_macos.any? do |r|
154-
MacOSVersion.from_symbol(runner.fetch(:symbol).to_sym).compare(
155-
r.fetch(:comparator),
156-
MacOSVersion.from_symbol(r.fetch(:version).to_sym),
157-
)
158-
end
125+
filtered_runners = if filtered_macos_runners.any?
126+
filtered_macos_runners
127+
else
128+
RUNNERS.dup
159129
end
160-
filtered_runners = RUNNERS.dup if filtered_runners.empty?
161130

162-
archs = architectures(cask_content:)
131+
archs = architectures(cask:)
163132
filtered_runners.select! do |runner, _|
164133
archs.include?(runner.fetch(:arch))
165134
end
166135

167-
RUNNERS
136+
filtered_runners
168137
end
169138

170-
sig { params(cask_content: BasicObject).returns(T::Array[Symbol]) }
171-
def architectures(cask_content:)
172-
case cask_content
173-
when /depends_on\s+arch:\s+:arm64/
174-
[:arm]
175-
when /depends_on\s+arch:\s+:x86_64/
176-
[:intel]
177-
when /\barch\b/, /\bon_(arm|intel)\b/
178-
[:arm, :intel]
179-
else
180-
RUNNERS.keys.map { |r| r.fetch(:arch) }.uniq.sort
181-
end
139+
sig { params(cask: Cask::Cask).returns(T::Array[Symbol]) }
140+
def architectures(cask:)
141+
return RUNNERS.keys.map { |r| r.fetch(:arch).to_sym }.uniq.sort if cask.depends_on.arch.blank?
142+
143+
cask.depends_on.arch.map { |arch| arch[:type] }.uniq.sort
182144
end
183145

184146
sig {
@@ -190,16 +152,12 @@ def random_runner(available_runners = ARM_RUNNERS)
190152
.first
191153
end
192154

193-
sig { params(cask_content: String).returns([T::Array[T::Hash[Symbol, T.any(Symbol, String)]], T::Boolean]) }
194-
def runners(cask_content:)
195-
filtered_runners = filter_runners(cask_content)
155+
sig { params(cask: Cask::Cask).returns([T::Array[T::Hash[Symbol, T.any(Symbol, String)]], T::Boolean]) }
156+
def runners(cask:)
157+
filtered_runners = filter_runners(cask)
196158

197-
macos_version_found = cask_content.match?(/\bMacOS\s*\.version\b/m)
198159
filtered_macos_found = filtered_runners.keys.any? do |runner|
199-
(
200-
macos_version_found &&
201-
cask_content.include?(runner[:symbol].inspect)
202-
) || cask_content.include?("on_#{runner[:symbol]}")
160+
cask.to_hash_with_variations["variations"].key?(T.must(runner[:symbol]).to_sym)
203161
end
204162

205163
if filtered_macos_found
@@ -254,11 +212,9 @@ def generate_matrix(tap, labels: [], cask_names: [], skip_install: false, new_ca
254212
cask_files_to_check.flat_map do |path|
255213
cask_token = path.basename(".rb")
256214

257-
audit_args = ["--online"]
215+
audit_args = ["--online", "--signing"]
258216
audit_args << "--new" if T.must(changed_files[:added_files]).include?(path) || new_cask
259217

260-
audit_args << "--signing"
261-
262218
audit_exceptions = []
263219

264220
audit_exceptions << %w[homepage_https_availability] if labels.include?("ci-skip-homepage")
@@ -279,10 +235,10 @@ def generate_matrix(tap, labels: [], cask_names: [], skip_install: false, new_ca
279235

280236
audit_args << "--except" << audit_exceptions.join(",") if audit_exceptions.any?
281237

282-
cask_content = path.read
238+
cask = Cask::CaskLoader.load(path.expand_path)
283239

284-
runners, multi_os = runners(cask_content:)
285-
runners.product(architectures(cask_content:)).filter_map do |runner, arch|
240+
runners, multi_os = runners(cask:)
241+
runners.product(architectures(cask:)).filter_map do |runner, arch|
286242
native_runner_arch = arch == runner.fetch(:arch)
287243
# If it's just a single OS test then we can just use the two real arch runners.
288244
next if !native_runner_arch && !multi_os

0 commit comments

Comments
 (0)