Skip to content

Commit

Permalink
add generate-cask-ci-matrix command
Browse files Browse the repository at this point in the history
  • Loading branch information
bevanjkay committed Nov 11, 2024
1 parent 254bf3f commit 280b1ad
Show file tree
Hide file tree
Showing 3 changed files with 400 additions and 0 deletions.
351 changes: 351 additions & 0 deletions Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,351 @@
# typed: strict
# frozen_string_literal: true

require "abstract_command"
require "tap"
require "utils/github/api"
require "cli/parser"
require "system_command"

module Homebrew
module DevCmd
class GenerateCaskCiMatrix < AbstractCommand
MAX_JOBS = 256

# Weight for each arch must add up to 1.0.
INTEL_RUNNERS = T.let({
{ symbol: :ventura, name: "macos-13", arch: :intel } => 1.0,
}.freeze, T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float])
ARM_RUNNERS = T.let({
{ symbol: :sonoma, name: "macos-14", arch: :arm } => 0.0,
{ symbol: :sequoia, name: "macos-15", arch: :arm } => 1.0,
}.freeze, T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float])
RUNNERS = T.let(INTEL_RUNNERS.merge(ARM_RUNNERS).freeze,
T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float])

cmd_args do
description <<~EOS
Generate a GitHub Actions matrix for a given pull request URL or list of cask names.
For internal use in Homebrew taps.
EOS

switch "--url",
description: "Treat named argument as a pull request URL."
switch "--cask", "--casks",
description: "Treat all named arguments as cask tokens."
switch "--skip-install",
description: "Skip installing casks"
switch "--new",
description: "Run new cask checks"
switch "--syntax-only",
description: "Only run syntax checks"

conflicts "--url", "--cask"
conflicts "--syntax-only", "--skip-install"
conflicts "--syntax-only", "--new"

named_args [:cask, :url], min: 1
hide_from_man_page!
end

sig { params(args: T::Array[String]).void }
def initialize(*args)
super
repository = ENV.fetch("GITHUB_REPOSITORY", nil)
raise UsageError, "The GITHUB_REPOSITORY environment variable must be set." if repository.blank?

@tap = T.let(Tap.fetch(repository), Tap)
end

sig { override.void }
def run
skip_install = args.skip_install?
new_cask = args.new?
casks = args.named if args.casks?
pr_url = args.named if args.url?
syntax_only = args.syntax_only?
tap = @tap

puts "Generating matrix for #{casks}..."

raise UsageError, "This command must be run from inside a tap directory." if Dir.pwd.to_s != tap.path.to_s

labels = if pr_url

Check warning on line 73 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L73 was not covered by tests
pr = GitHub::API.open_rest(pr_url)
pr.fetch("labels").map { |l| l.fetch("name") }

Check warning on line 75 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L75 was not covered by tests
else
[]
end

runner = random_runner[:name]

Check warning on line 80 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L80 was not covered by tests
syntax_job = {
name: "syntax",

Check warning on line 82 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L82 was not covered by tests
tap: tap.name,
runner:,
}

matrix = [syntax_job]

Check warning on line 87 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L87 was not covered by tests

if !syntax_only && !labels&.include?("ci-syntax-only")
cask_jobs = if casks&.any?
generate_matrix(tap, labels:, cask_names: casks, skip_install:, new_cask:)
else
generate_matrix(tap, labels:, skip_install:, new_cask:)
end

if cask_jobs.any?
# If casks were changed, skip `audit` for whole tap.
syntax_job[:skip_audit] = true

# The syntax job only runs `style` at this point, which should work on Linux.
# Running on macOS is currently faster though, since `homebrew/cask` and
# `homebrew/core` are already tapped on macOS CI machines.
# syntax_job[:runner] = "ubuntu-latest"
end

matrix += cask_jobs

Check warning on line 106 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L106 was not covered by tests
end

syntax_job[:name] += " (#{syntax_job[:runner]})"

Check warning on line 109 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L109 was not covered by tests

puts JSON.pretty_generate(matrix)
github_output = ENV.fetch("GITHUB_OUTPUT", nil)

Check warning on line 112 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L111 - L112 were not covered by tests
return unless github_output

File.open(ENV.fetch("GITHUB_OUTPUT"), "a") do |f|
f.puts "matrix=#{JSON.generate(matrix)}"

Check warning on line 116 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L115 - L116 were not covered by tests
end
end

sig { params(cask_content: String).returns(T::Hash[T::Hash[Symbol, T.any(Symbol, String)], Float]) }
def filter_runners(cask_content)
# Retrieve arguments from `depends_on macos:`
required_macos = case cask_content

Check warning on line 123 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L123 was not covered by tests
when /depends_on\s+macos:\s+\[([^\]]+)\]/
T.must(Regexp.last_match(1)).scan(/\s*(?:"([=<>]=)\s+)?:([^\s",]+)"?,?\s*/).map do |match|
{
version: T.must(match[1]).to_sym,

Check warning on line 127 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L127 was not covered by tests
comparator: match[0] || "==",
}
end
when /depends_on\s+macos:\s+"?:([^\s"]+)"?/ # e.g. `depends_on macos: :big_sur`
[
{
version: T.must(Regexp.last_match(1)).to_sym,

Check warning on line 134 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L134 was not covered by tests
comparator: "==",
},
]
when /depends_on\s+macos:\s+"([=<>]=)\s+:([^\s"]+)"/ # e.g. `depends_on macos: ">= :monterey"`
[
{
version: T.must(Regexp.last_match(2)).to_sym,

Check warning on line 141 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L141 was not covered by tests
comparator: Regexp.last_match(1),
},
]
when /depends_on\s+macos:/
# In this case, `depends_on macos:` is present but wasn't matched by the
# previous regexes. We want this to visibly fail so we can address the
# shortcoming instead of quietly defaulting to `RUNNERS`.
odie "Unhandled `depends_on macos` argument"
else
[]
end

filtered_runners = RUNNERS.select do |runner, _|
required_macos.any? do |r|
MacOSVersion.from_symbol(runner.fetch(:symbol).to_sym).compare(

Check warning on line 156 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L154 - L156 were not covered by tests
r.fetch(:comparator),
MacOSVersion.from_symbol(r.fetch(:version).to_sym),
)
end
end
filtered_runners = RUNNERS.dup if filtered_runners.empty?

archs = architectures(cask_content:)
filtered_runners.select! do |runner, _|
archs.include?(runner.fetch(:arch))

Check warning on line 166 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L164 - L166 were not covered by tests
end

RUNNERS

Check warning on line 169 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L169 was not covered by tests
end

sig { params(cask_content: BasicObject).returns(T::Array[Symbol]) }
def architectures(cask_content:)
case cask_content

Check warning on line 174 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L174 was not covered by tests
when /depends_on\s+arch:\s+:arm64/
[:arm]
when /depends_on\s+arch:\s+:x86_64/
[:intel]
when /\barch\b/, /\bon_(arm|intel)\b/
[:arm, :intel]
else
RUNNERS.keys.map { |r| r.fetch(:arch) }.uniq.sort
end
end

sig {
params(available_runners: T::Hash[T::Hash[Symbol, T.any(Symbol, String)],

Check warning on line 187 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L187 was not covered by tests
Float]).returns(T::Hash[Symbol, T.any(Symbol, String)])
}
def random_runner(available_runners = ARM_RUNNERS)
T.must(available_runners.max_by { |(_, weight)| rand ** (1.0 / weight) })

Check warning on line 191 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L191 was not covered by tests
.first
end

sig { params(cask_content: String).returns([T::Array[T::Hash[Symbol, T.any(Symbol, String)]], T::Boolean]) }
def runners(cask_content:)
filtered_runners = filter_runners(cask_content)

Check warning on line 197 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L197 was not covered by tests

macos_version_found = cask_content.match?(/\bMacOS\s*\.version\b/m)
filtered_macos_found = filtered_runners.keys.any? do |runner|

Check warning on line 200 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L199 - L200 were not covered by tests
(
macos_version_found &&

Check warning on line 202 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L202 was not covered by tests
cask_content.include?(runner[:symbol].inspect)
) || cask_content.include?("on_#{runner[:symbol]}")
end

if filtered_macos_found

Check warning on line 207 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L207 was not covered by tests
# If the cask varies on a MacOS version, test it on every possible macOS version.
[filtered_runners.keys, true]
else
# Otherwise, select a runner from each architecture based on weighted random sample.
grouped_runners = filtered_runners.group_by { |runner, _| runner.fetch(:arch) }
selected_runners = grouped_runners.map do |_, runners|
random_runner(runners.to_h)

Check warning on line 214 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L213 - L214 were not covered by tests
end
[selected_runners, false]

Check warning on line 216 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L216 was not covered by tests
end
end

sig {
params(tap: T.nilable(Tap), labels: T::Array[String], cask_names: T::Array[String], skip_install: T::Boolean,

Check warning on line 221 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L221 was not covered by tests
new_cask: T::Boolean).returns(T::Array[T::Hash[Symbol,
T.any(String, T::Boolean, T::Array[String])]])
}
def generate_matrix(tap, labels: [], cask_names: [], skip_install: false, new_cask: false)
odie "This command must be run from inside a tap directory." unless tap

changed_files = find_changed_files

Check warning on line 228 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L228 was not covered by tests

ruby_files_in_wrong_directory =
T.must(changed_files[:modified_ruby_files]) - (
T.must(changed_files[:modified_cask_files]) +

Check warning on line 232 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L231 - L232 were not covered by tests
T.must(changed_files[:modified_command_files]) +
T.must(changed_files[:modified_github_actions_files])
)

if ruby_files_in_wrong_directory.any?
ruby_files_in_wrong_directory.each do |path|
puts "::error file=#{path}::File is in wrong directory."

Check warning on line 239 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L239 was not covered by tests
end

odie "Found Ruby files in wrong directory:\n#{ruby_files_in_wrong_directory.join("\n")}"

Check warning on line 242 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L242 was not covered by tests
end

cask_files_to_check = if cask_names.any?

Check warning on line 245 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L245 was not covered by tests
cask_names.map do |cask_name|
Cask::CaskLoader.find_cask_in_tap(cask_name, tap).relative_path_from(tap.path)

Check warning on line 247 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L247 was not covered by tests
end
else
T.must(changed_files[:modified_cask_files])
end

jobs = cask_files_to_check.count

Check warning on line 253 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L253 was not covered by tests
odie "Maximum job matrix size exceeded: #{jobs}/#{MAX_JOBS}" if jobs > MAX_JOBS

cask_files_to_check.flat_map do |path|
cask_token = path.basename(".rb")

Check warning on line 257 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L256 - L257 were not covered by tests

audit_args = ["--online"]

Check warning on line 259 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L259 was not covered by tests
audit_args << "--new" if T.must(changed_files[:added_files]).include?(path) || new_cask

audit_args << "--signing"

Check warning on line 262 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L262 was not covered by tests

audit_exceptions = []

Check warning on line 264 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L264 was not covered by tests

audit_exceptions << %w[homepage_https_availability] if labels.include?("ci-skip-homepage")

if labels.include?("ci-skip-livecheck")
audit_exceptions << %w[hosting_with_livecheck livecheck_https_availability
livecheck_min_os livecheck_version]
end

audit_exceptions << "livecheck_min_os" if labels.include?("ci-skip-livecheck-min-os")

if labels.include?("ci-skip-repository")
audit_exceptions << %w[github_repository github_prerelease_version
gitlab_repository gitlab_prerelease_version
bitbucket_repository]
end

if labels.include?("ci-skip-token")
audit_exceptions << %w[token_conflicts token_valid
token_bad_words]
end

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

cask_content = path.read

Check warning on line 288 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L288 was not covered by tests

runners, multi_os = runners(cask_content:)
runners.product(architectures(cask_content:)).filter_map do |runner, arch|
native_runner_arch = arch == runner.fetch(:arch)

Check warning on line 292 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L290 - L292 were not covered by tests
# If it's just a single OS test then we can just use the two real arch runners.
next if !native_runner_arch && !multi_os

arch_args = native_runner_arch ? [] : ["--arch=#{arch}"]
{
name: "test #{cask_token} (#{runner.fetch(:name)}, #{arch})",

Check warning on line 298 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L298 was not covered by tests
tap: tap.name,
cask: {
token: cask_token,
path: "./#{path}",
},
audit_args: audit_args + arch_args,
fetch_args: arch_args,
skip_install: labels.include?("ci-skip-install") || !native_runner_arch || skip_install,
runner: runner.fetch(:name),
}
end
end
end

sig { returns(T::Hash[Symbol, T::Array[String]]) }
def find_changed_files
tap = @tap

Check warning on line 315 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L315 was not covered by tests

commit_range_start = Utils.safe_popen_read("git", "rev-parse", "origin").chomp
commit_range_end = Utils.safe_popen_read("git", "rev-parse", "HEAD").chomp
commit_range = "#{commit_range_start}...#{commit_range_end}"

Check warning on line 319 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L317 - L319 were not covered by tests

modified_files = Utils.safe_popen_read("git", "diff", "--name-only", "--diff-filter=AMR", commit_range)

Check warning on line 321 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L321 was not covered by tests
.split("\n")
.map do |path|
Pathname(path)

Check warning on line 324 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L324 was not covered by tests
end

added_files = Utils.safe_popen_read("git", "diff", "--name-only", "--diff-filter=A", commit_range)

Check warning on line 327 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L327 was not covered by tests
.split("\n")
.map do |path|
Pathname(path)

Check warning on line 330 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L330 was not covered by tests
end

modified_ruby_files = modified_files.select { |path| path.extname == ".rb" }
modified_command_files = modified_files.select { |path| path.ascend.to_a.last.to_s == "cmd" }
modified_github_actions_files = modified_files.select do |path|
path.to_s.start_with?(".github/actions/")

Check warning on line 336 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L333 - L336 were not covered by tests
end
modified_cask_files = modified_files.select { |path| tap.cask_file?(path.to_s) }

Check warning on line 338 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L338 was not covered by tests

{
modified_files:,

Check warning on line 341 in Library/Homebrew/dev-cmd/generate-cask-ci-matrix.rb

View check run for this annotation

Codecov / codecov/patch

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

Added line #L341 was not covered by tests
added_files:,
modified_ruby_files:,
modified_command_files:,
modified_github_actions_files:,
modified_cask_files:,
}
end
end
end
end

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 280b1ad

Please sign in to comment.